デザインをコード記述する際には、推論されるロジックに注意してください。次の状況で、パイプラインをさらに考慮する必要があるかどうかを調べます。
- ファンインの大きいロジック コーン
たとえば、出力の算出に大きなバスや複数の組み合わせ信号を必要とするコードです。
- 配置に制限がある、clock-to-out が遅い、またはセットアップ要件が大きいブロック
たとえば、出力レジスタのないブロック RAM または正しくパイプラインされていない演算コードです。
- 長い配線の原因となる指定配線
たとえば、ピン配置により配線がチップを横断する必要がある場合、高速動作を可能にするためにパイプラインが必要です。
- 大型の XOR 関数で構成されるロジック
大型の XOR 関数は、スイッチング レートが高く、ダイナミック消費電力が大きくなる可能性があります。これらの関数をパイプライン処理してスイッチングを削減すると、回路の消費電力を削減できる可能性があります。
次の図では、クロック速度が次のものによって制限されます。
- ソース フリップフロップの clock-to-out タイム
- 4 段のロジックを介するロジック遅延
- 4 個のファンクション ジェネレーターに関連した配線
- デスティネーション レジスタのセット アップ タイム
図 1. パイプライン処理前
次のいずれかの方法を使用して、デザインでパイプライン レジスタが正しく使用されるようにします。
- RTL コードで、リタイミングするロジックの前または後、可能であれば階層内にレジスタを追加します。
- Vivado 合成のグローバル リタイミングまたは BLOCK_SYNTH.RETIMING オプションを使用します。これは、パスのタイミングを解析し、可能であればレジスタを移動してタイミングを改善します。
- 別の方法として、より詳細に制御するため、
retiming_forward
およびretiming_backward
合成属性を使用します。これらの属性を特定のレジスタに追加すると、ロジックのタイミング スコアにかかわらず、組み合わせロジックを介してツールをリタイミングできます。これらの属性の詳細は、 『Vivado Design Suite ユーザー ガイド: 合成』 (UG901) を参照してください。
次の図に、レジスタを追加後のパイプライン処理を示します。
図 2. レジスタを追加後のパイプライン処理
次の図は、パイプライン処理前と同じデータパスの例です。フリップフロップがファンクション ジェネレーターと同じスライスに含まれているので、クロック速度はソース フリップフロップの clock-to-out 時間、1 段のロジックを介するロジック遅延、配線遅延、デスティネーション レジスタのセットアップ タイムによって制限されます。この例では、パイプライン処理およびリタイミング後は、元のデザインよりシステム クロックが高速になります。
図 3. リタイミング後にパイプライン処理
次に、リタイミング属性を使用して、「リタイミング後にパイプライン処理」の図に示す特定のリタイミングを強制的に実行する方法を示すコード例を示します。
(* retiming_backward = 3 *) reg reg1;
(* retiming_backward = 2 *) reg reg2;
(* retiming_backward = 1 *) reg reg3;