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

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

Модель тригонометрической функции

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

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

В HDL_DUT подсистема, эта модель использует блоки Тригонометрической функции, которым установили архитектуру HDL на CORDIC и LatencyStrategy устанавливают на MAX. Настройки блока вводят конвейеры во входе блоков Тригонометрической функции.

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, вы видите, что предупреждающее сообщение отобразилось, который указывает на задержки, введенные во входных параметрах блоков, которые могут вызвать числовое несоответствие в начальных циклах при симуляции модели валидации.

После генерации кода вы видите модель 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-кода и показывает эффект оптимизации. Вы также видите конвейеры, введенные Функциональными блоками Trigonmetric.

open_system('hdlcoder_sincos_cordic_optimization_validation/HDL_DUT')

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

Похожие темы