Main Content

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

この例では、設計全体の遅延は均衡化せずに、設計の特定の部分の遅延を均衡化する方法を示します。

はじめに

BalanceDelays オプションを使用すると、HDL Coder™ によって特定のブロック実装や最適化に対して導入される追加の遅延を均衡化できます。このモデルレベルのオプションは、モデル全体の遅延の均衡化を制御します。ただし、設計によっては、設計の一部のみで遅延を均衡化するとよい場合があります。たとえば、データ パスとコントロール パスを含む設計では、設計のデータ パス、つまりデータの同期が必要なパスにのみ遅延の均衡化を適用します。この例では、HDL Coder による個々のサブシステムでの遅延の均衡化方法を詳細に制御する、サブシステムレベルの BalanceDelays オプションの使用方法を示します。

このサブシステムレベルの機能の使用方法を示すために、2 つの例を使用します。

  1. hdlcoder_localdelaybalancing.slx では、ユーザー定義のコントロール パスに対する遅延の均衡化を無効にする方法を示します。

  2. hdlcoder_localdelaybalancing_sharing.slx では、遅延の均衡化の制約に注意を要する複雑なコントロール パスがある場合の HDL 最適化 (リソース共有など) の適用方法を示します。

例 1: 遅延の均衡化をデータ パスに制約

モデル例 hdlcoder_localdelaybalancing.slx には、hdlcoder_localdelaybalancing/Subsystem に 2 つのサブシステムがあります。制御ロジックを含む param_control とデータ パスを含む symmetric_fir です。

bdclose('all');
open_system('hdlcoder_localdelaybalancing');
open_system('hdlcoder_localdelaybalancing/Subsystem');

タイミングの結果が適切になるように、各サブシステムに 1 つの出力パイプライン レジスタをもつブロックが 1 つずつあります。

hdldispblkparams('hdlcoder_localdelaybalancing/Subsystem/param_control/And');
hdldispblkparams('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir/Add');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
HDL Block Parameters ('hdlcoder_localdelaybalancing/Subsystem/param_control/And')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Implementation

	Architecture : default

Implementation Parameters

	OutputPipeline : 1


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
HDL Block Parameters ('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir/Add')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Implementation

	Architecture : Linear

Implementation Parameters

	OutputPipeline : 1

グローバルなモデルレベルの BalanceDelays オプションが on に設定されている場合、検証モデルで示されるように、遅延の均衡化によってコントロール パスとデータ パスの両方に一致する遅延が挿入されます。

hdlset_param('hdlcoder_localdelaybalancing', 'BalanceDelays', 'on');
hdlset_param('hdlcoder_localdelaybalancing', 'GenerateValidationModel', 'on');
makehdl('hdlcoder_localdelaybalancing/Subsystem');
load_system('gm_hdlcoder_localdelaybalancing_vnl');
set_param('gm_hdlcoder_localdelaybalancing_vnl', 'SimulationCommand', 'update');
open_system('gm_hdlcoder_localdelaybalancing_vnl/Subsystem/param_control');
### Generating HDL for 'hdlcoder_localdelaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_localdelaybalancing'.
### Begin compilation of the model 'hdlcoder_localdelaybalancing'...
### Applying HDL optimizations on the model 'hdlcoder_localdelaybalancing'...
### 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: 1 cycles.
### Output port 2: 1 cycles.
### Output port 3: 1 cycles.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_localdelaybalancing_vnl')">gm_hdlcoder_localdelaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing'.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control/params as hdlsrc/hdlcoder_localdelaybalancing/params.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control as hdlsrc/hdlcoder_localdelaybalancing/param_control.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/symmetric_fir as hdlsrc/hdlcoder_localdelaybalancing/symmetric_fir.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing/Subsystem.vhd.
### Code Generation for 'hdlcoder_localdelaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_174506/tpb7349969/ex13756842/hdlsrc/hdlcoder_localdelaybalancing/Subsystem_report.html
### HDL check for 'hdlcoder_localdelaybalancing' complete with 0 errors, 0 warnings, and 0 messages.
### HDL code generation complete.

この設計例では、データの同期が必要なのは、データ パスである symmetric_fir だけです。param_control からの出力は FIR フィルターに対する係数であり、互いに同期したり処理されたデータと同期したりする必要はありません。そのため、制御ロジックに対する遅延の均衡化をオフにするとリソースの節約になります。これを達成するには、モデルレベルの BalanceDelays オプションを off にし、サブシステムレベルの BalanceDelays オプションをデータ パスとコントロール パスに対して適切に設定しなければなりません。

hdlset_param('hdlcoder_localdelaybalancing', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing/Subsystem/param_control', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir', 'BalanceDelays', 'on');

