仅对英特尔可见 — 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可以对计算进行优化。您不能移除循环,但可以更好地在设计速度上控制循环的效果。
图 54. 使用昂贵的回路重构一个设计(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;