无法使用for循环Verilog向数组分配值

时间:2018-11-23 22:09:17

标签: arrays verilog

我需要借助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赋值?

1 个答案:

答案 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