Verilog memory類型數據


引言

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];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM