如何在Verilog中声明和使用1D和2D字节数组?

42

如何在Verilog中声明和使用一维和二维字节数组?

例如,如何像下面这样实现:

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;
    }
}
3个回答

62
Verilog语言使用位(bit)进行操作,因此reg [7:0] a[0:3]将会给你一个4x8位数组(即4x1字节数组)。你可以使用a[0]来获取第一个字节(byte)。对于第二个字节的第三位(bit),你可以使用a[1][2]来访问。
如果你需要一个二维字节数组,则首先要检查你的仿真器/编译器版本是否支持。旧版本(我认为是'01之前的版本)可能不支持这种语法。然后,reg [7:0] a[0:3][0:3]将会给你一个二维字节数组。例如,你可以使用a[2][0][7]来访问其中的一个单独的位(bit)。
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

展开的数组是否不可综合化?为什么你说b[i][j]可能会有问题? - Rajesh Shashi Kumar
这个例子有点令人困惑。我建议为i和j分别设置不同的索引号。现在它们都是0-3。假设你有reg [7:0] b [0:2] [0:3]; 很难确定b[i]的大小。 - Rock
1
@RajeshS 它们是可综合的,但仅限于 SystemVerilog。 - Kaiser Keister

12

除了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
这与Marty的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章。

7

其实很简单,就像C编程一样,在声明时只需在右侧传递数组索引即可。但是语法将类似于 [0:3] 表示4个元素。

reg a[0:3]; 

这将创建一个单位的1D数组。类似地,可以通过以下方式创建2D数组:

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

现在假设你在C语言中创建一个二维int数组,它将在内部创建一个32位的二维数组。但不幸的是,Verilog是一种硬件描述语言,因此它以位为单位思考而不是一堆位(虽然Verilog中有int数据类型),它允许您创建任意数量的位以存储在数组元素中(这在C语言中不适用,您无法在C语言的每个二维数组元素中存储5位)。因此,要创建一个二维数组,其中每个单独的元素可以容纳5位值,您应该编写如下内容:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接