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

HDL_DUT подсистема, выделенная голубым цветом, указывает на то, что эта подсистема отличается от подсистемы в исходной модели HDL_DUT_vnl. HDL_DUT подсистема является частью создаваемой модели после генерации кода HDL и показывает эффект оптимизации. Вы также видите трубопроводы, введенные блоками тригонметрической функции.
open_system('hdlcoder_sincos_cordic_optimization_validation/HDL_DUT')

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