Main Content

遅延の均衡化による数値の不一致の解決

この例では、HDL コード生成後に生成されたモデルと元のモデルの間にある数値の不一致を解決するため、遅延の均衡化を使用した方法で説明します。

問題

問題は、検証モデルをシミュレートすると、結果として HDL コード生成後の生成されたモデルと元のモデルの間に数値の不一致が起こることです。この問題を説明するために、以下を行います。

1. hdlcoder_resolve_delaybalancing モデルを開きます。DUT は、シンプルなマルチレート設計です。

modelname = 'hdlcoder_resolve_delaybalancing';
dutname = 'hdlcoder_resolve_delaybalancing/Subsystem';
load_system(modelname)
open_system(dutname)
set_param(modelname, 'SimulationCommand', 'update');

2.DUT の HDL コードと検証モデルを生成します。

makehdl(dutname,'TreatBalanceDelaysOffAs', 'None', 'GenerateValidationModel', 'on', ...
                    'TargetDirectory','C:/Temp/hdlsrc')
### Generating HDL for 'hdlcoder_resolve_delaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_resolve_delaybalancing', { 'HDL Code Generation' } )">hdlcoder_resolve_delaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_resolve_delaybalancing'.
### Begin compilation of the model 'hdlcoder_resolve_delaybalancing'...
### Applying HDL optimizations on the model 'hdlcoder_resolve_delaybalancing'...
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_resolve_delaybalancing_vnl')">gm_hdlcoder_resolve_delaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_resolve_delaybalancing'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1.
### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_iv as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_iv.vhd.
### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_core as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_core.vhd.
### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt.vhd.
### Working on Subsystem_tc as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_tc.vhd.
### Working on hdlcoder_resolve_delaybalancing/Subsystem as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem.vhd.
### Generating package file C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_resolve_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173417/tp88e93cfb/ex37089823/C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_report.html
### HDL check for 'hdlcoder_resolve_delaybalancing' complete with 0 errors, 0 warnings, and 5 messages.
### HDL code generation complete.

3.検証モデルを表示します。検証モデルは、生成されたモデルと元のモデルを比較します。生成されたモデルは、最適化の効果と、指定したブロック固有のアーキテクチャを表示します。検証モデルを使用して、生成されたモデルの DUT が、元の DUT によって生成された数値結果とビットトゥルーであることを検証します。

valmodelname = 'gm_hdlcoder_resolve_delaybalancing_vnl';
valmodelsubsys = 'gm_hdlcoder_resolve_delaybalancing_vnl/Subsystem';
load_system(valmodelname)
open_system(valmodelsubsys)
set_param(valmodelname, 'SimulationCommand', 'update');

4.検証モデルをシミュレートします。HDL Coder™ は、アサーションがさまざまなタイム スタンプで検出されたことを示す警告を生成します。Compare サブシステム、Assert_Out1 サブシステムの順にダブルクリックして検証モデルを確認すると、compare: Out1 Scope ブロックが表示されます。この Scope ブロックは、元のモデルの DUT の出力を生成されたモデルの DUT と比較し、数値の差を誤差信号として表示します。Scope ブロックをダブルクリックすると、非ゼロの誤差が表示されます。これは数値の不一致を示します。

原因

この問題を診断するため、以下を行います。

1. 元のモデルに保存されているパラメーターを確認します。モデルで BalanceDelaysoff に設定されていることが分かります。

hdlsaveparams(modelname)
%% Set Model 'hdlcoder_resolve_delaybalancing' HDL parameters
hdlset_param('hdlcoder_resolve_delaybalancing', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_resolve_delaybalancing', 'GenerateHDLTestBench', 'off');
hdlset_param('hdlcoder_resolve_delaybalancing', 'GenerateValidationModel', 'on');
hdlset_param('hdlcoder_resolve_delaybalancing', 'HDLSubsystem', 'hdlcoder_resolve_delaybalancing/Subsystem');

% Set Gain HDL parameters
hdlset_param('hdlcoder_resolve_delaybalancing/Subsystem/Gain3', 'OutputPipeline', 2);

hdlset_param('hdlcoder_resolve_delaybalancing/Subsystem/Sqrt', 'Architecture', 'RecipSqrtNewton');

2.検証モデルを検査します。DUT サブシステムの中で、コード ジェネレーターは、逆数平方根演算をサブシステムとして実装したことが分かります。Sqrt サブシステムをダブルクリックすると、実装にレイテンシが発生していることが分かります。このレイテンシは、逆数平方根のニュートン・ラフソン実装に起因します。

open_system('gm_hdlcoder_resolve_delaybalancing_vnl/Subsystem/Sqrt')

シミュレーションの不一致の発生は、Reciprocal Sqrt ブロックの実装にニュートン・ラフソンが選択されたことにより、結果的に元のモデルと生成されたモデル間にレイテンシの差が生じたことが原因です。さらに、Rate Transition ブロックによって導入されたダウンサンプリングにより、一部のサンプルが除外されています。遅延の均衡化がモデルで無効になっているため、コード ジェネレーターはこのレイテンシに一致する遅延を追加しませんでした。

解決法

この問題を解決するため、モデル遅延の均衡化を有効化します。元のモデルで、BalanceDelayson に設定します。遅延の均衡化を有効にすると、コード ジェネレーターは 1 つのパスに遅延が発生したことを検出し、一致する遅延をもう一方の並列信号パスに追加します。

1. モデルで BalanceDelays を有効にし、HDL コードと検証モデルを生成します。

load_system(modelname)
makehdl(dutname,'TreatBalanceDelaysOffAs', 'Error','BalanceDelays','on', ...
                'GenerateValidationModel', 'on', ...
                    'TargetDirectory','C:/Temp/hdlsrc')
### Generating HDL for 'hdlcoder_resolve_delaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_resolve_delaybalancing', { 'HDL Code Generation' } )">hdlcoder_resolve_delaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_resolve_delaybalancing'.
### Begin compilation of the model 'hdlcoder_resolve_delaybalancing'...
### Applying HDL optimizations on the model 'hdlcoder_resolve_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.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_resolve_delaybalancing_vnl')">gm_hdlcoder_resolve_delaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_resolve_delaybalancing'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1.
### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_iv as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_iv.vhd.
### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_core as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_core.vhd.
### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt.vhd.
### Working on Subsystem_tc as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_tc.vhd.
### Working on hdlcoder_resolve_delaybalancing/Subsystem as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem.vhd.
### Generating package file C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_resolve_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173417/tp88e93cfb/ex37089823/C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_report.html
### HDL check for 'hdlcoder_resolve_delaybalancing' complete with 0 errors, 0 warnings, and 4 messages.
### HDL code generation complete.

2.検証モデルを開きます。Sqrt ブロックによって発生したレイテンシを調整し、ダウンサンプリングの影響を相殺するために、コード ジェネレーターが一致する遅延を導入したことが分かります。追加の遅延は、レイテンシの差に相当します。

load_system(valmodelname)
open_system(valmodelsubsys)
set_param(valmodelname, 'SimulationCommand', 'update');

3.検証モデルをシミュレートして、compare: Out1 Scope ブロックを開きます。数値の不一致が解決されたことが分かります。

関連する例

詳細