引言
verilog中具有多種數據類型,當我們用reg類型元素構建一維數組時,這時候的變量也稱之為memory。可以用於模擬只讀存儲器(ROMs)或隨機存取存儲器(RAMs)或者寄存器堆(regfiles)。
數組中的每個reg被稱為元素或字,由單個數組索引來處理。
賦值等操作
一個n-bit的reg可以在單個分配中賦值,但完整的memory內存不能這樣賦值。要對memory的字進行賦值,必須要指定一個索引。索引可以是一個表達式,這樣有利於數據的訪問。比如,計算機的程序計數器(program counter)的reg值可以作為索引去訪問RAM。
在之前的文章同步FIFO中,對ram進行初始化就是使用for循環對位寬為8,深度為8的ram賦值0。這里的深度就是每次操作需要的索引。
數組聲明
下圖中第一個聲明是表示一個memory,但是第二個數組arrayb是一個二維數組,位寬為1。這里需要區分。
第三個聲明是線網變量的陣列。
聲明的合法性
下圖的聲明是對上圖聲明變量的賦值,可以看出對memory進行整體賦值是非法的!
而第二個聲明也是非法的,對於二維數組不可以只聲明第一維度,第二維度也要表明。
第4,5條聲明是正確的,可以與上面3條進行對照。
訪問數組元素(system verilog擴展)
可以用數組索引引用未壓縮數組的每個元素,多維數組需要多組方括號來選擇數組中的單個元素:
logic [15:0] mem [0:4095];
data007 = mem[7];
real lookuptable [0:15] [0:15];
lookuptable [0] [15] = 2.15;
數組索引也可以是網絡或變量的值:
always_ff @(posedge clk)
data <= mem[address];
數組元素的位選擇和部分選擇(system verilog擴展)
可以從數組元素中選擇一位或一組位。但必須首先選擇數組的單個元素,然后再進行位選擇或部分選擇。
logic [15:0] mem [0:4096];
logic [15:0] data;
logic [3:0] nibble;
logic lsb;
data = mem[5];
lsb = mem [5] [0];
nibble = mem [5] [11:8];