Main Content

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

HDL Coder の遅延の均衡化と検証モデル ワークフロー

この例では、モデル内の遅延を HDL Coder™ で自動的に均衡化する方法を示します。HDL Coder は、特定のモデルの HDL 実装に追加の遅延を導入することがあります。これらの遅延は、ハードウェア実装の効率を高める目的で、特定のブロック実装または最適化のいずれかによって導入される可能性があります。ただし、特定のパスにのみ遅延が導入されると、機能的な動作がユーザー モデルの当初の意図と異なるものになり、元のユーザー モデルと HDL 実装の間の機能的等価性に違反することがあります。

遅延の均衡化は、新しく導入されたそのような遅延をすべての並列パスで自動的に均衡化し、元のモデルを基準として機能的整合性が確実に維持されるようにするための HDL Coder でサポートされる機能です。ユーザーは、この等価関係を検証モデル ワークフローを呼び出して確認できます。このワークフローで、HDL コード生成モデル、実装で導入された遅延、遅延の均衡化で導入された遅延を可視化し、元のモデルとの等価関係を検証できます。

実装や最適化によるレイテンシの導入

Simulink® の数学ブロックには、複雑なハードウェア アルゴリズムを必要とするものがあります。たとえば、Reciprocal Square Root ブロックについて考えてみます。このブロックは、Simulink では単一のタイム ステップで解を計算します。対応するハードウェア実装を Simulink とサイクル アキュレートにする場合は、このブロックのハードウェア アルゴリズムでも単一のクロック サイクルで計算しなければなりません。ただし、これを行うと、クリティカル パスが長くなり、クロック周波数とハードウェアの効率が低下します。そのため、HDL Coder は、このブロックを 5 サイクルのレイテンシを使用して実装します。これは、このブロックを含むすべてのパスに 5 サイクルの遅延が導入されることを意味します。

また、HDL Coder でサポートされる特定の最適化によって追加の遅延が導入されることもあります。たとえば、ブロックの実装パラメーターとして InputPipeline または OutputPipeline を指定すると、生成された HDL に追加のパイプライン遅延が導入されます。この場合も、並列パス間で不一致が生じ、結果として元のモデルと機能的に異なるものになります。

関数 rSqrt を実装する Square Root ブロックを含む、並列パスの Gain3 ブロックで OutputPipeline HDL ブロック プロパティが 2 に設定されたモデル例について考えてみます。

load_system('hdl_delaybalancing');
open_system('hdl_delaybalancing/Subsystem');
set_param('hdl_delaybalancing', 'SimulationCommand', 'update');

検証モデルの生成

レイテンシが変化するため、HDL Coder は、追加された遅延を実装時に取得するコード生成モデルを常に生成します。RTL 検証および自動コシミュレーション モデル生成機能により、生成された HDL コードの RTL シミュレーションがコード生成モデルの Simulink シミュレーションとビット アキュレートおよびサイクル アキュレートであるかどうかが検証されます。ただし、元のユーザー モデルとの機能的な関係については検証されません。

元のユーザー モデルとコード生成モデルの機能的等価性については、ユーザーが検証モデルを使用して検証できます。この機能は、モデルレベルのパラメーター GenerateValidationModel でオンにします。このパラメーターは、hdlset_param コマンドで設定するか、makehdl の引数として指定できます。これにより、コード生成時に、検証モデルが生成されたことを示すメッセージが表示されます。

検証モデルは、元のモデルの DUT (gm_hdl_delaybalancing_vnl/Subsystem_vnl) と生成されたコード生成モデルの DUT (gm_hdl_delaybalancing_vnl/Subsystem) の 2 つの部分で構成されます。

