2010-06-10 30 views
27

如何在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; 
    } 
} 

回答

46

的Verilog认为中位,所以reg [7:0] a[0:3]会给你一个4×8位阵列(= 4×1字节数组)。你用a[0]得到第一个字节。第二个字节的第三位是a[1][2]

对于二维字节数组,首先检查您的模拟器/编译器。旧版本(pre'01,我相信)不会支持这一点。然后reg [7:0] a [0:3] [0:3]会给你一个二维的字节数组。例如,可以使用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 
+1

不要在for循环必须<= 3,而不是<3? – 2013-05-11 23:44:28

+1

@RossAiken [a:b]风格的数组声明是包含范围。所以<=是正确的。 – siu 2014-10-29 15:16:48

+0

@siu - 本来我错了 - ross-aiken发现了错误,我编辑了答案...... – Marty 2017-10-22 00:55:46

8

除了马丁的出色答卷,SystemVerilog的规范提供了byte数据类型。以下声明了一个4×8位变量(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章。

3

实际上很简单,就像C编程一样,您只需在声明的右侧传递数组索引。但是,对于4个元素,语法就像[0:3]。

reg a[0:3]; 

这将创建一个单一位数组的1D。同样2D阵列可以这样创建的:

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

现在用C假定创建INT的2D阵列,那么它会在内部创建32个比特的2D阵列。但不幸的是,Verilog是一个HDL,所以它认为在一些位而不是一堆位(尽管int数据类型在Verilog中),它可以让你创建任意数量的位存储在一个数组元素中(这不是使用C的情况下,不能在C中的二维数组的每个元素中存储5位)。因此,要创建一个二维数组,其中每个单独的元素可以容纳5位的值,你应该这样写:

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