為什麼要用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實現。