一個雙端口RAM能配置成兩個獨立的單端口RAM?

  • 2019 年 10 月 30 日
  • 筆記

思考一下:

對於一個單端口RAM,採用RTL代碼描述,如何在同一個模塊中實現如下功能:

(1)寬度可配置

(2)深度可配置

(3)寫模式可配置

實現上述功能主要用到Verilog兩個語法結構:parameter定義參數,實現參數化;generate語句,根據參數調用對應的功能塊。

在FPGA設計中可能會出現對單端口RAM需求較大的情況。儘管Xilinx提供了將BRAM配置為單端口RAM的IP Core,但從資源角度來看,可能會造成浪費。例如,需要2個512×18的單端口RAM,若直接採用單端口RAM的配置方式,1個512×18的單端口RAM將佔用1個18Kb的BRAM,這意味着將要消耗2個18Kb的BRAM。事實上,此時每個BRAM有一半的資源閑置。這裡,採用另一種方式:將BRAM配置為1Kx18的雙端口RAM,其中端口A和端口B均為1Kx18的模式。具體配置方式如下圖左邊區域所示。顯然,此時只佔用了1個18Kb的BRAM。

在該圖左邊區域,需要將端口A的地址信號ADDRA的最高位接高,端口B的地址信號ADDRB的最高位接低。這意味着端口A所能覆蓋的地址區間為512~1023共512個地址空間,端口B所能覆蓋的地址區間為0~511共512個地址空間。二者地址空間沒有重疊,因此互相獨立,從而形成了兩個獨立的512×18即9Kb的單端口RAM。此外,端口A和端口B的位寬可以不一致(但不是隨意的),如上圖的右半區域所示。仍將BRAM配置為雙端口RAM,其中端口A為1024×18,端口B為2048×9。將端口B的地址信號ADDRB的最高位接高,這意味着端口B所能覆蓋的地址區間為1024~2047共1024個地址空間,而端口A的地址區間為0~1023共1024個地址空間。二者地址空間依然沒有重疊,仍相互獨立,從而形成了兩個獨立的9Kb的單端口RAM。

思考一下:

對於URAM是否可以這麼配置?