仅对英特尔可见 — GUID: jbr1457936807030
Ixiasoft
2.4.2.1. 高速时钟域(High-Speed Clock Domains)
2.4.2.2. 重构环路(Restructuring Loops)
2.4.2.3. 控制信号反压(Control Signal Backpressure)
2.4.2.4. 使用FIFO状态信号的流程控制
2.4.2.5. 包含skid缓冲器的流程控制
2.4.2.6. Read-Modify-Write存储器
2.4.2.7. 计数器和累加器
2.4.2.8. 状态机
2.4.2.9. 储存器
2.4.2.10. DSP模块
2.4.2.11. 一般逻辑
2.4.2.12. 求模与除法
2.4.2.13. 复位
2.4.2.14. 硬件重用
2.4.2.15. 算法要求
2.4.2.16. FIFO
2.4.2.17. 三元加法器(Ternary Adders)
5.2.1. 不足的寄存器(insufficient Registers)
5.2.2. 短路径/长路径(short path/long path)
5.2.3. 快进限制(Fast Forward Limit)
5.2.4. 环路(loop)
5.2.5. 每个时钟域一个关键链
5.2.6. 相关时钟组中的关键链
5.2.7. 复杂的关键链
5.2.8. 延伸到可定位的节点
5.2.9. 域边界入口和域边界出口(Domain Boundary Entry and Domain Boundary Exit)
5.2.10. 包括双时钟存储器的关键链
5.2.11. 关键链比特和总线
5.2.12. 延迟线
仅对英特尔可见 — GUID: jbr1457936807030
Ixiasoft
5. 重定时限制和解决方法
Compiler会识别出您设计中限制通过Hyper-Retiming进一步优化进行限制的寄存器链。Compiler将这些相关的寄存器到寄存器路径称为关键链。关键链的fMAX 及其相关联的时钟域受限于寄存器到寄存器路径的平均延迟以及像路由线(routing wire)这样的不可分割的电路元件的量化延迟。 有多种情况会导致重定时限制。重定时限制的存在是由于硬件特性,软件行为,或者是设计中固有的。Retiming Limit Details报告阻止进一步重定时的限制性原因,以及组成链的寄存器和组合节点。Fast Forward建议列出了用于移除关键链并使能额外的寄存器重定时的步骤。
在下面的简单关键链图中,红线代表同一关键链。时序限制可以防止寄存器A向前重定时。时序限制也可以防止寄存器B向后重定时。当寄存器A和寄存器B是同一寄存器时会出现环路(loop)。
图 101. 简单关键链
对关键链的Fast Forward建议包括:
- 降低链中‘Long Paths’的延迟。使用标准时序收敛技术来降低延迟。组合逻辑、次优布局和布线拥塞都能导致路径延迟。
- 在链中的‘Long Paths’中插入更多流水线级。长路径(long path)是关键链的一部分,具有寄存器间的最大延迟。
- 增加延迟(或在链中的‘Short Paths’中添加流水线级)。
由于许多其他原因,关键链中的特定寄存器可能会限制性能。Compiler对通过重定时限制进一步优化的原因进行了如下分类:
- 不足的寄存器(insufficient Registers)
- 环路(loop)
- 短路径/长路径(short path/long path)
- 路径限制(path limit)
在了解了一个特定的关键链限制了设计的性能的原因之后,您可以进行RTL变更来消除此瓶颈并提高性能。
设计条件 | Hyper-Register支持 |
---|---|
无法保存的初始条件 | Hyper-Register的确有初始条件支持。然而,您不能在保留所有寄存器的初始条件阶段(即Hyper-Registers的合并和复制)的同时执行某些重定时操作。如果此条件出现在设计中,那么Fitter就不会重定时这些寄存器。该重定时限制确保了寄存器重定时不会影响设计的功能性。 |
寄存器有一个异步清零 | Hyper-Register仅支持数据和时钟输入。Hyper-Register没有诸如异步清零,预置或使能的控制信号。Fitter不能对具有异步清零的寄存器进行重定时。仅在必要时使用异步清零,例如状态机或者控制逻辑。通常情况下,您可以避免或者移除数据路径大部分的异步清零。 |
寄存器驱动一个异步信号 | 该设计条件是任何使用异步复位的设计所固有的。专注于减少使用异步清零进行复位的寄存器的数量。 |
寄存器具有don’t touch或者preserve属性 | Compiler不会对具有这些属性的寄存器进行重定时。如果您使用preserve属性来管理高扇出信号的寄存器复制,那么要尝试移除preserve属性。Compiler可以对每条布线路径(到高扇出寄存器的目的地)上的高扇出寄存器进行重定时。或者,使用dont_merge属性。Compiler重定时ALM、DDIO、单端口RAM和DSP模块中的寄存器。 |
寄存器是一个时钟源 | 这种设计条件并不常见,特别是对一个设计的性能关键部分。如果该重定时限制阻止了您实现所需的性能,那么请考虑是否PLL可以生成时钟,而不是寄存器生成时钟。 |
寄存器是一个分区边界 | 该条件是那些使用设计分区的设计所固有的。如果该重定时限制阻止了您实现所需的性能,那么请在分区边界内添加额外的寄存器以用于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不会对跨时钟边界上的寄存器重定时。请考虑在时钟域边界的一侧(或另一侧)添加额外的流水线级,以对重定时提供更大灵活性。 |