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

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

open_system('gm_hdlcoder_resolve_delaybalancing_vnl/Subsystem/Sqrt')

Несоответствие симуляции произошло, потому что выбор Ньютона-Рафсона для реализации блока Returcal 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.
### 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 Блок Scope. Вы видите, что численное несоответствие было устранено.

Похожие примеры

Подробнее о