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

ID 683353
日期 7/13/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

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