Verilog 语法中,关于模块例化有两种方法,一种是位置相关, 另外一种是名称相关
verilog 语言中形成一个模块:
module module_name
(
input a,
input b,
output c,
input [31:0] d,
output [7:0] e,
.....
inout x
);
verilog 语法
...
endmodule
verilog 语言中模块:
1)包括 module + 模块名称, ( ….. ); 在 ()中包括相关的输入(input),输出(output), 输入输出(inout) 端口, 注意,最后一个端口没有’ ,’
2) 模块中相关的verilog 语法
3) endmodule
举例:
module add
(
input [3:0] a,
input [3:0] b,
output [4:0] c
);
assign c = a + b;
endmodule
在使用这个模块时(模块例化),我们有两种方法例化, 1)按位置例化, 2)按名称例化。
按位置例化
1)例化时,需要所有的参数顺序必须和模块本身的顺序一致
2)例化时,只要写端口名字即可。
按名称例化
1)必须指定当前例化的端口名称
2)例化时,端口的顺序可以自由排序,不一定和模块本身的顺序相同
举例:
// 按位置例化 add 模块
wire [3:0] x1;
wire [3:0] x2;
wire [4:0] x3;
// 希望 x3 = x1 + x2;
add add_inst1
(
x1, //对应 模块本身的a
x2, //对应 模块本身的b
x3 //对应 模块本身的c
);
下面的例化(add_inst1)是不正确的,大家要注意, 没有按照模块本身的顺序进行例化。
add add_inst1
(
x2, //对应 模块本身的a
x3, //对应 模块本身的b
x1 //对应 模块本身的c
);
// 按名称例化 add 模块
wire [3:0] x1;
wire [3:0] x2;
wire [4:0] x3;
add add_inst3
(
.a (x1),
.b (x2),
.c (x3)
);
按照名称例化 , 虽然传递的顺序和 模块本身不一致, 但依然可以被正确使用
add add_inst4
(
.b (x2),
.c (x3),
.a (x1)
);
总结:
按位置例化, 例化时书写比较简单,非常类似与c语言的写法, 缺点是位置不能变化。
按名称例化, 例化时书写比较多, 优点是顺序可以任意更改。
两种方法都是可以使用的, 建议初学者使用名称例化, 虽然书写比较多, 但保证正确还是比较关键的, 尤其是端口 数量比较多的情况。