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