0

設計ファイル内のパラメータのログ値を計算する方法を誰か教えてもらえますか?

次のようなループの生成があるような状況に遭遇しています。

parameter N=8;

genvar i,m;

generate
for(m=1;m<N;m=m*2)
begin :m_loop

    // I have an instance here
    // "in" is an input of N bits, "out" is an output N bits

    Inst u(in(i+log2(m)),in(i+1+log2(m)),out(i+log2(m)));     
end
endgenerate

log2(m) を行う方法はありますか?ここで、m は 2 の累乗 (2^0,2^1,2^2、N まで) として変化しますか? そうでない場合は、

新しい変数 m1 を導入することを考えていましたが、これは 0,1,2,... (つまり、log2(m)) です。

このような場合、m1 はすべての m で同時に変化する必要があります。つまり、m=1、m1=0 の場合です。m=2,m1=1;

m=4、m1=2; m=8、m1=3 など。

4

2 に答える 2

1

これが明らかに合成されることを意図しておらず、N が 8 しかないことを考えると、それぞれが逆対数を含む 2^N 値の配列を (ネストされた for ループのペアで) 生成できますか?答えを得るには「m」を使用します。

Verilog ほどひどい言語を使用してテーブルのソースを生成し、それをロードすることもできます。

アップデート:

ADDRESS WIDTH from RAM DEPTHは、正確な 2 の累乗の答えだけに関心がある場合にも関連する可能性があります。

于 2011-04-22T08:17:16.233 に答える
0

欲しいのはログベース2の天井。

シミュレータが IEEE 1364-2005 または任意の IEEE 1800 をサポートしている場合は、$clog2. 元。:

Inst u(in[i+$clog2(m)], in[i+1+$clog2(m)], out[i+$clog2(m)]);  

IEEE 1364-2001 に制限されている場合は、別のパラメーターを割り当てる入力として、既知のパラメーターを使用して「純粋な関数」を使用します。「純粋な関数」は、その入力によってのみ計算される出力である関数として定義されます。以下は、IEEE 1800-2012セクション 13.4.3 の例に基づく抜粋です。これは、1364-2001 以降のすべての Verilog (および SystemVerilog) バージョンで使用されているのと同じ例です。1800-2012は、IEEE から無料でダウンロードできる唯一のバージョンです。

parameter ram_depth = 256;
parameter addr_width=clogb2(ram_depth); // width is 8
/* ... */
function integer clogb2(input [31:0] value);
  value = value -1;
  for(clogb2=0; value>0; clogb2=clogb2+1)
    value = value >> 1;
endfunction

同じclogb2()関数が型でも機能するはずgenvarです。

于 2013-07-01T23:11:12.833 に答える