1. 設計要求
設計一個位寬8bit,地址深度為128,可以同時讀寫的雙端口RAM
要求:模塊名字為RAM_DUAL
輸入端口:ADDR_W,ADDR_R
CLK_R,CLK_W,RSTn
ADDR_R[6:0],ADDR_W[6:0]
DATA_WRT[7:0]
RD_EN,WRT_EN
輸出端口:
DATA_RD[7:0]
2. 補充
一般大容量的RAM由專門的IP廠商提供,有單口RAM(讀寫不能同時進行),雙口RAM等各種樣式。IP廠商會提供behavior model,綜合以及后端庫文件
小容量的RAM可以自己用觸發器陣列搭建。屬于雙口RAM(讀寫可以同時進行,但是必須是不同地址的讀寫),可支持同時讀寫。常用在FIFO中
(自己用觸發器搭的ram一般都是雙口的,因為觸發器是支持讀寫的,讀的話就是讀觸發器Q端的數據,寫的話就是往觸發器D端寫數據)
3. 設計代碼
如上圖:ram用二維數組表示,在給ram賦值的時候,由于向量 不能直接給二維數組賦值,所以mem[127:0] <= 0是不被允許的,我們可以使用for循環為mem賦值,但是仿真工具不識別for語句,我們需要使用generate語句
使用generate會讓仿真工具把for循環里面的代碼展開,循環128次就是分別寫128個always語句。分別針對mem[0],mem[1],mem[2] ...... mem[127]。
而變量定義需要使用genvar。
4. 仿真代碼和波形
不能直接將二維數組mem拖入波形中觀察(這是仿真工具verdi節約資源的做法)。如果想讓mem二維數組直接拖入波形,我們需要在main.v仿真文件中加入$fsdbDumpMDA選項。