实现
RAM
时应该考虑的性能因素
要高效地推断存储元件,需要考虑下列影响性能的因素:
•
使用专用块还是分布式
RAM
RAM
可以在专用块
RAM
或使用分布式
RAM
的
LUT
内实现。不同的选择会影响资源选择,同时还会严重地影响性
能和功耗。
一般来说
RAM
要求的深度是首要选择标准。高达
64
位深度的存储器阵列一般实现在
LUTRAM
中,其中深度不超
过
32
位的映射为每个
LUT
的
2
位,深度达到
64
位的映射为每个
LUT
的
1
位。深度更大的
RAM
根据可用资源和
综合工具赋值,也可实现在
LUTRAM
中。
深度超过
256
位的存储器阵列一般实现在块存储器中。赛灵思
FPGA
器件能够灵活地以多种宽度深度组合映射此类
阵列。用户需要熟悉这些配置,才能了解代码中更大规模存储器阵列声明所使用的块
RAM
的数量与结构。
•
使用输出流水线寄存器
高性能设计要求使用输出流水线寄存器,同时还建议所有设计都应使用输出寄存器。这可以优化块
RAM
的时钟输
出时序。另外增加第二个输出寄存器也有好处,因为与块
RAM
寄存器相比,
slice
输出寄存器具有更快的时钟输出
时序。使两个寄存器的总读取时延为
3
。在推断这些寄存器时,它们应以
RAM
阵列的方式存在于相同层级上。这
样便于工具将块
RAM
输出寄存器合并到原语中。
•
使用输入流水线寄存器
当
RAM
数组很大并映射到许多原语时,它们可以跨相当大的模具区域。这可能导致地址和控制线上的性能问题。
考虑在生成这些信号之后和
RAM
之前添加一个额外的寄存器。为了进一步提高时序,稍后在流程中使用
phys_opt_design
来复制此寄存器。无逻辑的寄存器的输入将更容易复制。
场景防止块
RAM
输出寄存器推断
因为这是确保推断的最简单方法,所以赛灵思建议,存储器和输出寄存器都在单个层级中推断。有两种情况会推断出
块
RAM
输出寄存器。第一个是在输出上存在额外寄存器时,第二个是当读取地址寄存器在存储器阵列中重新时序时。
只能使用单端口
RAM
。如下图所示:
与这些示例的某些偏离可以防止输出寄存器的推断。