Разрешите числовое несоответствие с балансировкой задержки

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

Связанные примеры

Больше о