exponenta event banner

Устранение числового несоответствия с балансировкой задержки

В этом примере показано, как использовать балансировку задержки для устранения числового несоответствия между созданной моделью и исходной моделью после генерации кода 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.
### Running HDL checks on the model 'hdlcoder_resolve_delaybalancing'.
### Begin compilation of the model 'hdlcoder_resolve_delaybalancing'...
### Applying HDL optimizations on the model 'hdlcoder_resolve_delaybalancing'...
### Begin model generation.
### Model generation complete.
### 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.
### Code Generation for 'hdlcoder_resolve_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp03760b7a/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 Подсистема, вы видите compare: Out1 Блок области. Этот блок области действия сравнивает выходные данные исходной модели DUT с сгенерированной моделью DUT и отображает числовые различия в качестве сигнала ошибки. При двойном щелчке на блоке «Область» появляется ненулевая ошибка, указывающая на числовое несоответствие.

Причина

Чтобы диагностировать эту проблему:

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 Subsystem видно, что реализация имеет задержку. Эта латентность возникает из-за реализации Ньютона-Рафсона ответного квадратного корня.

open_system('gm_hdlcoder_resolve_delaybalancing_vnl/Subsystem/Sqrt')

Несоответствие моделирования произошло, так как выбор Ньютона-Рафсона для реализации блока обратного Sqrt приводит к разности задержек между исходной моделью и созданной моделью. Кроме того, понижающая дискретизация, введенная блоком перехода скорости, сбрасывает выборки. Поскольку балансировка задержки в модели отключена, генератор кода не добавил соответствующие задержки для учета этой задержки.

Решение

Чтобы устранить эту проблему, включите балансировку задержки в модели. В исходной модели задайте 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.
### Running HDL checks on the model 'hdlcoder_resolve_delaybalancing'.
### Begin compilation of the model 'hdlcoder_resolve_delaybalancing'...
### Applying HDL optimizations on the model 'hdlcoder_resolve_delaybalancing'...
### 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 1: 2 cycles.
### Begin model generation.
### Model generation complete.
### 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.
### Code Generation for 'hdlcoder_resolve_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp03760b7a/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. Смоделировать модель проверки и открыть compare: Out1 Блок области. Вы видите, что числовое несоответствие устранено.

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

Подробнее