我已经使用生成实现了一个(工作的)波纹进位加法器来创建 16 个不同full_adder
的实例(full_adder
按预期工作):
module ripple_adder16 (a, b, cin, sum, cout);
input [15:0] a, b; input cin;
output [15:0] sum; output cout;
wire [15:0] a, b; wire [15:0] sum; wire cout;
// intermediate nets.
// Since the carries cascade, we have to tell
// verilator that it can't "flatten" or whatever.
/* verilator lint_off UNOPTFLAT */
wire [16:0] carries;
/* verilator lint_on UNOPTFLAT */
assign carries[0] = cin;
assign cout = carries[16]; // output.
genvar i;
generate for(i=0; i < 16; i = i + 1)
begin
full_adder adder (
.a(a[i]),
.b(b[i]),
.sum(sum[i]),
.cin(carries[i]),
.cout(carries[i+1])
);
end
endgenerate
endmodule
现在我正在尝试修改加法器,以便我可以保留一组加法器。下面是我试图开始工作的代码示例:
input [15:0] a, b; input cin;
output [15:0] sum; output cout;
wire [15:0] a, b; wire [15:0] sum; wire cout;
full_adder adders [15:0] (
.a(a),
.b(b),
.cin(),
.sum(sum), // output.
.cout()
);
// DIFFERENCES START HERE
assign adders[0].cin = cin;
assign cout = adders[15].cout; // output.
genvar i;
generate
for(i=0; i < 15; i = i + 1)
assign adders[i+1].cin = adders[i].cout;
endgenerate
// DIFFERENCES END HERE
endmodule
但是,我从 Verilator 收到了一个 ASSIGNIN 错误(文档说“正在对输入信号进行分配错误。这几乎可以肯定是一个错误,尽管在技术上是合法的。”)在行assign adders[0].cin = cin;
和assign adders[i+1].cin = adders[i].cout;
. 我有两个问题:
- 我在这里做错了什么,我该如何解决?该错误对我来说没有意义,因为两个分配方程的左侧都是子模块的输入,而不是模块的参数
ripple_adder16
。 - 我想理想地用以下行替换 for 循环
assign adders[15:1].cin = adders[14:0].cout;
,尽管这本身就是一个语法错误。有没有办法在没有直接内联的情况下做这样的事情full_adder
?
谢谢!
PS。如果相关,full_adder
则完全用电线实现。