Main Content

速度を最適化した後の数値的相違の検出

この例では、HDL コード生成後、Trigonometric Function ブロックを含むモデルにどのような数値の差が生じる可能性があるかを示します。これらの数値の差を、生成された検証モデルで確認できます。検証モデルは、元のモデルを、ブロック実装および速度と面積の最適化の影響を示す生成されたモデルと比較します。

Trigonometric Function モデル

モデル hdlcoder_sincos_cordic_optimization を開きます。

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

HDL_DUT サブシステム内部では、このモデルは HDL アーキテクチャが CORDIC に設定されていて、[LatencyStrategy]MAX に設定されている Trigonometric Function ブロックを使用します。ブロック設定は、Trigonometric Function ブロックの入力でパイプラインを導入します。

open_system('hdlcoder_sincos_cordic_optimization/HDL_DUT')

モデルでは、さまざまな最適化が有効になっています。モデルで保存されている HDL パラメーターを確認するには、関数 hdlsaveparams を使用します。

hdlsaveparams('hdlcoder_sincos_cordic_optimization')
%% Set Model 'hdlcoder_sincos_cordic_optimization' HDL parameters
hdlset_param('hdlcoder_sincos_cordic_optimization', 'ClockRatePipelining', 'off');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'EDAScriptGeneration', 'off');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'EnableTestpoints', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'GenerateCoSimModel', 'ModelSim');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'GenerateValidationModel', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLGenerateWebview', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLSubsystem', 'hdlcoder_sincos_cordic_optimization/sin_cordic');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLSynthCmd', 'set_global_assignment -name VHDL_FILE "$src_dir/%s"\n');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLSynthFilePostfix', '_quartus.tcl');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLSynthInit', 'load_package flow\nset top_level %s\nset src_dir "[pwd]"\nset prj_dir "q2dir"\nfile mkdir ../$prj_dir\ncd ../$prj_dir\nproject_new $top_level -revision $top_level -overwrite\nset_global_assignment -name FAMILY "Cyclone IV"\nset_global_assignment -name DEVICE EP4CE115F29C7\nset_global_assignment -name TOP_LEVEL_ENTITY $top_level\n');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLSynthTerm', 'execute_flow -compile\nproject_close\n');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'HDLSynthTool', 'Quartus');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'MaskParameterAsGeneric', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'MinimizeClockEnables', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'MinimizeIntermediateSignals', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'ResetType', 'Synchronous');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'ShareAdders', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'TargetLanguage', 'Verilog');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'Traceability', 'on');

hdlset_param('hdlcoder_sincos_cordic_optimization/HDL_DUT/Trigonometric Function', 'Architecture', 'Cordic');

hdlset_param('hdlcoder_sincos_cordic_optimization/HDL_DUT/Trigonometric Function1', 'Architecture', 'Cordic');

HDL コードと検証モデルの生成

最適化の影響を確認するには、関数 makehdl を使用して HDL_DUT サブシステムの HDL コードと検証モデルを生成します。

makehdl('hdlcoder_sincos_cordic_optimization')

HDL チェック レポートを開くと、ブロックの入力で導入された遅延を示す警告メッセージが表示されていることがわかります。検証モデルのシミュレーションを実行するときに、最初のサイクルで数値の不一致が生じる可能性があります。

コードの生成が完了したら、モデル gm_hdlcoder_sincos_cordic_optimization_vnl が表示されます。この例では、モデルは hdlcoder_sincos_cordic_optimization_validation という名前で保存されています。

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

数値の差の確認

シアンで強調表示されている HDL_DUT サブシステムは、このサブシステムが元のモデル HDL_DUT_vnl のサブシステムと異なることを示します。HDL_DUT サブシステムは、HDL コードの生成の完了後に生成されたモデルの一部であり、最適化の効果を示します。また、Trigonometric Function ブロックによって導入されたパイプラインも表示されます。

open_system('hdlcoder_sincos_cordic_optimization_validation/HDL_DUT')

モデルのシミュレーションを実行すると、シミュレーションの最初のサイクルで検出されたアサーションが表示されます。これは数値の不一致を示します。不一致は、ブロックの入力で導入されたパイプラインによって生じます。不一致を修正するには、ブロック実装、[InputPipeline] などの HDL ブロック プロパティ、またはブロックの入力でパイプラインを導入する最適化の使用を回避します。

関連するトピック