hdlset_param('hdl_delaybalancing', 'GenerateValidationModel', 'on');
hdlset_param('hdl_delaybalancing', 'BalanceDelays', 'off');
makehdl('hdl_delaybalancing/Subsystem');
open_system('gm_hdl_delaybalancing_vnl');
set_param('gm_hdl_delaybalancing_vnl', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_delaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_delaybalancing', { 'HDL Code Generation' } )">hdl_delaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_delaybalancing'.
### Begin compilation of the model 'hdl_delaybalancing'...
### Working on the model 'hdl_delaybalancing'...
### Working on... <a href="matlab:configset.internal.open('hdl_delaybalancing', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdl_delaybalancing' ....
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('hdlsrc/hdl_delaybalancing/gm_hdl_delaybalancing_vnl')">gm_hdl_delaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdl_delaybalancing'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1.
### Begin VHDL Code Generation for 'Subsystem_tc'.
### Working on Subsystem_tc as hdlsrc/hdl_delaybalancing/Subsystem_tc.vhd.
### Code Generation for 'Subsystem_tc' completed.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_iv as hdlsrc/hdl_delaybalancing/Sqrt_iv.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_core as hdlsrc/hdl_delaybalancing/Sqrt_core.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt as hdlsrc/hdl_delaybalancing/Sqrt.vhd.
### Working on hdl_delaybalancing/Subsystem as hdlsrc/hdl_delaybalancing/Subsystem.vhd.
### Generating package file hdlsrc/hdl_delaybalancing/Subsystem_pkg.vhd.
### Code Generation for 'hdl_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2355056_2714937/tpd4a706f4/hdlcoder-ex36242447/hdlsrc/hdl_delaybalancing/Subsystem_report.html
### HDL check for 'hdl_delaybalancing' complete with 0 errors, 0 warnings, and 5 messages.
### HDL code generation complete.

コード生成 DUT: 出力パイプラインの挿入

検証モデルの最上位のサブシステム (gm_hdl_delaybalancing_vnl/Subsystem) は、HDL コード生成用に実装された DUT で、これが RTL テストベンチでの検証や Cosimulation ブロック ベースの検証を実行する際の参照 DUT になります。Gain3 ブロックの OutputPipeline パラメーターが長さ 2 の整数の遅延で実装されていることに注意してください。

open_system('gm_hdl_delaybalancing_vnl/Subsystem');

コード生成 DUT: Sqrt ブロックの実装

平方根関数を 1 クロック サイクルで実装することは、ハードウェアに対して効率的でありません。Coder はパイプライン化されたアーキテクチャを実装し、これが 5 つの追加の遅延によってコード生成 DUT モデル (Square Root サブシステム) に反映されます。

open_system('gm_hdl_delaybalancing_vnl/Subsystem/Sqrt');

検証モデルによる等価性の確認

検証モデルでは、From ブロックと Goto ブロックを使用して両方 (元とコード生成) の DUT に同じ入力を経路指定することで等価性の確認を実行します。これは、ToCoverifySrc サブシステムと FromCoverifySrc サブシステムでカプセル化されています。これで、両方の DUT が各タイム ステップで同じスティミュラスに応答するようになります。その後、両方の DUT からの出力が各タイム ステップでサンプリングされ、それらの等価性が確認されます。これは、各出力端子からの出力を比較し、差を計算することで実行されます。機能的等価性については、この差が常にゼロでなければなりません。

ただし、現在の例では、機能的等価性に違反していることがわかります。2 つの出力の差が複数のタイム ステップでゼロでありません。その結果、不一致のアサーションが生成され、最後の比較スコープのパネルにも反映されています。

open_system('gm_hdl_delaybalancing_vnl/Compare/Assert_Out1');
sim('gm_hdl_delaybalancing_vnl');
open_system('gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/compare: Out1')
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 0 
Warning: Division by zero occurred. Quotient was saturated. This originated
from 'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 
Warning: Saturate on overflow detected. This originated from
'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 0.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 0.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 1.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 1.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 2.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 2.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 3.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 3.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 4.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 5.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 5.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 6.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 6.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 7.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 7.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 8.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 8.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 9.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 9.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 10 

自動の遅延の均衡化

機能的等価性の問題を解決するために、モデルレベルの BalanceDelays オプションを on に設定して遅延の均衡化機能をオンにできます。これは、hdlset_param コマンドまたは makehdl の引数を使用して実行できます。

BalanceDelays をオンにすると、HDL Coder により、機能的等価性を保証するために一致する遅延を追加する必要がある場所が自動的に特定されます。実装および最適化によって導入されたすべての遅延を考慮したうえで、通常のカットセット、マルチレートの境界とサブシステムの境界を対象とする遅延が BalanceDelays によって追加されます。

ここで、検証モデルのコード生成 DUT を確認すると、Sqrt ブロックと OutputPipeline オプションによって導入された遅延に一致する追加の遅延がいくつか導入されていることがわかります。通常、これらの遅延の名前には delayMatch という接頭辞が付けられます。レートの境界を越える場合に必要になる適切な遅延も自動的に計算されていることに注意してください。

hdlset_param('hdl_delaybalancing', 'BalanceDelays', 'on');
makehdl('hdl_delaybalancing/Subsystem');
open_system('gm_hdl_delaybalancing_vnl/Subsystem')
set_param('gm_hdl_delaybalancing_vnl', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_delaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_delaybalancing', { 'HDL Code Generation' } )">hdl_delaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_delaybalancing'.
### Begin compilation of the model 'hdl_delaybalancing'...
### Working on the model 'hdl_delaybalancing'...
### The code generation and optimization options you have chosen have introduced additional pipeline delays.
### The delay balancing feature has automatically inserted matching delays for compensation.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 2 cycles.
### Working on... <a href="matlab:configset.internal.open('hdl_delaybalancing', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdl_delaybalancing' ....
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('hdlsrc/hdl_delaybalancing/gm_hdl_delaybalancing_vnl')">gm_hdl_delaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdl_delaybalancing'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1.
### Begin VHDL Code Generation for 'Subsystem_tc'.
### Working on Subsystem_tc as hdlsrc/hdl_delaybalancing/Subsystem_tc.vhd.
### Code Generation for 'Subsystem_tc' completed.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_iv as hdlsrc/hdl_delaybalancing/Sqrt_iv.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_core as hdlsrc/hdl_delaybalancing/Sqrt_core.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt as hdlsrc/hdl_delaybalancing/Sqrt.vhd.
### Working on hdl_delaybalancing/Subsystem as hdlsrc/hdl_delaybalancing/Subsystem.vhd.
### Generating package file hdlsrc/hdl_delaybalancing/Subsystem_pkg.vhd.
### Code Generation for 'hdl_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2355056_2714937/tpd4a706f4/hdlcoder-ex36242447/hdlsrc/hdl_delaybalancing/Subsystem_report.html
### HDL check for 'hdl_delaybalancing' complete with 0 errors, 0 warnings, and 4 messages.
### HDL code generation complete.

初期のレイテンシと機能的な検証

実装で導入される遅延により、実質的に、パイプライン化されたハードウェア アーキテクチャが構築され、クロック周波数とハードウェアの効率が向上します。ただし、パイプラインによって初期のレイテンシが導入され、この最初のレイテンシの後に最初の出力サンプルが生成されます。これらのパイプライン遅延は DUT 内部で自動的に均衡化されますが、DUT 外部のモデルの残りの部分については遅延を手動で均衡化することが重要です。遅延 (または初期のレイテンシ) の量は、コード生成時にユーザーに次のように伝えられます。

  ### Some latency changes occurred in the DUT. Each output port experiences these additional delays
  ### Output port 0: 2 cycles

検証モデルにおける等価性の確認では、元の DUT からの出力の遅延として、この初期のレイテンシの情報を使用します。等価性を確認するサブシステムの入力で均衡化が実行されており、これは DUT 外部の遅延を均衡化する例です。ここで、検証モデルをシミュレートすると、アサーションがなく、機能的等価性が維持されていることがわかります。パイプライン遅延は DUT 内部で自動的に均衡化されますが、DUT 外部のモデルの残りの部分については遅延を手動で均衡化することが重要です。

close_system('gm_hdl_delaybalancing_vnl/Subsystem')
sim('gm_hdl_delaybalancing_vnl');
open_system('gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/compare: Out1')
Warning: Division by zero occurred. Quotient was saturated. This originated
from 'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 
Warning: Saturate on overflow detected. This originated from
'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 

遅延の均衡化のスコープの制御

上記の例では、DUT 全体に適用される遅延の均衡化機能について説明しています。設計でモデルのコントロール パスとデータ パスを明示的にモデル化し、コントロール パスに対しては遅延の均衡化で一致する遅延を挿入しないほうがよい場合もあります。このオプションを DUT 全体ではなく個々のサブシステムに局所的に適用する方法については、遅延の均衡化のスコープの制御の例で説明しています。