exponenta event banner

Процесс балансировки и проверки модели задержки в Coder™ HDL

В этом примере показано, как кодер HDL может автоматически сбалансировать задержки в модели. Кодер ЛПВП может вводить дополнительные задержки в реализации ЛПВП для данной модели. Эти задержки могут быть введены либо определенными блочными реализациями, либо оптимизациями с целью повышения эффективности аппаратных реализаций. Однако введение задержек только на определенных путях может привести к функциональному поведению, которое отличается от первоначального намерения пользовательской модели, тем самым нарушая функциональную эквивалентность между исходной пользовательской моделью и реализацией ЛПВП.

Балансировка задержки - это функция, поддерживаемая кодером HDL для автоматической балансировки таких вновь введенных задержек во всех секционных наборах, гарантирующая сохранение функциональной целостности со ссылкой на исходную модель. Эта связь эквивалентности может быть подтверждена путем вызова рабочего процесса модели проверки, который позволяет пользователю визуализировать модель генерации кода HDL, задержки, введенные реализациями, и задержки, введенные балансировкой задержки, и проверить связь эквивалентности с исходной моделью.

Внедрение и оптимизация обеспечивают задержку

Некоторые арифметические блоки в Simulink требуют сложных аппаратных алгоритмов. Рассмотрим, например, взаимный квадратный корневой блок. Этот блок вычисляет свой ответ за один временной шаг в Simulink. Если соответствующая аппаратная реализация должна сохранять точность цикла с помощью Simulink, аппаратный алгоритм для этого блока должен вычисляться за один тактовый цикл. Однако это приводит к длинному критическому пути, который ухудшает тактовую частоту и эффективность аппаратных средств. Таким образом, кодер HDL реализует этот блок с 5-циклической задержкой, что означает, что каждый тракт, содержащий этот блок, будет вводить 5-циклическую задержку.

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

Рассмотрим пример модели, которая содержит квадратный корневой блок, реализующий функцию rSqrt, а блок Gain3 по параллельному пути имеет параметр реализации OutputPipeline, равный 2.

bdclose all;
load_system('hdl_delaybalancing');
open_system('hdl_delaybalancing/Subsystem');
set_param('hdl_delaybalancing', 'SimulationCommand', 'update');

Создание модели проверки

Из-за изменений в задержке кодер HDL всегда генерирует модель генерации кода, которая фиксирует добавленные задержки во время реализации. Функции проверки RTL и автоматического создания модели совместного моделирования подтверждают, что моделирование RTL генерируемого кода HDL является бито-точным и циклически точным с моделированием Simulink модели генерации кода. Однако это ничего не говорит о функциональной связи с исходной, пользовательской моделью.

Модель проверки позволяет пользователю проверить функциональную эквивалентность исходной модели пользователя модели генерации кода. Эта функция включается параметром уровня модели GenerateValidationModel. Этот параметр может быть задан командой hdlset_param или указан в качестве аргумента makehdl. Затем во время создания кода обратите внимание на сообщение о том, что модель проверки была создана.

Валидационная модель состоит из двух частей: DUT из исходной модели (называемой 'gm _ hdl _ delaybalancing _ vnl/Subsystem _ vnl') и DUT из модели генерации кода ('gm _ hdl _ delaybalancing _ vnl/Subsystem').

