Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

遅延の均衡化

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

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

この問題を回避するために、HDL Coder では、遅延の均衡化を使用できます。既定では、モデルで遅延の均衡化が有効になっています。HDL Coder が特定のパスで新しい遅延が導入されたことを検出すると、もう一方のパスに同じ遅延を挿入します。遅延の均衡化を有効にした場合、生成されるモデルは機能的に元のモデルと同等になります。モデルで遅延の均衡化を無効にすることは推奨されません。この設定を無効にした場合、HDL Coder は検証モデルで数値の不一致が発生する可能性を示す警告を生成します。この警告を修正するには、モデルで遅延の均衡化を有効にするか、遅延の均衡化の設定をチェックのモデルのチェックを実行します。

遅延の均衡化の指定

遅延の均衡化は、テスト対象デバイス (DUT) サブシステムの端子、最上位の 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] を無効にした場合、安定したパスが下位階層に伝播されると、安定したパスでの遅延の均衡化は下位階層では発生しません。例については、遅延の均衡化のスコープの制御の「遅延の均衡化をデータ パスに制約」セクションを参照してください。

サブシステムの遅延の均衡化を無効にすると、その設定は、サブシステム内の Inport ブロックの [BalanceDelays] プロパティの on 設定より優先されます。たとえば、[BalanceDelays]on に設定された Inport ブロックを含むモデルまたはサブシステムの遅延の均衡化を無効にする場合、その Inport ブロックの遅延の均衡化を無効にする必要はありません。

メモ

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

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

サブシステムの遅延の均衡化の無効化

モデル内の特定のサブシステムで遅延の均衡化を無効にして遅延の均衡化を局所化できます。サブシステムでの遅延の均衡化の無効化は高度なユース ケースでのみ推奨され、検証モデルで不一致が発生する可能性があります。サブシステムで遅延の均衡化を無効にするには、サブシステムの HDL ブロック プロパティ BalanceDelays を使用します。

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

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

モデルで遅延の均衡化を無効にした場合、最適化やブロック実装によって挿入されたレイテンシが HDL Coder で補正されません。不均衡な遅延により、HDL コードと Simulink® モデルの間にシミュレーション結果の不一致が生じることがあり、ハードウェア実装の予期しない未テストの動作が発生する可能性があります。検証モデルを生成して、こうした不均衡な遅延の影響を確認することをお勧めします。検証モデルを生成するには、コンフィギュレーション パラメーター [検証モデル] を参照してください。遅延の均衡化と検証モデルの例については、HDL Coder の遅延の均衡化と検証モデル ワークフローおよび遅延の均衡化による数値の不一致の解決を参照してください。

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

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

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

Delay balancing unsuccessful because an extra 3 cycles of latency introduced in the feedback loop cannot be absorbed. Consider increasing the latency budget by adding more design delays in the feedback loop or using clock-rate pipelining. If clock-rate pipelining is already enabled, refer to "highlightClockRatePipelining.m" for further diagnostics.

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

グローバルな遅延の均衡化の無効化

グローバルな遅延の均衡化を無効にする必要がある場合、次のようにしてモデル設定を無効にできます。

  • コマンド ラインでモデルの BalanceDelays オプションを無効にする。[遅延の均衡化] パラメーターについては、コマンド ライン情報セクションを参照してください。R2021b 以降では、このパラメーターを [コンフィギュレーション パラメーター] ウィンドウから無効にすることはできません。

  • 診断オプション TreatBalanceDelaysOffAsWarning または None に変更する。このオプションを使用すると、BalanceDelays を無効にしたためにモデルで不均衡な遅延が生じる場合は強調表示されます。詳細については、生成された HDL コード内での不均衡な遅延の有無をチェックを参照してください。

モデルで遅延の均衡化を無効にする場合は次のようにします。

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

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

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

  • モデルで遅延の均衡化をオンにする必要があります。

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

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

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

遅延の均衡化レポート

遅延の均衡化情報をレポートで見るには、各サブシステムまたはモデル参照のコードを生成する前に、最適化レポートを有効にします。[HDL コード生成] タブで、[レポート] を選択して、[最適化レポートを生成] を選択します。

各サブシステム、モデル参照、または MATLAB Function ブロックのコードを生成すると、HDL Coder は最適化レポートを生成します。レポートの [遅延の均衡化] セクションを選択します。

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

遅延の均衡化の制限

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

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

  • 1 つの Atomic Subsystem または Model Reference のすべてのインスタンスに対して、BalanceDelaysブロック プロパティが異なる値に解決される。

    このエラーを修正するには、Atomic Subsystem または Model Reference のすべてのインスタンスで BalanceDelays を有効にします。

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

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

サンプル時間の制限

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

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

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

関連する例

詳細