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