仅对英特尔可见 — GUID: esc1445886540528
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: esc1445886540528
Ixiasoft
2.4.1.5. 预计算
预计算是优化总体设计速度的最简单和最有利的技术之一。 当面对关键逻辑时,要验证计算蕴涵的信号是否可用。要尽早计算信号,使这些计算保持在关键逻辑之外。
当试图保持关键逻辑在您的环路之外时,要首先尝试预计算。Compiler不能只使用retiming来优化环路中的逻辑。Compiler不能将环路中的寄存器移出。Compiler不能将环路外的寄存器重定时到环路中。因此,要将逻辑保持在尽可能小的环路中,使其不会对fMAX产生负面影响。
预计算之后,环路中的逻辑被最小化,并且设计预计算编码。计算在环路外执行,通过pipelining和retiming可以对计算进行优化。您不能移除环路,但可以更好地在设计速度上控制环路的效果。
图 58. 使用昂贵的环路重构一个设计(Restructuring a Design with an Expensive Loop)
以下实例代码显示了一个类似问题。原始环路包含比较运算符。
StateJam:if (RetryCnt <=MaxRetry&&JamCounter==16) Next_state=StateBackOff; else if (RetryCnt>MaxRetry) Next_state=StateJamDrop; else Next_state=Current_state;
预计算RetryCnt<=MaxRetry和JamCounter==16的值从StateJam环路中移除昂贵的计算,并使用简单的布尔计算进行替换。修改后的代码:
reg RetryCntGTMaxRetry; reg JamCounterEqSixteen; StateJam:if (!RetryCntGTMaxRetry && JamCounterEqSixteen) Next_state=StateBackOff; else if (RetryCntGTMaxRetry) Next_state=StateJamDrop; else Next_state=Current_state; always @ (posedge Clk or posedge Reset) if (Reset) JamCounterEqSixteen <= 0; else if (Current_state!=StateJam) JamCounterEqSixteen <= 0; else JamCounterEqSixteen <= (JamCounter == 15) ? 1:0; always @ (posedge Clk or posedge Reset) if (Reset) RetryCntGTMaxRetry <= 0; else if (Current_state==StateSwitchNext) RetryCntGTMaxRetry <= 0; else if (Current_state==StateJam&&Next_state==StateBackOff) RetryCntGTMaxRetry <= (RetryCnt >= MaxRetry) ? 1: 0;