我需要借助4位carry_lookahead
模块(我提到的n将是4的倍数)在verilog中制作n位加法器。我想我已经弄清楚了如何处理进位,但是我不能为和分配值(即s[n-1:0]
数组)。我不断收到以下错误:
in line 22: near "[": syntax error, unexpected '['
in line 22:(vlog-13205) Syntax error found in the scope following 's'. Is there a missing '::'?
这是carry_lookahead
模块,可以正常工作:
module cla4(a,b,cin,cout);
parameter n=4;
genvar i;
input cin;
input [3:0]a,b;
wire [3:0]c;
output cout;
assign g0=(a[0]&b[0]);
assign p0=((a[0]^b[0])&cin);
assign c[0]=(g0|p0);
assign g1=(a[1]&b[1]);
assign p1=((a[1]^b[1])&c[0]);
assign c[1]=(g1|p1);
assign g2=(a[2]&b[2]);
assign p2=((a[2]^b[2])&c[1]);
assign c[2]=(g2|p2);
assign g3=(a[3]&b[3]);
assign p3=((a[3]^b[3])&c[2]);
assign cout=(g3|p3);
endmodule
主程序:
module n_bits_adder (a,b,cin,cout,s);
genvar i,k;
parameter n=8;
input cin;
input [n-1:0]a,b;
output reg [n-1:0]s;
output cout;
reg [n:0]c;
for(i=0;i<n/4;i=i+1)
begin
cla4 U1(.a0(a[i]),.a1(a[i+1]),.a2(a[i+2]),.a3(a[i+3]),.b0(b[i]),.b1(b[i+1]),.b2(b[i+2]),.b3(b[i+3]),.cin(c[i]),.cout(c[i+1]));
assign cin=c[0];
assign cout=c[i+1];
end
for(k=0;k<n;k=k+1)
begin
case({a[k],b[k],c[k]}) //i check the inputs for each adder and assign the
correct value to the sum below
3'b000: s[k]=1'b0;
3'b001: s[k]=1'b1;
3'b010: s[k]=1'b1;
3'b011: s[k]=1'b0;
3'b100: s[k]=1'b1;
3'b101: s[k]=1'b0;
3'b110: s[k]=1'b0;
3'b111: s[k]=1'b1;
end
endmodule
为什么不让我为s
赋值?
答案 0 :(得分:0)
您使用生成“ for”和“ case”语句。在您的示例中,将case
用作generate语句是不正确的。
1)选择条件必须是可以在生成时解决的条件。因此,尽管您在此处串联了输入a,b和c,但是不能使用任何非常数变量。编译器将无法解析此生成的“ case”语句。
case({a[k],b[k],c[k]}) //i check the inputs for each adder and assign the
correct value to the sum below
2)case语句中的动作必须是合法的模块级语句。在您的示例中,它们是
3'b000: s[k]=1'b0; << this is an illegal statement
也许下面的方法可以完成3'b000: always @* s[k]=1'b0;
,但是由于那里没有always
,编译器可以正确检测到语法错误。
根据您的代码判断,我想您只是错过了围绕“ case”的always语句。像下面这样的东西应该起作用:
for(k=0;k<n;k=k+1)
begin: case_loop
always @* begin // << you need this
case({a[k],b[k],c[k]}) //i check the inputs for each adder and assign the
correct value to the sum below
3'b000: s[k]=1'b0;
3'b001: s[k]=1'b1;
...
end
end