【发布时间】:2021-03-06 06:24:22
【问题描述】:
我想知道是否可以在 verilog 中创建一个 n 位进位超前加法器。在 cmets 的帮助下,我能够走到这一步
module nbit_lookahead(x, y, cin, cout, s);
parameter n = 1;
integer i;
integer j;
input wire [n:0] x, y, cin;
output wire [n:0] cout, s;
wire [n:0] g, p;
reg cpp, gp;
generate
cpp = 1; // ERROR HERE -- Line 25
gpp = 1;
for(i = 0; i < n; i=i+1) begin : outer_loop
assign p[i] = x[i] | y[i];
assign g[i] = x[i] & y[i];
assign s[i] = cin[i]^x[i]^y[i];
for(j = i - 1; j >= 0; j=j-1) begin : inner_loop
cpp &= (cin[j] & p[j] & p[i]); // ERROR HERE -- Line 32
gp &= (g[j] & p[i]) & gp;
end
assign cout[n] = cpp | gp | (x[i] & y[i]);
end
endgenerate
endmodule
我现在面临的挑战是如何分配 cpp 和 gp。我不断收到错误:
错误 (10170):在fourbit_lookahead.v(25) 附近的文本中出现 Verilog HDL 语法错误:“=”;期待“。”或“(”。检查并修复紧接在指定关键字之前或处出现的任何语法错误。
错误 (10170):在fourbit_lookahead.v(32) 附近的文本中出现 Verilog HDL 语法错误:“&”;期待“。”或“(”。检查并修复紧接在指定关键字之前或处出现的任何语法错误。
【问题讨论】:
-
我不知道这是否会有所帮助,但 here's an alu32 implementation 使用
parameter和generate块。由于您的n不仅仅是通过线路传输的值,而且它实际上决定了要合成的硬件,因此它需要是parameter而不是input。至少我是这么理解的。 -
感谢@PatrickRoberts 的帮助我已经更新了我的问题以反映我遇到的特定错误。有什么想法吗?
-
请记住
generate不支持顺序逻辑。与其声明两个reg,不如声明两组线来累积(cin[j] & p[j] & p[i])和(g[j] & p[i])? -
忘记生成块。有很特别的。你有很多问题。你在这里并不需要它们。尝试使用 always 块。