0

私は Verilog に不慣れで、以下に引用されている私のコードの一部を合成しようとしたときに発生するエラーについて、あなたの意見を知りたいです:

input [31:0] A;
reg [31:0] X,Y;
reg [15:0] width;
input action;       

always@*
begin

  width= A [31:16]; 
  if (action==1)    
  begin    
    case (width) 
      16'b0: X=0;
        default: 
          begin
            for (i=32; i>=width+1 ; i=i-1)
              X[i]=0;
            for (i=width; i>=0; i=i-1)
              X[i]=1;
          end 
    endcase 
    Y=X >> 1;
  end
end

Cadence合成ツールを使用していますが、コードのこの部分に次のようなエラーが表示されます。

インデックス 'X[-1]' は、宣言 [31:0] の有効な範囲内にありません

width=0for ループを使用してはならない特別なケースがある場合でも、理解できません。また、制限をwidth +2に増やしてみましたが、同じエラーが発生しました。width +1shift the quantity X by 2

前もって感謝します!

4

2 に答える 2

1

どうiすれば -1 になるのかわかりませんが、範囲外の 31 より大きくなる可能性があります。合成の問題がいくつかあります。

  1. i=32はすでに の範囲外ですX[31:0]。その MSB は 31 です。
  2. iのときに範囲外になりwidth > 31ます。widthは 16 ビットの符号なし値です。つまり、最大値は 65535 (つまり 2 16 -1)で、最小値は 0 です。
  3. 合成では、スタティック アンロールにループが必要です。これは、ループの数が一定でなければならないことを意味します。などの変数widthは、ループ条件に含めることはできません。

合成可能な for ループは次のようになります。

for (i=31; i>=0; i=i-1)
  X[i] = (width>=i);

width= A [31:16];上記の always ブロックは、不正な構文であるため、タイプミスを犯したコピーであると想定しています。widthまた、 、XY、またはialways ブロックの外側に追加の割り当てがないと仮定しています。そうしないと、追加のエラーが発生します。

于 2014-08-11T16:19:45.763 に答える
0

-1 条件に達している正確な理由は不明ですが、幅「幅」のマスクを作成しようとしているように見えます。これは次のようにより簡単に実現できます。

always @*
  begin
    X = ((1 << width[4:0]) - 1)
  end

編集:シフトに幅指定子を追加しました。これにより、合成領域が減少する可能性があります

于 2014-08-11T21:25:35.857 に答える