37

Verilog で 1D および 2D バイト配列を宣言して使用する方法は?

例えば。のようなことをする方法

byte a_2D[3][3];
byte a_1D[3];

// using 1D
for (int i=0; i< 3; i++)
{
    a_1D[i] = (byte)i;
}

// using 2D
for (int i=0; i< 3; i++)
{
    for (int j=0; j< 3; j++)
    {
        a_2D[i][j] = (byte)i*j;
    }
}
4

3 に答える 3

58

Verilog はビット単位で考えるのでreg [7:0] a[0:3]、4x8 ビット配列 (=4x1 バイト配列) になります。でこれから最初のバイトを取得しa[0]ます。2 バイト目の 3 ビット目はa[1][2].

バイトの 2D 配列については、まずシミュレーター/コンパイラーを確認してください。古いバージョン ('01 より前だと思います) はこれをサポートしません。次にreg [7:0] a [0:3] [0:3]、バイトの2D配列を提供します。a[2][0][7]たとえば、単一のビットにアクセスできます。

reg [7:0] a [0:3];
reg [7:0] b [0:3] [0:3];

reg [7:0] c;
reg d;

initial begin

   for (int i=0; i<=3; i++) begin
      a[i] = i[7:0];
   end

   c = a[0];
   d = a[1][2]; 


   // using 2D
   for (int i=0; i<=3; i++)
      for (int j=0; j<=3; j++)
          b[i][j] = i*j;  // watch this if you're building hardware

end
于 2010-06-10T08:55:17.227 に答える
12

マーティの優れた回答に加えて、SystemVerilog 仕様はbyteデータ型を提供します。以下は、4x8 ビット変数 (4 バイト) を宣言し、各バイトに値を割り当て、すべての値を表示します。

module tb;

byte b [4];

initial begin
    foreach (b[i]) b[i] = 1 << i;
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]);
    $finish;
end

endmodule

これは出力します:

Address = 0, Data = 00000001
Address = 1, Data = 00000010
Address = 2, Data = 00000100
Address = 3, Data = 00001000

これは、コンセプトがマーティの に似ていreg [7:0] a [0:3];ます。ただし、byteデータ型は 2 状態 (0 と 1) ですが、reg4 状態 (01xz) です。を使用byteするには、この SystemVerilog 構文をサポートするツール チェーン (シミュレータ、シンセサイザなど) も必要です。よりコンパクトなforeach (b[i])ループ構文にも注意してください。

SystemVerilog 仕様は、さまざまな多次元配列タイプをサポートしています。LRM は私よりもうまく説明できます。IEEE Std 1800-2005の第 5 章を参照してください。

于 2010-06-10T13:25:19.160 に答える
5

実際には簡単です.Cプログラミングのように、宣言中に右側に配列インデックスを渡すだけです。しかし、ええ、構文は 4 つの要素の [0:3] のようになります。

reg a[0:3]; 

これにより、単一ビットの配列の 1D が作成されます。同様に、2D 配列は次のように作成できます。

reg [0:3][0:2];

C で int の 2D 配列を作成すると、内部的に 32 ビットの 2D 配列が作成されます。しかし、残念ながら Verilog は HDL であるため、ビットの集まりではなくビット単位で考えます (Verilog には int データ型があります)。配列の要素内に格納する任意の数のビットを作成できます ( C の場合、C の 2D 配列のすべての要素に 5 ビットを格納することはできません)。したがって、個々の要素が 5 ビットの値を保持できる 2D 配列を作成するには、次のように記述します。

reg [0:4] a [0:3][0:2];
于 2014-12-09T03:23:18.583 に答える