Найдите числовые различия после оптимизации скорости

В этом примере показано, как модель, содержащая блоки Trigonometric Function, может иметь различия в числовых результатах после генерации HDL-кода. Можно наблюдать эти числовые различия в сгенерированной модели валидации. Модель валидации сравнивает исходную модель с сгенерированной моделью, которая показывает эффект реализации блоков и оптимизации скорости и площади.

Тригонометрическая модель функции

Откройте модель hdlcoder_sincos_cordic_optimization.

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

Внутри HDL_DUT подсистема, эта модель использует блоки Trigonometric Function, которые имеют HDL- архитектуры, установленные на CORDIC и LatencyStrategy, установленный на MAX. Настройки блоков вводят трубопроводы на входе блоков 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', 'HierarchicalDistPipelining', 'on');
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', 'OptimizationReport', 'on');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'ResetType', 'Synchronous');
hdlset_param('hdlcoder_sincos_cordic_optimization', 'ResourceReport', 'on');
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-код и модель валидации

Чтобы увидеть эффект оптимизации, сгенерируйте HDL-код и модель валидации для HDL_DUT подсистема при помощи makehdl функция.

makehdl('hdlcoder_sincos_cordic_optimization')

Когда вы открываете HDL Check Report, появляется предупреждающее сообщение, которое указывает на задержки, введенные на входах блоков, что может вызвать числовое несоответствие в начальных циклах при симуляции модели валидации.

После генерации кода вы видите модель 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')

Наблюдайте числовые различия

The HDL_DUT подсистема, подсвеченная голубым цветом, указывает, что эта подсистема отличается от подсистемы в исходной модели HDL_DUT_vnl. The HDL_DUT подсистема является частью сгенерированной модели после генерации HDL-кода и показывает эффект оптимизации. Вы также видите трубопроводы, введенные блоками Trigonmetric Function.

open_system('hdlcoder_sincos_cordic_optimization_validation/HDL_DUT')

Когда вы симулируете модель, вы видите утверждения, обнаруженные в начальных циклах симуляции, что указывает на числовое несоответствие. Несоответствие вызвано трубопроводами, введенными на вход блока. Чтобы исправить несоответствие, избегайте использования реализаций блоков или свойств HDL-блоков, таких как InputPipeline, или оптимизаций, которые вводят трубопроводы на вход блоков.

Похожие темы