このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。
1. インテル® Hyperflex™ HyperFlex FPGAアーキテクチャーの概要
2. インテル® Hyperflex™ アーキテクチャーRTLデザイン・ガイドライン
3. インテル® Hyperflex™ アーキテクチャー・デザインのコンパイル
4. デザイン例ウォークスルー
5. リタイミングの制限と対処方法
6. 最適化の例
7. インテル® Hyperflex™ アーキテクチャーの移植ガイドライン
8. 付録
9. インテル® Hyperflex™ アーキテクチャー高性能デザイン・ハンドブック
10. インテル® Hyperflex™ アーキテクチャー高性能デザイン・ハンドブック
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. 三元加算器
5.2.1. Insufficient Registers
5.2.2. Short Path/Long Path
5.2.3. Fast Forwardの制限
5.2.4. ループ
5.2.5. クロックドメインごとに1つのクリティカル・チェイン
5.2.6. 関連するクロックグループのクリティカル・チェイン
5.2.7. 複雑なクリティカル・チェイン
5.2.8. 配置可能ノードの拡張
5.2.9. ドメイン境界エントリとドメイン境界出口
5.2.10. デュアル・クロック・メモリーを備えたクリティカル・チェイン
5.2.11. クリティカル・チェインビットとバス
5.2.12. ディレイライン
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;