Main Content

遅延の均衡化

モデルでハードウェアの効率的な使用と高いクロック レートを実現するために、HDL Coder™ には、離散型遅延をモデルに導入する最適化、ブロック実装およびオプションがいくつかあります。出力パイプライン、ストリーミング、リソース共有などの最適化では遅延が発生することがあります。ニュートン・ラフソン アーキテクチャや CORDIC アーキテクチャなどの一部のブロック実装では、その性質上、生成されたコードで遅延が発生します。

最適化やブロック実装のオプションによってモデルのクリティカル パスに遅延が導入された場合、他の並列信号パスには同等の遅延が導入されないため、元のモデルと生成されたモデルまたは HDL コードで互いに数値的計算に相違が生じることがあります。これは、他方の並列信号パスには同等の遅延が導入されないためです。並列信号パスに手動で補正のための遅延を挿入することもできますが、間違いを起こしやすく、多くの信号パスや複数のサンプル レートをもつ大規模なモデルには拡張できません。

この問題を回避するために、HDL Coder には遅延の均衡化が用意されています。HDL Coder によって特定のパスで新しい遅延が導入されたことが検出されると、他のパスに同じ遅延が挿入されます。

遅延の均衡化の指定

遅延の均衡化は、テスト対象デバイス (DUT) サブシステムの端子に対して設定できます。入力端子および出力端子に対する HDL ブロック プロパティ [BalanceDelays] を使用して、設計の特定の部分に対する遅延の均衡化を無効にできます。遅延の均衡化における考慮事項を参照してください。

定数ソースの遅延の均衡化の無効化

"安定したパス" とは、パスへの初期ソースが定数であるパスのことです。モデルに DUT の外部の安定したパスが含まれており、最上位の DUT サブシステムに接続されている場合に、必要なリソースの量を削減するには、DUT レベルの Inport ブロックで HDL ブロック プロパティ [BalanceDelays] を無効にすることで、安定したパスでの遅延の均衡化を無効にします。[BalanceDelays] プロパティは、DUT レベルの Inport ブロックにのみ影響します。たとえば、このモデルでは、Inport ブロックへの入力が Constant ブロックであるため、DUT_SubsystemInport ブロック (入力端子 h_in1 でもある) の [BalanceDelays] を無効にできます。

DUT subsystem with a constant input coming into the DUT through an Inport block

[HDL ブロック プロパティ] ダイアログ ボックスを使用して、Inport ブロックの HDL ブロック プロパティ [BalanceDelays] を無効にするには、以下を行います。

  1. Inport ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [BalanceDelays][off] に設定します。

コマンド ラインで Inport ブロックの遅延の均衡化を無効にするには、関数 hdlset_param を使用します。

DUT にサブシステム階層があり、DUT レベルの Inport ブロックで [BalanceDelays] を無効にした場合、安定したパスが下位階層に拡張されると、その安定したパスでの遅延の均衡化は下位階層内では発生しません。例については、遅延の均衡化のスコープの制御を参照してください。

メモ

DUT レベルの Inport ブロックで安定したパスに対する [BalanceDelays] を無効にする場合に、モデルで分散型パイプラインが有効になっていて、生成されたモデルで安定したパスに遅延が挿入されるときは、[パイプライン分散の優先順位] コンフィギュレーション パラメーターを [数値の整合性] から [パフォーマンス] に変更します。詳細については、Pipeline distribution priorityを参照してください。

[HDL ブロック プロパティ] ダイアログ ボックスを使用して、Outport ブロックの HDL ブロック プロパティ [BalanceDelays] を無効にするには、以下を行います。

  1. Outport ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [BalanceDelays][off] に設定します。

コマンド ラインで Outport ブロックの遅延の均衡化を無効にするには、関数 hdlset_param を使用します。

DUT を起点とする安定したパスがモデルに含まれている場合、DUT に入力として Constant ブロックがあることを意味します。その安定したパスへの並列パスに最適化によって生じるレイテンシがある場合、Constant ブロックの出力値は定数であるため、このブロックを含む安定したパスに遅延の均衡化で一致する遅延は挿入されません。遅延が挿入されないため、設計に必要なリソースは少なくなりますが、初期シミュレーションで不一致が発生します。シミュレーションの不一致を解決するには、HDL ブロック プロパティ [OutputPipeline]Constant ブロックの出力で必要な一致する遅延の数に設定して、Constant ブロックのパスに一致する遅延を追加します。

遅延の均衡化における考慮事項

HDL コードを生成する場合、遅延の均衡化はコード最適化の主要部分になります。最適化が有効になっている場合は、その最適化の一環として導入されるパイプラインを均衡化する必要があります。自動的に挿入されたパイプライン遅延が均衡化されていないと、ハードウェアに展開される生成コードに問題が生じます。

