一个双端口RAM能配置成两个独立的单端口RAM?

思考一下:

对于一个单端口RAM,采用RTL代码描述,如何在同一个模块中实现如下功能:

(1)宽度可配置

(2)深度可配置

(3)写模式可配置

实现上述功能主要用到Verilog两个语法结构:parameter定义参数,实现参数化;generate语句,根据参数调用对应的功能块。

在FPGA设计中可能会出现对单端口RAM需求较大的情况。尽管Xilinx提供了将BRAM配置为单端口RAM的IP Core,但从资源角度来看,可能会造成浪费。例如,需要2个512x18的单端口RAM,若直接采用单端口RAM的配置方式,1个512x18的单端口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个地址空间。二者地址空间没有重叠,因此互相独立,从而形成了两个独立的512x18即9Kb的单端口RAM。此外,端口A和端口B的位宽可以不一致(但不是随意的),如上图的右半区域所示。仍将BRAM配置为双端口RAM,其中端口A为1024x18,端口B为2048x9。将端口B的地址信号ADDRB的最高位接高,这意味着端口B所能覆盖的地址区间为1024~2047共1024个地址空间,而端口A的地址区间为0~1023共1024个地址空间。二者地址空间依然没有重叠,仍相互独立,从而形成了两个独立的9Kb的单端口RAM。

思考一下:

对于URAM是否可以这么配置?