Intel® Hyperflex™ 体系结构高性能设计手册

ID 683353
日期 10/04/2021
Public
文档目录

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<=MaxRetryJamCounter==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;