【发布时间】:2022-01-09 13:45:48
【问题描述】:
我已经使用生成实现了一个(工作的)波纹进位加法器,以创建 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
但是,我在 assign adders[0].cin = cin; 和 @987654326 行上收到了来自 Verilator 的 ASSIGNIN 错误(文档显示“正在对输入信号进行分配错误。这几乎可以肯定是一个错误,尽管在技术上是合法的。”) @。我有两个问题:
- 我在这里做错了什么,我该如何解决?该错误对我来说没有意义,因为两个分配方程的左侧都是子模块的输入,而不是
ripple_adder16模块的参数。 - 我想用下面的行
assign adders[15:1].cin = adders[14:0].cout;替换for 循环,尽管这本身就是一个语法错误。有没有办法在不直接内联full_adder的情况下做这样的事情?
谢谢!
PS。如果相关,full_adder 完全用电线实现。
【问题讨论】: