Main Content

HDL コード生成での Delays ブロックと Goto ブロックおよび From ブロックの使用に関するガイドライン

以下のガイドラインでは、モデルで遅延をモデル化するための推奨設定を示します。[Discrete] ライブラリで使用できるブロックを使用して遅延をモデル化します。各ガイドラインに準拠要件のレベルを示す重大度レベルが割り当てられています。詳細については、HDL モデリング ガイドラインの重大度レベルを参照してください。

レジスタとしての Delay ブロックの適切な使用

ガイドライン ID

2.6.1

重大度

推奨

説明

ターゲット FPGA 上でフリップフロップとして推測されるモデル内のブロックには、Delay ブロックを使用します。ローカル リセットを指定し、各 Delay ブロックの信号を有効にできます。

既定では、ブロックの [遅延の長さ]2 に設定されます。この場合、2 タイム ステップの後にブロックへの入力が出力に渡されます。[遅延の長さ]0 に設定されている場合、入力は遅延なしで出力に渡されます。生成された HDL コードは、ブロックを wire として扱います。ターゲット デバイス上のフリップフロップまたはレジスタを推測するには、[ソース][ダイアログ] に設定し、[遅延の長さ] に 0 より大きい値を指定します。

外部イネーブル端子をもつか Enabled Subsystem ブロック内にある Delay ブロックを使用する場合は、同期モードで State Control ブロックを使用することをお勧めします。同様に、外部リセット端子をもつか Resettable Subsystem ブロック内にある Delay ブロックを使用する場合は、同期モードで State Control ブロックを使用することをお勧めします。詳細については、Delayでの HDL コード生成を参照してください。

HDL コード生成で Unit Delay EnabledUnit Delay Resettable、および Unit Delay Enabled Resettable ブロックは使用しないでください。これらのブロックは削除されています。代わりに、これらのブロックを Unit Delay Enabled SynchronousUnit Delay Resettable Synchronous、および Unit Delay Enabled Resettable Synchronous ブロックに置き換えてください。これらのブロックでは、同期ハードウェア モードで State Control ブロックを使用します。モデルでこのブロック置換を実行するには、モデル チェック旧式の Unit Delay Enabled/Resettable ブロックのチェックを実行します。

タイミングの差を回避するための遅延の吸収

ガイドライン ID

2.6.2

重大度

推奨

説明

特定のブロック実装、浮動小数点演算、および分散型パイプライン方式などの最適化設定により、生成された HDL コードや生成されたモデルでレイテンシが発生することがあります。追加のレイテンシにより、結果的に元のモデルと生成されたモデルの間にタイミングの差が生じます。フィードバック ループで制御システムを使用するときなど、このタイミングの差を回避するには、遅延を吸収できるモデリング パターンを使用します。遅延を吸収するには以下を実行します。

  • レイテンシを発生させるブロックの後に Delay ブロックを配置します。

  • Delay ブロックの [遅延の長さ] をブロックのレイテンシと等しい値に設定します。

Delay ブロックを元のモデルに追加すると、元のモデルをレイテンシを加味してシミュレートできます。

レイテンシを発生させる可能性があるブロックには以下があります。

  • カスタム レイテンシ値がゼロより大きい Divide、Sqrt、および Reciprocal ブロック。

  • [関数]sincossincoscos+jsin、または atan2 に設定され、HDL アーキテクチャが CORDIC に設定された Trigonometric Function ブロック

  • LatencyStrategyMaxMin、またはゼロより大きいカスタム値に設定されたネイティブ浮動小数点演算子。

固定小数点型のカスタム レイテンシをもつブロックについて確認するには、HDLMathLib ライブラリを開きます。ライブラリに制御信号をもつ固定小数点ブロックが含まれています。

open_system('HDLMathLib')

HDL Coder™ での遅延の吸収方法について確認するには、モデル hdlcoder_absorb_delay_timing を開きます。

open_system('hdlcoder_absorb_delays')
set_param('hdlcoder_absorb_delays', 'SimulationCommand', 'Update')

HDL_DUT サブシステム内を参照すると、Divide ブロックの横に [遅延の長さ]12 と等しい Delay ブロックが表示されます。この [遅延の長さ] は、固定小数点データ型の除算演算のレイテンシに対応します。この場合、必要な [遅延の長さ] は、ビット幅 84 の和の 12 になります。

open_system('hdlcoder_absorb_delays/HDL_DUT')

DUT サブシステムの HDL コードを生成するには、関数 makehdl を使用します。

makehdl('hdlcoder_absorb_delays/HDL_DUT')

生成されたモデルでは、Divide ブロックの横の遅延がブロックのレイテンシに吸収されます。この Divide ブロックをダブルクリックすると、元の Divide ブロックと [遅延の長さ]12 の Delay ブロックが表示されます。

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

分散型パイプライン方式などの最適化により、レイテンシが発生することがあります。たとえば、モデル hdlcoder_absorb_delay_sharing を開きます。DUT サブシステムには 2 つのサブシステム sub_scalarsub_add が含まれています。

open_system('hdlcoder_absorb_delay_sharing')
set_param('hdlcoder_absorb_delay_sharing', 'SimulationCommand', 'Update')

sub_scalar サブシステムは、横に単位遅延がある 12 個の Product ブロックで構成されています。それらの Product ブロックを共有するために、sub_scalar サブシステムで SharingFactor12 に指定されています。

open_system('hdlcoder_absorb_delay_sharing/DUT/sub_scalar')

DUT サブシステムの HDL コードを生成するには、関数 makehdl を使用します。

makehdl('hdlcoder_absorb_delay_sharing/DUT')

SharingFactor1 より大きい値を指定すると、HDL コード生成後に 1 サンプル遅延をもつ Deserializer ブロックが挿入されます。Product ブロックの横の単位 Delay ブロックを元のモデルに追加すると、共有の最適化の実行後に、それらの遅延が Product ブロックに吸収されます。

生成されたモデルでは、遅延が Deserializer ブロックに吸収されます。

大きな遅延のブロック RAM へのマッピング

ガイドライン ID

2.6.3

重大度

推奨

説明

面積を節約するため、大きな設計上の遅延やパイプライン遅延が設計に含まれる場合は、遅延を FPGA のブロック RAM および UltraRAM リソースにマッピングできます。設計上の遅延は、Delay ブロックや状態をもつ他のブロック (QueueHDL FIFOBuffer ブロックなど) を使用して手動で設計に挿入する遅延です。パイプライン遅延は、最適化設定やブロック実装設定 (ニュートン・ラフソン実装など) によって生成される遅延です。

設計上の遅延を RAM にマッピングするには、次のようにします。

  • Delay ブロックの [HDL ブロック プロパティ] ダイアログ ボックスで、[UseRAM][on] に設定します。このオプションを設計のすべての Delay ブロックにプログラムで設定する方法については、複数のブロックの HDL ブロック パラメーターのプログラムによる設定を参照してください。

  • 非常に大きな遅延を UltraRAM リソースにマッピングする場合は、生成された HDL コードで ram_style 属性を指定できます。

    -- This VHDL code shows the ramstyle attribute set to ultra:
    
     attribute ram_style: string;
     attribute ram_style of ram : signal is "ultra";
    
    // This Verilog code shows the ramstyle attribute set to ultra:
    
    (* ram_style = "ultra" *)
  • ストリーミングおよび分散型パイプライン方式の影響で説明されているように、[UseRAM][off] の場合でも、RAM マッピングのしきい値 (ビット)パラメーターを使用して、しきい値を超える大きな遅延をマッピングできます。このしきい値は、RAM にマッピングする遅延の大きさに応じて変更できます。

  • MATLAB Function ブロックを使用する場合は、HDL アーキテクチャを [MATLAB Datapath] に設定し、MapPersistentVarsToRAM HDL ブロック プロパティを [on] に設定することで、MATLAB® コードの永続変数を RAM にマッピングできます。

最適化によって挿入されるパイプライン遅延については、遅延の均衡化により、一致する遅延が並列パスに自動的に挿入されます。クリティカル パスの遅延の長さと並列パスのベクトル要素の数が大きい値をとる場合、パイプライン遅延も非常に大きくなることがあります。

それらの大きな遅延をブロック RAM にマッピングするには、次のようにします。

  • RAM へのパイプライン遅延のマッピングパラメーターを有効にします。

  • [RAM マッピングのしきい値 (ビット)] パラメーターを必要な RAM サイズよりも小さい値に調整します。

    RAM サイズ = DelayLength * WordLength * VectorLength * ComplexLength

生成されたモデルと検証モデルを参照してください。

Goto ブロックおよび From ブロックの必須 HDL 設定

ガイドライン ID

2.6.4

重大度

必須

説明

From ブロックと Goto ブロックを使用する DUT Subsystem の HDL コードを生成する場合は、次の点に注意します。

  • DUT サブシステムの境界を越えて From ブロックと Goto ブロックを使用しないでください。DUT の入力端子と出力端子を接続するには、代わりに Inport ブロックと Outport ブロックを使用します。

  • Atomic Subsystem の境界を越えて From ブロックと Goto ブロックを使用しないでください。DUT の入力端子と出力端子を接続するには、代わりに Inport ブロックと Outport ブロックを使用します。

サブシステム階層全体で From ブロックと Goto ブロックを使用すると、モデルの可読性に影響する可能性があります。HDL コードを生成する前に、同じサブシステムで From ブロックと Goto ブロックを使用し、[ローカル] または [スコープ内] の可視性を使用することを推奨します。HDL コードを生成すると、生成されたモデルでは、各 Goto ブロックと From ブロックが、連続して接続される From サブシステムと Goto サブシステムのペアになります。

参考

関数

関連するトピック