web-dev-qa-db-ja.com

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

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;
    }
}
34
Ursa Major

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]を使用して1つのビットにアクセスできます。

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
53
Marty

Martyの優れた回答に加えて、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)ですが、regは4状態(01xz)です。 byteを使用するには、このSystemVerilog構文をサポートするツールチェーン(シミュレーター、シンセサイザーなど)も必要です。よりコンパクトなforeach (b[i])ループ構文にも注意してください。

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

10
toolic

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

reg a[0:3]; 

これにより、1ビットの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];
4
Karan Shah