インテルのみ表示可能 — GUID: esc1445886540528
Ixiasoft
2.4.2.1. 高速クロック・ドメイン
2.4.2.2. ループの再構築
2.4.2.3. コントロール信号のバックプレッシャー
2.4.2.4. FIFOステータス信号によるフロー・コントロール
2.4.2.5. スキッドバッファーを使用したフロー制御
2.4.2.6. リードモディファイライトメモリー
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. 三進加算器
インテルのみ表示可能 — GUID: esc1445886540528
Ixiasoft
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;