HDL Coder での遅延の均衡化の理解
モデルでハードウェアの効率的な使用と高いクロック レートを実現するために、HDL Coder™ には、導入される Delay ブロックの形式で離散型レイテンシを生成モデルに追加する最適化、ブロック実装、およびオプションがいくつかあります。出力パイプライン、ストリーミング、リソース共有などの最適化ではそのようなレイテンシが発生することがあります。ニュートン・ラフソン アーキテクチャや CORDIC アーキテクチャなどの一部のブロック実装では、その性質上、生成された HDL コードの信号パスでレイテンシが発生します。最適化やブロック実装のオプションによってモデルのクリティカル パスにレイテンシが導入された場合、他の並列信号パスには同等の遅延が導入されないため、元のモデルと生成されたモデルまたは HDL コードの特定のタイム ステップで数値的計算に相違が生じることがあります。
元のモデルと生成されたモデルまたは HDL コードの "サイクル アキュレート" な等価性が設計要件である場合は、導入されるレイテンシの補正のために Delay ブロックをモデルに手動で追加できます。フィードバック ループをサイクル アキュレートな動作にするために、補正のための Delay ブロックを追加することもできます。例については、Use Delay Absorption While Modeling with Latencyを参照してください。ただし、補正のための Delay ブロックの手動による追加は、間違いを起こしやすく、多くの信号パスや複数のサンプル レートをもつ大規模なモデルには拡張できません。
遅延の均衡化による最適化では、元のモデルと生成されたモデルまたは HDL コードの間で各タイム ステップの数値的計算が照合されます。あるパスでレイテンシが導入されたことが HDL Coder で検出されると、遅延の均衡化により、生成されたモデルの他のパスに同じ遅延が挿入されます。
遅延の均衡化のスコープの制御
遅延の均衡化は、HDL Coder でのコードの生成時に既定で有効になります。入力端子および出力端子に対する HDL ブロック プロパティ [BalanceDelays] を使用して、設計の特定の部分に対する遅延の均衡化を無効にできます。遅延の均衡化における考慮事項を参照してください。
定数ソースの遅延の均衡化の無効化
"安定したパス" とは、パスへの初期ソースが定数であるパスのことです。モデルに DUT の外部の安定したパスが含まれており、最上位の DUT サブシステムに接続されている場合に、必要なリソースの量を削減するには、DUT レベルの Inport ブロックで HDL ブロック プロパティ [BalanceDelays] を無効にすることで、安定したパスでの遅延の均衡化を無効にします。[BalanceDelays] プロパティは、DUT レベルの Inport ブロックにのみ影響します。たとえば、このモデルでは、Inport ブロックへの入力が Constant ブロックであるため、DUT_Subsystem
の Inport ブロック (入力端子 h_in1
でもある) の [BalanceDelays] を無効にできます。
[HDL ブロック プロパティ] ダイアログ ボックスで Inport ブロックの HDL ブロック プロパティ [BalanceDelays] を無効にするには、以下を行います。
Inport ブロックを右クリックします。
[HDL コード] 、 [HDL ブロック プロパティ] を選択します。
[BalanceDelays] を
[off]
に設定します。
コマンド ラインで Inport ブロックの遅延の均衡化を無効にするには、関数 hdlset_param
を使用します。
DUT にサブシステム階層があり、DUT レベルの Inport ブロックで [BalanceDelays] を無効にした場合、安定したパスが下位階層に拡張されると、その安定したパスでの遅延の均衡化は下位階層内では発生しません。例については、遅延の均衡化のスコープの制御を参照してください。
メモ
モデルで分散型パイプラインが有効になっている場合、DUT レベルの Inport ブロックで安定したパスに対する [BalanceDelays] を無効にすると、生成されたモデルで安定したパスに遅延が挿入されることがあります。生成されたモデルで安定したパスに遅延が挿入されないようにするには、[パイプライン分散の優先順位] コンフィギュレーション パラメーターを [数値の整合性]
から [パフォーマンス]
に変更します。詳細については、Pipeline distribution priorityを参照してください。
[HDL ブロック プロパティ] ダイアログ ボックスを使用して、Outport ブロックの HDL ブロック プロパティ [BalanceDelays] を無効にするには、以下を行います。
Outport ブロックを右クリックします。
[HDL コード] 、 [HDL ブロック プロパティ] を選択します。
[BalanceDelays] を
[off]
に設定します。
コマンド ラインで Outport ブロックの遅延の均衡化を無効にするには、関数 hdlset_param
を使用します。
DUT を起点とする安定したパスがモデルに含まれている場合、DUT に入力として Constant ブロックがあることを意味します。その安定したパスへの並列パスに最適化によって生じるレイテンシがある場合、Constant ブロックの出力値は定数であるため、このブロックを含む安定したパスに遅延の均衡化で一致する遅延は挿入されません。遅延が挿入されないため、設計に必要なリソースは少なくなりますが、初期化サイクルにおいてシミュレーションの不一致が発生します。シミュレーションの不一致を解決するには、HDL ブロック プロパティ [OutputPipeline] を Constant ブロックの出力で必要な一致する遅延の数に設定して、Constant ブロックのパスに一致する遅延を手動で追加します。
遅延の均衡化レポート
DUT のコードを生成すると、HDL Coder で最適化レポートが生成されます。DUT はサブシステム、モデル、またはモデル参照にすることができます。
[遅延の均衡化] レポートには、レイテンシの変化、出力端子におけるパイプライン遅延と位相遅延、および遅延吸収情報が表示されます。遅延の均衡化が失敗した場合、レポートには、違反した基準と、遅延の均衡化の失敗の原因となったブロックまたはサブシステムへのリンクが表示されます。
遅延の均衡化における考慮事項
最適化を有効にして HDL コードを生成する場合、それらの最適化中に導入されるパイプラインを均衡化する必要があります。自動的に挿入されたパイプライン遅延が均衡化されていないと、ハードウェアに展開される生成コードで数値的計算に不一致が生じることがあります。
マルチレート モデルでは、HDL Coder によって多数のパイプライン レジスタが生成コードに挿入されて、ハードウェアで大量のリソースが消費される可能性があります。このリソース使用量を最小限に抑える方法の詳細については、Delay Balancing on Multirate Designsおよびレート差の大きいマルチレート設計ための生成された HDL コードの最適化を参照してください。
フィードバック ループ設計における遅延の均衡化のエラーの解決
DUT サブシステムにフィードバック ループを含むモデルの HDL コードを生成する場合、フィードバック ループ内の最適化によって生じるレイテンシについて、ループのレイテンシの割り当てに対する設計上の遅延を使用してオフセットできない余分なサイクルがあると、[クロック レート パイプライン] レポートおよび [遅延の均衡化] レポートでその詳細が示されます。モデル全体で遅延の均衡化を無効にすると、元のモデルと生成されたモデルの間でシミュレーションの不一致が発生します。この不一致を解決するには、次のいずれかを行います。
クロックレート パイプラインを使用する。Resolve Simulation Mismatch When Pipelining with a Feedback Loop Outside the DUTの "Use Clock-Rate Pipelining" セクションを参照してください。
設計上の遅延をさらに追加してレイテンシの割り当てを増やす。Use Delay Absorption While Modeling with Latencyの "Model with Latency in a Feedback Loop" セクションを参照してください。
遅延の均衡化の制限
サブシステムレベルの制限
アーキテクチャが [BlackBox]
であるサブシステムで [ImplementationLatency] ブロック プロパティが負の値に設定されている場合、HDL Coder で遅延の均衡化はサポートされません。
このエラーを修正するには、[ImplementationLatency] に非負の整数を入力します。
サンプル時間の制限
HDL Coder では、最適化によるレイテンシを導入する場合、次の状況では遅延の均衡化がサポートされません。
サンプル時間が連続である。
設計に無限大のサンプル時間の出力がある。