实现 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 。如下图所示:
与这些示例的某些偏离可以防止输出寄存器的推断。