Этот пример показывает, как использовать задержку, балансирующуюся, чтобы разрешить числовое несоответствие между сгенерированной образцовой и исходной моделью после генерации HDL-кода.
Проблема - то, что симуляция модели валидации приводит к числовому несоответствию между исходной моделью и сгенерированной моделью после генерации HDL-кода. Проиллюстрировать эту проблему:
1. Откройте модель hdlcoder_resolve_delaybalancing
. DUT является простым многоскоростным проектом.
modelname = 'hdlcoder_resolve_delaybalancing'; dutname = 'hdlcoder_resolve_delaybalancing/Subsystem'; load_system(modelname) open_system(dutname) set_param(modelname, 'SimulationCommand', 'update');
2. Сгенерируйте HDL-код и модель валидации для DUT.
makehdl(dutname,'GenerateValidationModel', 'on', ... 'TargetDirectory','C:/Temp/hdlsrc')
### Generating HDL for 'hdlcoder_resolve_delaybalancing/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_resolve_delaybalancing', { 'HDL Code Generation' } )">hdlcoder_resolve_delaybalancing</a> for HDL code generation parameters. ### Starting HDL check. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_resolve_delaybalancing_vnl')">gm_hdlcoder_resolve_delaybalancing_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_resolve_delaybalancing'. ### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_iv as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_iv.vhd. ### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_core as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_core.vhd. ### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt.vhd. ### Working on Subsystem_tc as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_tc.vhd. ### Working on hdlcoder_resolve_delaybalancing/Subsystem as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem.vhd. ### Generating package file C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019ad_1035872_198992/publish_examples0/tp69cb6b81/ex37089823/C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_report.html ### HDL check for 'hdlcoder_resolve_delaybalancing' complete with 0 errors, 2 warnings, and 4 messages. ### HDL code generation complete.
3. Просмотрите модель валидации. Модель валидации сравнивает сгенерированную модель с исходной моделью. Сгенерированная модель отображает эффект оптимизации и специфичной для блока архитектуры, которую вы задаете. Используйте модель валидации, чтобы проверить, что DUT в сгенерированной модели битно-верен для числовых результатов, приведенных исходным DUT.
valmodelname = 'gm_hdlcoder_resolve_delaybalancing_vnl'; valmodelsubsys = 'gm_hdlcoder_resolve_delaybalancing_vnl/Subsystem'; load_system(valmodelname) open_system(valmodelsubsys) set_param(valmodelname, 'SimulationCommand', 'update');
4. Моделируйте модель валидации. HDL Coder™ генерирует предупреждения, которые указывают на утверждение, обнаруженное в различных метках времени. Если вы перешли через модель валидации путем двойного клика по Подсистеме Compare
и затем Подсистеме Assert_Out1
, вы видите блок Scope compare: Out1
. Этот блок Scope сравнивает вывод исходной модели DUT со сгенерированной моделью DUT и отображает числовые различия как сигнал ошибки. Когда вы дважды кликаете блок Scope, вы видите ненулевую ошибку, которая указывает на числовое несоответствие.
Диагностировать эту проблему:
1. Заметьте, что параметры экономили на исходной модели. Вы видите, что BalanceDelays
установлен в off
на модели.
hdlsaveparams(modelname)
%% Set Model 'hdlcoder_resolve_delaybalancing' HDL parameters hdlset_param('hdlcoder_resolve_delaybalancing', 'BalanceDelays', 'off'); hdlset_param('hdlcoder_resolve_delaybalancing', 'GenerateHDLTestBench', 'off'); hdlset_param('hdlcoder_resolve_delaybalancing', 'GenerateValidationModel', 'on'); hdlset_param('hdlcoder_resolve_delaybalancing', 'HDLSubsystem', 'hdlcoder_resolve_delaybalancing/Subsystem'); % Set Gain HDL parameters hdlset_param('hdlcoder_resolve_delaybalancing/Subsystem/Gain3', 'OutputPipeline', 2); hdlset_param('hdlcoder_resolve_delaybalancing/Subsystem/Sqrt', 'Architecture', 'RecipSqrtNewton');
2. Осмотрите модель валидации. В Подсистеме DUT вы видите, что генератор кода реализовал взаимную операцию квадратного корня как Подсистему. Если вы дважды кликаете Подсистему Sqrt, вы видите, что реализация имеет задержку. Эта задержка возникает из-за реализации Ньютона-Raphson взаимного квадратного корня.
open_system('gm_hdlcoder_resolve_delaybalancing_vnl/Subsystem/Sqrt')
Несоответствие симуляции произошло, потому что выбор Ньютона-Raphson для реализации блока Reciprocal Sqrt приводит к различию в задержке между исходной моделью и сгенерированной моделью. Кроме того, субдискретизация, введенная блоком Rate Transition, пропускает выборки. Когда балансировка задержки отключена на модели, генератор кода не добавил соответствие с задержками, чтобы составлять эту задержку.
Чтобы устранить эту проблему, включите задержку, балансирующуюся на модели. В исходной модели, набор BalanceDelays
к on
. Когда вы включаете балансировку задержки, генератор кода обнаруживает введение задержек вдоль одного пути и добавляет соответствие с задержками на другом, параллельных путях прохождения сигнала.
1. Включите BalanceDelays
на модели и сгенерируйте модель валидации и HDL-код.
load_system(modelname) makehdl(dutname,'BalanceDelays','on', ... 'GenerateValidationModel', 'on', ... 'TargetDirectory','C:/Temp/hdlsrc')
### Generating HDL for 'hdlcoder_resolve_delaybalancing/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_resolve_delaybalancing', { 'HDL Code Generation' } )">hdlcoder_resolve_delaybalancing</a> for HDL code generation parameters. ### Starting HDL check. ### The code generation and optimization options you have chosen have introduced additional pipeline delays. ### The delay balancing feature has automatically inserted matching delays for compensation. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 2 cycles. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_resolve_delaybalancing_vnl')">gm_hdlcoder_resolve_delaybalancing_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_resolve_delaybalancing'. ### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_iv as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_iv.vhd. ### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt/Sqrt_core as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt_core.vhd. ### Working on hdlcoder_resolve_delaybalancing/Subsystem/Sqrt as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Sqrt.vhd. ### Working on Subsystem_tc as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_tc.vhd. ### Working on hdlcoder_resolve_delaybalancing/Subsystem as C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem.vhd. ### Generating package file C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019ad_1035872_198992/publish_examples0/tp69cb6b81/ex37089823/C:/Temp/hdlsrc/hdlcoder_resolve_delaybalancing/Subsystem_report.html ### HDL check for 'hdlcoder_resolve_delaybalancing' complete with 0 errors, 0 warnings, and 4 messages. ### HDL code generation complete.
2. Откройте модель валидации. Вы видите, что генератор кода ввел соответствие с задержками, чтобы сбалансировать задержку, введенную блоком Sqrt и сместить эффект субдискретизации. Дополнительные задержки составляют различие в задержке.
load_system(valmodelname) open_system(valmodelsubsys) set_param(valmodelname, 'SimulationCommand', 'update');
3. Моделируйте модель валидации и откройте блок Scope compare: Out1
. Вы видите, что числовое несоответствие было разрешено.