Main Content

遅延の均衡化

遅延の均衡化を使用する理由

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

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

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

遅延の均衡化の指定

遅延の均衡化はモデル全体に設定できます。より詳細な制御が必要な場合は、最上位テスト対象デバイス (DUT) サブシステム内のサブシステムに遅延の均衡化を設定することもできます。

モデルの遅延の均衡化の設定

次の makehdl オプションを使用します。

  • BalanceDelays: 既定では、モデルレベルの遅延の均衡化は有効で、モデル内のサブシステムはモデルレベルの設定を継承します。モデルの遅延の均衡化の設定方法については、遅延の均衡化を参照してください。

  • GenerateValidationModel: 既定では、検証モデルの生成は無効になっています。遅延の均衡化を有効にした場合は、検証モデルを生成して元のモデルと生成されたモデルの間の遅延などの相違を表示します。検証モデルの生成を有効にする方法については、HDL コードのモデル生成のパラメーターの「検証モデルを生成」を参照してください。

たとえば、次のコマンドでは、遅延の均衡化を使用して検証モデルを生成する HDL コードが生成されます。

dut = 'ex_rsqrt_delaybalancing/Subsystem';
makehdl(dut,'BalanceDelays','on','GenerateValidationModel','on');

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

遅延の均衡化は、モデル全体または最上位 DUT サブシステム内のサブシステムで無効にできます。たとえば、コントロール パスで遅延の均衡化を行わない場合は、コントロール パスをサブシステム内に配置し、このサブシステムで遅延の均衡化を無効にします。

最上位 DUT サブシステム内のサブシステムで遅延の均衡化を無効にするには、モデルレベルで遅延の均衡化を無効にします。モデルで遅延の均衡化を無効にすると、最適化やブロック実装によって生成モデルに挿入されたレイテンシは検証モデルでは補正されません。このため、検証モデルで元のモデルと生成されたモデル間の不一致が示されることがあります。

最上位 DUT サブシステム内のサブシステムで遅延の均衡化を無効にするためのワークフローは、次のとおりです。

  • モデルの遅延の均衡化を無効にします。

  • 最上位 DUT サブシステムの遅延の均衡化を有効にします。

  • DUT サブシステム内のサブシステムの遅延の均衡化を無効にします。

遅延の均衡化がモデルで有効になっている場合、個々のサブシステムでの遅延の均衡化の設定は無視されます。サブシステムの遅延の均衡化の設定を参照してください。

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

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

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

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

グローバルな遅延の均衡化を無効にする場合のベスト プラクティス

モデルで遅延の均衡化が無効になっている場合は、次のようにします。

グローバルな遅延の均衡化を使用しない HDL コードの生成

グローバルな遅延の均衡化をオフにする必要がある使用例がいくつか考えられます。モデルの遅延の均衡化を無効にするには、次のようにします。

  • コマンド ラインで、モデルの BalanceDelays オプションを無効にします。コマンド ライン情報を参照してください。R2021b 以降では、BalanceDelays オプションはモデル コンフィギュレーション パラメーターのグローバル オプションではなくなりました。

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

遅延の均衡化の制限

遅延の均衡化に失敗した場合、hdlcoder.optimizeDesign は生成された HDL コードを最適化できません。

サポートされていないブロック

次のブロックおよびサブシステムは遅延の均衡化をサポートしていません。

  • Triggered Subsystem

  • HDL Cosimulation

  • Data Type Duplicate

  • Decrement To Zero

  • Ground

  • LMS Filter

  • Model Reference

  • To VCD File

  • Magnitude-Angle to Complex

ブロック モードの制限

[NoHDL] アーキテクチャをもつブロックは、遅延の均衡化をサポートしていません。

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

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

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

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

  • ブロックが条件付きサブシステム内にあり、パイプライン遅延をもつ。

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

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

その他の制限

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

  • フィードバック ループ内で遅延が発生しており、HDL Coder がパス遅延を均衡化できない。たとえば、フィードバック ループ内にクロックレート パイプラインを適用した場合に、HDL Coder のクロックレートで遅延が発生し、遅延の均衡化が失敗することがあります。

    クロックレートの遅延数を低減するには、オーバーサンプリング係数の値を高くします。

  • サンプル時間が離散的でない、または、最遅レートに対する最速レートのサンプル時間の比が大きすぎる。

Constant ブロックの遅延の均衡化

遅延の均衡化が有効化されている DUT サブシステム内に Constant ブロックが入力として存在する場合、検証モデルの初期シミュレーションで不一致が発生します。DUT サブシステム内のこのモデルについて考えます。値 1 を出力する Constant ブロックは、HDL ブロックの [OutputPipeline] プロパティが 1 に設定されています。

この図は生成された検証モデルを示しています。Delay ブロックに挿入されたパイプライン レジスタを均衡化するために、遅延の均衡化によって、一致する遅延が入力端子に追加されています。ブロックの出力値が定数であるため、値 2 をもつ Constant ブロックが含まれる並列パスでは、コード ジェネレーターは一致させるための遅延を挿入しません。挿入されていないこの遅延が初期シミュレーションの不一致につながります。

シミュレーションの不一致を解決するには、検証モデルにおいて、値 2 をもつ Constant ブロックの出力に、一致させるための遅延を手動で追加します。

遅延の均衡化レポート

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

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

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

関連する例

詳細