11

Verilog でマルチステージ コンパレータを作成しようとしていますが、単一の生成ループで複数の genvar をインクリメントする方法がわかりません。私は次のことを試しています:

genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate

そして、次のエラーが発生します:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "encoder.v", 322: token is '='
    j=0;

同じ生成ステートメントで複数の genvars をインクリメントする方法を知っている人はいますか? または、少なくとも同等の機能を取得しますか?

4

2 に答える 2

16

同じ生成ステートメントで複数の genvars をインクリメントする方法を知っている人はいますか?

これは許可されません。これは、generate for ループがループ変数に対して暗黙的な localparam ステートメントを作成し、その localparam のみに基づいてループ内の項目を詳しく説明するためです。これは、genvar が localparam として宣言されている場合、ループ内のすべての項目がループ外で有効でなければならないことを意味します。

genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate

になる

//Done for each value of i
genvar j;
localparam integer i = i_for_each_iteration;

j=0; //Not valid outside a procedural context so modelsim complains
assign ci1[i] = minw(tc[j],tc[j+1]);
j = j+2; //Also not valid outside a procedural context

この場合、ループ内で明示的なパラメーターを使用して、genvar に依存する「定数」値を作成できます。

genvar i;
//Level 1
generate
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    localparam integer j = i*2;
    assign ci1[i] = minw(tc[j],tc[j+1]);
  end
endgenerate
于 2012-03-05T21:36:59.307 に答える
5

それci1が半分の深さを持っていてtc、たとえばci1[0] = min(tc[0], tc[1])ci[1] = min(tc[2], tc[3])などが必要だとすると、次のように機能するはずです。

module st_genvar();

  int ci1 [0:127];
  int tc [0:255];

  function int minw(int i1, int i2);
      if(i1 < i2 )
        minw = i1;
      else
        minw = i2;
  endfunction

  genvar i;
  //Level 1
  generate
      for (i=0;i<128;i=i+1)
        begin: level1Comp
            assign ci1[i] = minw(tc[i*2],tc[i*2+1]);
        end
  endgenerate

endmodule
于 2012-03-05T11:53:21.617 に答える