これで、HDL コードが生成されるときに、遅延の均衡化がデータ パスのサブシステムでのみアクティブになり、コントロール パスのサブシステムには遅延が挿入されなくなります。

bdclose('gm_hdlcoder_localdelaybalancing_vnl');
makehdl('hdlcoder_localdelaybalancing/Subsystem');
load_system('gm_hdlcoder_localdelaybalancing_vnl');
set_param('gm_hdlcoder_localdelaybalancing_vnl', 'SimulationCommand', 'update');
open_system('gm_hdlcoder_localdelaybalancing_vnl/Subsystem/param_control');
### Generating HDL for 'hdlcoder_localdelaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_localdelaybalancing'.
### Begin compilation of the model 'hdlcoder_localdelaybalancing'...
### Applying HDL optimizations on the model 'hdlcoder_localdelaybalancing'...
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_localdelaybalancing_vnl')">gm_hdlcoder_localdelaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing'.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control/params as hdlsrc/hdlcoder_localdelaybalancing/params.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control as hdlsrc/hdlcoder_localdelaybalancing/param_control.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/symmetric_fir as hdlsrc/hdlcoder_localdelaybalancing/symmetric_fir.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing/Subsystem.vhd.
### Code Generation for 'hdlcoder_localdelaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_174506/tpb7349969/ex13756842/hdlsrc/hdlcoder_localdelaybalancing/Subsystem_report.html
### HDL check for 'hdlcoder_localdelaybalancing' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

検証モデルをシミュレートすると、最適化やブロック実装によって挿入されたレイテンシが検証モデルで補正されないため、不一致が示されるようになります。

例 2: 局所的な遅延の均衡化とリソース共有

リソース共有の最適化では、最終的な HDL 実装で使用面積が削減されますが、各共有グループに対するレイテンシのサイクルが導入されます。通常、この追加のレイテンシは、遅延の均衡化において、アルゴリズムの数値や機能を保持して均衡化されます。リソース共有の制限の 1 つに、フィードバック ループ内のサブシステムには適用できないという制限があります。そのため、ループ内のサブシステムに対してリソース共有が指定された場合、最適化は失敗します。これは、hdlcoder_localdelaybalancing_sharing.slx で確認できます。hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem がフィードバック ループ内にあることに注目してください。

bdclose('all');
load_system('hdlcoder_localdelaybalancing_sharing');
open_system('hdlcoder_localdelaybalancing_sharing/Subsystem');

ただし、この設計では、制御信号で制御されるスイッチ ブロック hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem/Switch により、ほとんどの場合は一番上の入力のフィードフォワード パスが選択されるため、フィードバック ループはまれにしか使用されないことがわかります。このユーザーの考察は、このサブシステムでリソース共有を進め、親サブシステムのフィードバック ループは無視してかまわないことを意味します。このような場合、遅延の均衡化でフィードバック ループを無視するには、フィードバック ループを含むサブシステムで遅延の均衡化をオフにしなければなりません。これにより、HDL Coder (TM) でフィードバック ループが無視され、リソース共有が続行されるようになります。

hdlset_param('hdlcoder_localdelaybalancing_sharing', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing_sharing/Subsystem', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem', 'BalanceDelays', 'on');
makehdl('hdlcoder_localdelaybalancing_sharing/Subsystem');
load_system('gm_hdlcoder_localdelaybalancing_sharing');
set_param('gm_hdlcoder_localdelaybalancing_sharing_vnl', 'SimulationCommand', 'update');
### Generating HDL for 'hdlcoder_localdelaybalancing_sharing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing_sharing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing_sharing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_localdelaybalancing_sharing'.
### Begin compilation of the model 'hdlcoder_localdelaybalancing_sharing'...
### Applying HDL optimizations on the model 'hdlcoder_localdelaybalancing_sharing'...
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_localdelaybalancing_sharing_vnl')">gm_hdlcoder_localdelaybalancing_sharing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing_sharing'.
### MESSAGE: The design requires 2 times faster clock with respect to the base rate = 0.1.
### Working on hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem as hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_block.vhd.
### Working on Subsystem_tc as hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_tc.vhd.
### Working on hdlcoder_localdelaybalancing_sharing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem.vhd.
### Generating package file hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_localdelaybalancing_sharing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_174506/tpb7349969/ex13756842/hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_report.html
### HDL check for 'hdlcoder_localdelaybalancing_sharing' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

内側のサブシステムで共有が成功するだけでなく、加算器への入力に一致する遅延を挿入することで、このサブシステム内の局所的な遅延の均衡化も成功していることに注意してください。

open_system('gm_hdlcoder_localdelaybalancing_sharing_vnl/Subsystem/Subsystem');