マルチレート モデルでは、HDL Coder で多数のパイプライン レジスタが生成されて、HDL 設計が FPGA に適合しなくなる可能性があります。モデルで遅延の均衡化を無効にする前に、Delay Balancing on Multirate Designsおよびレート差の大きいマルチレート設計ための生成された HDL コードの最適化を参照してください。

フィードバック ループ設計における遅延の均衡化のエラーの解決

モデルで遅延の均衡化を有効にしている場合、そのモデルの DUT サブシステムにフィードバック ループが含まれていると、HDL コード生成時に次のエラーが表示されることがあります。

An extra 10 cycles of latency introduced by optimizations in the feedback loop cannot be offset using design delays for the loop latency budget. If you are modeling at data rate (high-level description of algorithm without hardware implementation details), refer to the clock-rate pipelining report for more details. If you are modeling at clock rate, consider increasing the latency budget by adding more design delays in the feedback loop. Refer to the delay balancing report for more details. Offending block: <modelname>/Subsystem/Add1 .エラー メッセージには、クロックレート パイプライン レポートと遅延の均衡化レポートへのリンクが含まれています。

この場合のエラーの原因は、フィードバック ループ内のパイプラインでレイテンシが発生し、元のモデルと生成されたモデルの間で機能的等価性が失われることにあります。一方、モデル全体で遅延の均衡化を無効にすると、元のモデルと生成されたモデルの間でシミュレーションの不一致が発生します。この問題を解決するには、次のいずれかを行います。

遅延の均衡化における遅延吸収

遅延の均衡化による最適化では、最適化によって生じるパイプライン遅延の代わりに設計上の遅延を使用することで、使用されないレイテンシが設計に追加されることを防ぐ "遅延吸収" がモデルに適用されます。分散型パイプラインなどの他のパイプラインによる最適化と同様、遅延吸収により、最適化によってレイテンシが生じるポイントに既存の遅延が移動します。遅延吸収を使用することで、レイテンシを加味したモデル化が可能になります。つまり、元の設計に設計上の遅延を追加して、生成された設計で最適化によって生じる余分な遅延をシミュレートできます。設計上の遅延が十分にあれば、最適化によって生じる余分な遅延が吸収され、DUT 出力端子で追加のレイテンシのサイクルが報告されません。レイテンシを加味したモデル化により、元のモデルと生成されたモデルの間でタイミングの差が生じなくなり、生成される HDL コードと機能的に等価なモデルが HDL Coder で生成されます。クロック レートでのレイテンシを加味したモデル化は、信号処理や無線システムの設計など、高周波数、高スループットのアプリケーションに役立ちます。詳細については、Use Delay Absorption While Modeling with Latencyを参照してください。

HDL コード生成時に遅延吸収を実行するには次のようにします。

  • レイテンシを発生させるブロックの後に、ブロックのレイテンシ以上の長さの遅延をもつ Delay ブロックを配置します。Delay ブロックは、レイテンシを発生させるブロックの下流であれば、データ パスの任意の位置に配置できます。たとえば、累積して大量のレイテンシを発生させる一連の浮動小数点演算子がある場合、演算子による合計レイテンシと等しい長さの遅延をもつ単一の Delay ブロックを一連の演算子の最後に配置できます。

  • Triggered Subsystem の内部で遅延吸収を実行するには、モデル パラメーター [トリガー信号をクロックとして使用] を有効にします。

浮動小数点演算子と遅延吸収の詳細については、ネイティブ浮動小数点のレイテンシに関する考慮事項を参照してください。

遅延の均衡化レポート

テスト対象設計 (DUT) のコードを生成すると、HDL Coder で最適化レポートが生成されます。レポートの [遅延の均衡化] セクションを選択します。DUT はサブシステム、モデル、またはモデル参照にすることができます。

遅延の均衡化レポートには、出力端子におけるレイテンシの変化、パイプライン遅延、および位相遅延、遅延吸収情報、および遅延を一致させるために出力端子に追加されたパイプラインの数が表示されます。遅延の均衡化が失敗した場合、レポートには、違反した基準と、遅延の均衡化の失敗の原因となった任意のブロックまたはサブシステムへのリンクが表示されます。

遅延の均衡化の制限

サブシステムレベルの制限

HDL Coder は、次の場合、遅延の均衡化をサポートしていません。

  • アーキテクチャが [BlackBox] であるサブシステムで、[ImplementationLatency] ブロック プロパティが負の値に設定されている。

    このエラーを修正するには、[ImplementationLatency] に非負の整数を入力します。

サンプル時間の制限

HDL Coder では、最適化によるレイテンシを導入する場合、次の状況では遅延の均衡化がサポートされません。

  • サンプル時間が連続である。

  • 設計に無限大のサンプル時間の出力がある。

関連する例

詳細