hdlset_param('hdl_delaybalancing', 'GenerateValidationModel', 'on');
hdlset_param('hdl_delaybalancing', 'BalanceDelays', 'off');
makehdl('hdl_delaybalancing/Subsystem');
open_system('gm_hdl_delaybalancing_vnl');
set_param('gm_hdl_delaybalancing_vnl', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_delaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_delaybalancing', { 'HDL Code Generation' } )">hdl_delaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_delaybalancing'.
### Begin compilation of the model 'hdl_delaybalancing'...
### Applying HDL optimizations on the model 'hdl_delaybalancing'...
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdl_delaybalancing_vnl')">gm_hdl_delaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdl_delaybalancing'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_iv as hdlsrc/hdl_delaybalancing/Sqrt_iv.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_core as hdlsrc/hdl_delaybalancing/Sqrt_core.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt as hdlsrc/hdl_delaybalancing/Sqrt.vhd.
### Working on Subsystem_tc as hdlsrc/hdl_delaybalancing/Subsystem_tc.vhd.
### Working on hdl_delaybalancing/Subsystem as hdlsrc/hdl_delaybalancing/Subsystem.vhd.
### Generating package file hdlsrc/hdl_delaybalancing/Subsystem_pkg.vhd.
### Code Generation for 'hdl_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples1/tp8fdc0684/hdlsrc/hdl_delaybalancing/Subsystem_report.html
### HDL check for 'hdl_delaybalancing' complete with 0 errors, 2 warnings, and 4 messages.
### HDL code generation complete.

Создание кода DUT: вставка выходного трубопровода

Верхняя подсистема ('gm _ hdl _ delaybalancing _ vnl/Subsystem') в модели валидации - это DUT, реализованный для генерации кода HDL, и это эталонный DUT при выполнении проверки RTL testbench и проверки на основе блока Cosimulation. Обратите внимание, что параметр OutputPipeline в блоке Gain3 реализуется целочисленной задержкой длиной 2.

open_system('gm_hdl_delaybalancing_vnl/Subsystem');

Создание кода DUT: реализация блока Sqrt

Реализация функции квадратного корня в тактовом цикле неэффективна для аппаратных средств. Кодер реализует конвейерную архитектуру, и это отражается в модели DUT генерации кода (под подсистемой квадратного корня) 5 дополнительными задержками.

open_system('gm_hdl_delaybalancing_vnl/Subsystem/Sqrt');

Проверка эквивалентности с моделью проверки

Валидационная модель выполняет проверку эквивалентности путем маршрутизации одних и тех же входных данных в оба (исходный и кодовый) DUT с использованием блоков From и Goto. Она инкапсулирована в подсистемы «ToCoverFifySrc» и «StartCoverFifySrc». Оба DUT теперь реагируют на одни и те же стимулы на каждом временном шаге. Выходные сигналы обоих DUT затем дискретизируются на каждом временном шаге и проверяется их эквивалентность. Это делается путем сравнения выходов каждого выходного порта, вычисления их разности, которая всегда должна быть равна нулю для функциональной эквивалентности.

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

open_system('gm_hdl_delaybalancing_vnl/Compare/Assert_Out1');
sim('gm_hdl_delaybalancing_vnl');
open_system('gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/compare: Out1')
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 0 
Warning: Division by zero occurred. Quotient was saturated. This originated
from 'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 
Warning: Saturate on overflow detected. This originated from
'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 0.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 0.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 1.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 1.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 2.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 2.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 3.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 3.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 4.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 5.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 5.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 6.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 6.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 7.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 7.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 8.4 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 8.8 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 9.2 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 9.6 
Warning: Assertion detected in
'gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/AssertEq' at time 10 

Автоматическая балансировка задержки

Для решения проблемы функциональной эквивалентности пользователь может включить функцию балансировки задержки, установив для параметра BalureDelays на уровне модели значение on. Это можно сделать с помощью команды hdlset_param или в качестве аргумента makehdl.

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

Теперь, когда мы наблюдаем DUT генерации кода из модели проверки, обратите внимание, что было добавлено несколько дополнительных задержек для согласования задержек, введенных параметром Sqrt block и OutputPipeline. Имена этих задержек обычно имеют префикс «delayMatch». Обратите внимание, что кодер также автоматически вычисляет соответствующие задержки, необходимые при пересечении границ скорости.

hdlset_param('hdl_delaybalancing', 'BalanceDelays', 'on');
makehdl('hdl_delaybalancing/Subsystem');
open_system('gm_hdl_delaybalancing_vnl/Subsystem')
set_param('gm_hdl_delaybalancing_vnl', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_delaybalancing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_delaybalancing', { 'HDL Code Generation' } )">hdl_delaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_delaybalancing'.
### Begin compilation of the model 'hdl_delaybalancing'...
### Applying HDL optimizations on the model 'hdl_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_hdl_delaybalancing_vnl')">gm_hdl_delaybalancing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdl_delaybalancing'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 0.1.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_iv as hdlsrc/hdl_delaybalancing/Sqrt_iv.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt/Sqrt_core as hdlsrc/hdl_delaybalancing/Sqrt_core.vhd.
### Working on hdl_delaybalancing/Subsystem/Sqrt as hdlsrc/hdl_delaybalancing/Sqrt.vhd.
### Working on Subsystem_tc as hdlsrc/hdl_delaybalancing/Subsystem_tc.vhd.
### Working on hdl_delaybalancing/Subsystem as hdlsrc/hdl_delaybalancing/Subsystem.vhd.
### Generating package file hdlsrc/hdl_delaybalancing/Subsystem_pkg.vhd.
### Code Generation for 'hdl_delaybalancing' completed.
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples1/tp8fdc0684/hdlsrc/hdl_delaybalancing/Subsystem_report.html
### HDL check for 'hdl_delaybalancing' complete with 0 errors, 0 warnings, and 4 messages.
### HDL code generation complete.

Начальная задержка и функциональная проверка

Задержки, вносимые реализациями, по существу строят конвейерную аппаратную архитектуру для улучшения тактовой частоты и эффективности аппаратного обеспечения. Конвейер, однако, вводит начальную задержку, и первая выходная выборка генерируется после этой начальной задержки. Хотя эти задержки трубопровода автоматически балансируются внутри DUT, пользователь обязан балансировать задержки вне DUT в остальной части модели. Величина задержки (или начальной задержки) передается пользователю во время генерации кода следующим образом:

  ### Some latency changes occurred in the DuT. Each output port experiences these additional delays
  ### Output port 0: 2 cycles

При проверке эквивалентности в модели проверки эта начальная информация о задержке используется для задержки вывода исходного DUT. Это пример балансировки задержки вне DUT, поскольку балансировка происходит на входах подсистемы проверки эквивалентности. Теперь, когда мы моделируем модель проверки, обратите внимание, что нет утверждений и, таким образом, функциональная эквивалентность сохраняется. В то время как задержки трубопровода автоматически балансируются внутри DUT, пользователь обязан балансировать задержки вне DUT в остальной части модели.

close_system('gm_hdl_delaybalancing_vnl/Subsystem')
sim('gm_hdl_delaybalancing_vnl');
open_system('gm_hdl_delaybalancing_vnl/Compare/Assert_Out1/compare: Out1')
Warning: Division by zero occurred. Quotient was saturated. This originated
from 'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 
Warning: Saturate on overflow detected. This originated from
'gm_hdl_delaybalancing_vnl/Subsystem/Sqrt/Sqrt'
Suggested Actions:
    •  - Suppress
 

Контроль объема балансировки задержки

Приведенные выше примеры описывают функцию выравнивания задержки, применяемую ко всему DuT. Иногда конструкция может явно моделировать пути управления и данных, и может не потребоваться вставлять совпадающие задержки на пути управления во время балансировки задержек. Примеры в Control the Scope of Delay Balancing показывают, как эту опцию можно применить локально к отдельным подсистемам вместо всего DuT.