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语言的写法, 缺点是位置不能变化。

按名称例化, 例化时书写比较多, 优点是顺序可以任意更改。

 

两种方法都是可以使用的, 建议初学者使用名称例化, 虽然书写比较多, 但保证正确还是比较关键的, 尤其是端口 数量比较多的情况。