2017-03-03 10 views
1

合成可能な Verilogモジュールを実装しようとしています。これは2つのベクトル/配列からなるベクトル積を生成します。各ベクトル/配列には8つの16ビット符号なし整数が含まれます。 Design Compilerがエラーsymbol i must be a constant or parameterを報告しました。私はそれを修正する方法を知らない。ここに私のコードです。Verilogベクトル内積

module VecMul16bit (a, b, c, clk, rst); 
// Two vector inner product, each has 8 elements 
// Each element is 16 bits 
// So the Output should be at least 2^32*2^3 = 2^35 in order to 
// prevent overflow 
// Output is 35 bits 
input clk; 
input rst; 
input [127:0] a,b; 
output [35:0] c; 
reg [15:0] a_cp [0:7]; 
reg [15:0] b_cp [0:7]; 
reg [35:0] c_reg; 
reg k,c_done; 

integer i; 
always @ (a) 
begin 
    for (i=0; i<=7; i=i+1) begin 
     a_cp[i] = a[i*15:i*15+15]; 
    end 
end 

always @ (b) 
begin 
    for (i=0; i<=7; i=i+1) begin 
     b_cp[i] = b[i*15:i*15+15]; 
    end 

end 

assign c = c_reg; 

always @(posedge clk or posedge rst) 
begin 
    if (rst) begin 
     c_reg <= 0; 
     k <= 0; 
     c_done <= 0; 
    end else begin 
     c_reg <= c_done ? c_reg : (c_reg + a_cp[k]*b_cp[k]); 
     k   <= c_done ?   k : k + 1; 
     c_done  <= c_done ?   1 : (k == 7); 
    end 
end 

endmodule 

あなたが見ることができるように、私はループをa_cpからaをコピーしようとしている、これはそれを行うには正しい方法は何ですか?

はいの場合、私はそれをiと定義する必要があります。定数はforループのステッパーとして使用できますか?

答えて

1

部分選択は、一定の境界を持たなければなりません。だから、これは許可されていません。

a_cp[i] = a[i*15:i*15+15]; 

のVerilog-2001を使用すると、開始位置とビットの選択したグループの幅を指定構文を選択し、新しいインデックス付きの一部を導入しました。これは右にカウントビットi*15から始まるaの16ビット幅のスライスを取る

a_cp[i] = a[i*15+:16]; 

:だから、あなたはすることにより、上記の行を交換する必要があります。 +:の代わりに-:を使用できます。その場合は、左に数えます。

は注意してください:有効な構文ですので、コンパイラによって発見されない場合があります(まだバグかもしれない):+の代わりに、+::+を入力することは非常に簡単です。実際には私はこれをEDA Playground exampleとタイプするときに正確に行いましたが、私の誤字はこの場合にはコンパイラによって捕まえられました。

+1

インデックスはおそらく 'i * 16'だけシフトするはずです。さもなければ、スライス間に重なりがあります。 '+:'の前後に空白をつけて目立たせることをお勧めします: 'a [i * 15 +:16];' – Greg

関連する問題