インテル® Hyperflex™ アーキテクチャー高性能デザイン・ハンドブック

ID 683353
日付 10/04/2021
Public
ドキュメント目次

2.4.1.5. 事前計算 

事前計算は、全体のデザイン速度を最適化する最も簡単で最も有益な手法の1つです。 クリティカルなロジックに直面した場合、計算が意味する信号が以前に使用可能かどうかを検証します。これらの計算をクリティカルなロジックの外に保つためには、常に信号をできるだけ早く計算してください。

クリティカルなロジックをループの外に置こうとするときは、まず事前計算を試してください。Compilerは、リタイミングのみを使用して簡単にループ内のロジックを最適化することはできません。Compilerは、ループ内のレジスターをループの外側に移動することはできません。Compilerはループ外のレジスターをループにリタイムすることはできません。したがって、ループ内のロジックをできるだけ小さくして、fMAXに悪影響を与えないようにしてください。

事前計算後、ループ内でロジックが最小化され、デザインはエンコードを事前計算します。計算はループの外にあり、パイプライン化またはリタイミング化で最適化することができます。ループを削除することはできませんが、ループのデザインスピードへの影響をより適切に制御できます。

図 57. 高価なループによるデザインの再構築

次のコード例は、同様の問題を示しています。元のループには比較演算子が含まれています。

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;