错误代码:
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire c ;
add16 u1 ( .cin(1'b0) ,
.a[15:0](a[15:0]) ,
.b[15:0](b[15:0]) ,
.sum[15:0](sum[15:0]) ,
.cout(c)
);
add16 u2 ( .cin(c) ,
.a[15:0](a[31:16]) ,
.b[15:0](b[31:16]) ,
.sum[15:0](sum[31:16]) ,
.cout()
) ;
endmodule
正确代码:
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire c;
add16 u1( .cin(0),
.a(a[15:0]),
.b(b[15:0]),
.sum(sum[15:0]),
.cout(c)
);
add16 u2( .cin(c) ,
.a(a[31:16]) ,
.b(b[31:16]) ,
.sum(sum[31:16]) ,
.cout()
);
endmodule
总结:
基于前几题和这题的经验,模块的例化类似于C语言等高级语言的函数的引用,但是又有不同。
在我的理解里,verilog中的例化是对电路的组合,例化实际上是在做接线的工作。为了实现要求的功能,例化一个个更小特定功能的模块。
例化时,括号外为例化模块端口名(不需要声明位宽),括号内为需要传递的参数,此时如果是向量形式的参数需要声明数据位置。