2010-06-10 45 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];