Intel® Quartus® Prime Pro Edition用户指南: 设计编译

ID 683236
日期 12/16/2019
Public
文档目录

1.5.5.1. 重定时限制和解决方法

Compiler通过Hyper-Retiming确认设计中限制进一步优化的寄存器链。Compiler将这些相关寄存器-寄存器路径称为关键链。关键链的fMAX及其相关时钟域受限于寄存器-寄存器路径中的平均延迟和不可分割电路元件(如布线电缆)的量化延迟。 导致重定时限制(retiming restriction)的情况有多种。重定时限制的存在是由硬件特性,软件行为或设计固有的特性导致。Retiming Limit Details报告阻止进一步重定时的限制原因,以及组成链的寄存器和组合节点。Fast Forward建议中列出了移除关键链和使能其他寄存器重定时的步骤。

图 35中,红线代表相同的关键链。时序约束可以阻止register A向前重定时。时序约束也可以阻止register B向后重定时。当register A和register B是相同寄存器时会出现环路(loop)。

图 35. 关键链样例

对关键链的Fast Forward建议包括:

  • 降低链中“长路径”延迟。使用标准时序收敛技术降低延迟。组合逻辑,次优布局和布线拥塞都是导致路径延迟的原因。
  • 在链中的“Long Paths”(“长路径”)中插入更多流水线级。长路径(long path)是关键链中包含寄存器间最大延迟的部分。
  • 增加延迟(或在链中的“Short Paths”中添加流水线阶段)。

关键链中的特定寄存器会因为许多其他原因而限制性能。Compiler将限制通过重定时进一步优化的原因做出如下类型分类:

  • 寄存器不足(insufficient Registers)
  • 环路(loop)
  • 短路径/长路径(short path/long path)
  • 路径限制(path limit)

了解特定关键链限制设计性能的原因后,便可进行RTL更改,以消除瓶颈并提高性能。

表 11.  对各种设计条件的Hyper-Register支持
设计条件 Hyper-Register支持
无法保留的初始条件 Hyper-Registers有初始条件支持。但无法在保留所有寄存器初始条件阶段(即,合并和复制Hyper-Registers)的同时执行某些重定时操作。如果设计中出现此情况,则Fitter不会重定时这些寄存器。此重定时限制确保了寄存器重定时不会影响设计功能。
寄存器的异步清零 Hyper-Register仅支持数据和时钟输入。Hyper-Register无诸如异步清零,预置或使能的控制信号。Fitter不能重定时任何有异步清零的寄存器。仅在必要时使用异步清零,例如状态机或控制逻辑。通常可避免或从数据路径的较大部分中删除异步清零。
寄存器驱动异步信号 此设计条件是所有使用异步复位的设计所固有的。着重减少通过异步清零进行复位的寄存器数量。
寄存器具有don’t touch或preserve属性 Compiler不重定时具有这些属性的寄存器。如果使用preserve属性管理高扇出信号的寄存器复制,则尝试删除preserve属性。Compiler或许能将每条布线沿线的高扇出寄存器重定时到其目的地。或者,使用dont_merge属性。Compiler重定时ALM,DDIO,单端口RAM和DSP块中的寄存器。
寄存器是时钟源 此设计条件并不常见,尤其是对设计的关键性能部分。如果此重定时限制阻止您实现所需性能,则要考虑PLL是否能够生成时钟而非寄存器。
寄存器是分区边界(partition boundary) 此条件是任何使用设计分区的设计中所固有的。如果此重定时限制阻止您实现所需的性能,则要在分区边界内添加其他寄存器用于Hyper-Retiming。
寄存器是由ECO操作修改的模块类型 此限制并不常见。通过对设计源和重编译进行功能性变更而非执行ECO来避免此限制。
寄存器位于未知模块 此限制并不常见。通常可以通过在特定模块类型旁添加其他寄存器解决此问题。
寄存器在RTL中被描述为锁存器 Hyper-Register不能实现锁存器。有时由于RTL编码问题导致Compiler推断为锁存器,例如不完整的约束。如果打算实现锁存器,就请修改RTL。
寄存器位于I/O边界 所有设计都包含I/O,但可在I/O边界旁添加其他流水线阶段以用于Hyper-Retiming。
组合节点由特殊源驱动 此条件并不常见,特别是对设计的性能关键部分。
寄存器由局部布线的时钟驱动 只有专用时钟网络对Hyper-Register提供时钟。使用布线架构分布时钟信号并不常见,尤其对于设计的关键性能部分。可考虑改为实现小型时钟域。
寄存器是一个时序异常端点 Compiler不重定时作为.sdc约束的源或目标的寄存器。
带有反转输入或输出的寄存器 此条件不常见。
寄存器是同步器链的一部分 Fitter优化了同步器链以增加平均故障间隔时间(MTBF),并且Compiler不会对检测到或标记为同步器链部分的寄存器重定时。在与同步器链相邻的时钟域边界处添加更多流水线阶段,可为重定时提供灵活性。或者,可减少特定同步器链的检测数量Synchronization Register Chain Length(默认为3)。某些情况下,同步器链不是必需,亦不应进行推断。
对开始或结束于寄存器的路径使用具有多个周期要求的寄存器(跨时钟边界) 凡是寄存器以一个频率锁存某时钟上的数据,并扇出到运行在另一个频率上的寄存器时,跨时钟边界上就会出现该情况。Compiler不重定时跨时钟边界处的寄存器。考虑在时钟域边界的一侧添加其他流水线阶段(或另一侧),以对重定时提供更大灵活性。