Невозможно присвоить значение массиву с циклом for Verilog - PullRequest
0 голосов
/ 24 ноября 2018

Мне нужно сделать n-битный сумматор в verilog с помощью 4-битного carry_lookahead модуля (n, которое я упомянул, будет кратным 4).Я думаю, что я понял, как бороться с переносами, однако я не могу присвоить значения суммам (которые являются массивом 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 голосов
/ 24 ноября 2018

Вы используете генерировать операторы for и case.Использование case в качестве оператора генерирования некорректно в ваших примерах.

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".Должно работать что-то вроде следующего:

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
...