为使第二寄存器被
RAM
原语吸收,来自存储器阵列的数据输出位的扇出必须为
1
。这在下图中进行了说明。
检查地址
/
读取数据寄存器上的复位信号
不应复位存储器阵列。只有
RAM
的输出可以容许复位。复位必须是同步的,以便将输出寄存器推断到
RAM
基元中。
异步复位将使寄存器不被推断为
RAM
基元。此外,输出信号只能复位为
0
。
下图为确保
RAM
和输出寄存器的正确推断而应避免的示例。
检查寄存器中的反馈结构
请确保寄存器没有反馈逻辑,在下面的示例中,由于加法器需要寄存器的当前值,所以该逻辑不能重新时序并打包到
块
RAM
中。结果电路是没有输出寄存器的块
RAM
(
DOA_REG
和
DOB_REG
设置为
‘0’
)。
将存储器映射到
UltraRAM
块
UltraRAM
是一个
4Kx72
内存块,具有两个端口,使用单个时钟。此原语仅在某些
UltraScale+™
器件中可用。在这些
器件中,除了块
RAM
资源之外,还包括
UltraRAM
。
UltraRAM
可以在您的设计中使用以下方法:
•
依靠综合来推断
UltraRAM
,通过在
HDL
中的内存声明上设置
ram_style = "ultra"
属性。
•
例化赛灵思
XPM_MEMORY
原语。
•
例化
UltraRAM UNISIM
原语。
以下代码示例显示了
XPM
内存的例化,并在
HDL
语言模板中提供。突出显示的参数
MEMORY_PRIMITIVE
和
READ_LATENCY
是将存储器推断为
UltraRAM
的高性能的关键参数。
•
MEMORY_PRIMITIVE = "ultra"
指定内存被推断为
UltraRAM
。
•
READ_LATENCY
定义存储器输出上存在的流水线寄存器的数量。
较大的存储器映射到配置为行
×
列结构的多个
UltraRAM
单元组成的
UltraRAM
矩阵。
基于深度,可以使用单列或多列创建矩阵。
URAM
列高度的当前默认阈值为
8
,并且可以使用属性
CASCADE_HEIGHT
进行控制。
单列和多列
UltraRAM
矩阵之间的区别如下:
•
单列
UltraRAM
矩阵使用内置的硬件级联,无架构逻辑。
•
多列
UltraRAM
矩阵在每列中使用内置硬件级联,以及连接列的一些结构逻辑。可能需要额外的流水线才能保持性
能。这是通过增加读取时延来推断的。
Vivado
会根据需要将这些寄存器自动封装到
UltraRAM
中。
上面的示例使用
32 K x 72
内存配置,并使用八个
URAM
。为了提高
UltraRAM
的性能,应该在级联链中添加更多的流
水线寄存器。这是通过增加读取时延整数实现的。