為什麼要用XPM_MEMORY
- 2019 年 10 月 30 日
- 筆記
存儲單元在FPGA設計中幾乎是不可或缺的。無論是單端口(SP)、簡單雙端口(SDP)或真雙端口(TDP),也無論是採用BlockRAM或分佈式RAM(Distributed RAM)實現,都可以採用如下幾種方式:
- RTL代碼
- 原語(Primitive)
- IP Core
- XPM_MEMORY
RTL代碼方式具有較強的可控性和可測性,但未必能獲得最優的綜合結果;原語方式看似精確但過於繁瑣,因為給用戶暴露出過多的端口和屬性,而實際用戶用到的並不多;IP Core是比較快速且靈活的方式,也能根據性能或資源需求獲得期望的綜合結果,但如果需要更換Memory的實現方式例如把分佈式RAM換成BRAM,就需要重新調用IP生成。相比之下,XPM_MEMORY就很好地繼承了這些方式的優點。
XPM_MEMORY是Xilinx提供的一種宏(Xilinx Parameterized Macros),從字面上就可以看到這是一種可參數化的方式。打開Vivado,依次點擊Tools,Language Templates,Verilog或VHDL,Xilinx Parameterized Macros,即可看到如下圖所示的列表。從這個列表我們可以看到,設計中可能用到的Memory類型都在其中(FIFO有單獨的XPM_FIFO)。
例如,設計中要用到大量的單端口RAM,如果採用IP Core的方式,就需要反覆調用IP。這裡我們採用XPM_MEMORY的方式。選擇xpm_memory_spram,並對其進行封裝(實例化,形成一個新的RTL模塊)。這個封裝的過程需要提取一些參數以便後期可快速地定製化。這些參數如下圖所示。
可以看到主要的參數包括:
MEMORY_PRIMITIVE: Memory的實現方式,可以是distributed,block或ultra
ADDR_WIDTH: 地址的位寬,該參數決定了Memory的深度
DATA_WIDTH: 數據的位寬,該參數也就是Memory的寬度
WRITE_MODE: 寫模式,可以是read_first,write_first或no_change,主要解決讀寫衝突問題
READ_LATENCY: 讀Latency,該參數決定了從讀地址有效到輸出數據有效所需的時鐘周期
相應的實例化如下圖所示。可以看到此時已經把ADDR_WIDTH_A的值設置為其上層參數ADDR_WIDTH,MEMORY_PRIMITIVE的值設置為上層參數MEMORY_PRIMITIVE等,從而實現了參數化。
具體工程中,只需對mysp進行參數化定製即可滿足不同的需求。如下圖所示。設計中用到了兩個單端口RAM,分別採用URAM和BRAM實現。