В этом примере показано, как HDL Coder может автоматически балансировать задержки в модели. HDL Coder может ввести дополнительные задержки в реализации HDL для данной модели. Эти задержки могут быть введены либо определенными реализациями блоков, либо оптимизациями с целью повышения эффективности аппаратных реализаций. Однако введение задержек только на определенных путях может привести к функциональному поведению, которое отличается от исходного намерения пользовательской модели, тем самым нарушая функциональную эквивалентность между исходной пользовательской моделью и реализацией HDL.
Delay Balancing является функцией, поддерживаемой HDL Coder, для автоматической балансировки таких вновь введенных задержек во всех наборах вырезов, гарантирующей сохранение функциональной целостности со ссылкой на исходную модель. Эта связь эквивалентности может быть подтверждена путем вызова рабочего процесса модели валидации, который позволяет пользователю визуализировать модель генерации HDL-кода, задержки, введенные реализациями, и те, которые введены балансировкой задержки, и проверить связь эквивалентности с исходной моделью.
Некоторые арифметические блоки в Simulink требуют сложных аппаратных алгоритмов. Рассмотрим, например, ответный квадратный корневой блок. Этот блок вычисляет свой ответ за один временной шаг в Simulink. Если соответствующая аппаратная реализация должна оставаться точной по циклу с Simulink, аппаратный алгоритм для этого блока должен вычисляться в одном такте. Однако это приводит к длинному критическому пути, который ухудшает тактовую частоту и эффективность оборудования. Таким образом, HDL Coder реализует этот блок с задержкой в 5 циклов, что означает, что каждый путь, содержащий этот блок, введёт задержку в 5 циклов.
Некоторые оптимизации, поддерживаемые HDL Coder, также могут привести к дополнительным задержкам. Например, установка '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 Coder всегда генерирует модель Генерации кода, которая фиксирует добавленные задержки во время реализации. RTL- верификация и автоматическая генерация моделей ко-симуляции функций подтвердить, что RTL-симуляция сгенерированного HDL-кода является точной и циклической с симуляцией Simulink модели генерации кода. Впрочем, о функциональной связи с оригинальной, пользовательской моделью это ничего не говорит.
Модель Validation позволяет пользователю проверить, что функциональная эквивалентность исходной пользовательской модели с моделью генерации кода. Эта функция включена параметром уровня модели '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.
Верхняя подсистема ('gm _ hdl _ delaybalancing _ vnl/Subsystem') в модели валидации является DUT, реализованной для генерации HDL-кода, и это ссылочная DUT при выполнении верификации теста RTL и на основе блока Косимуляции. Заметьте, что параметр 'OutputPipeline' на блоке 'Gain3' реализован целочисленной задержкой длины 2.
open_system('gm_hdl_delaybalancing_vnl/Subsystem');
Реализация функции квадратного корня в тактовом цикле неэффективна для оборудования. Кодер реализует конвейерную архитектуру, и это отражено в Генерации кода модели DUT (под подсистемой квадратного корня) 5 дополнительными задержками.
open_system('gm_hdl_delaybalancing_vnl/Subsystem/Sqrt');
Модель валидации выполняет проверку эквивалентности, маршрутизируя одни и те же входы в оба (исходный и генерация кода) DUTs, используя блоки 'From' и 'Goto'. Это инкапсулировано в подсистемы ToCoverifySrc и FromCoverifySrc. Оба 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
Чтобы решить задачу функциональной эквивалентности, пользователь может включить функцию балансировки задержки, установив опцию 'on' уровня модели 'BalanceDelays' на ' on '. Это может быть сделано с помощью команды hdlset_param или как аргумент makehdl.
При включенной опции HDL Coder автоматически определяет местоположения, в которые необходимо добавить соответствующие задержки, чтобы гарантировать функциональную эквивалентность. Это будет охватывать регулярные наборы вырезов, многоскоростные контуры и контуры подсистем, после учета всех задержек, вызванных реализацией и оптимизацией.
Теперь, когда мы наблюдаем 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
Проверка эквивалентности в модели Validation использует эту начальную информацию о задержке для задержки выхода от исходного DUT. Это пример балансировки задержки вне DUT, поскольку балансировка происходит на входах подсистемы проверки эквивалентности. Теперь, когда мы моделируем модель Validation, обратите внимание, что нет утверждений, и, таким образом, функциональная эквивалентность сохраняется. Хотя задержки трубопровода автоматически балансируются внутри 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. Иногда проект может явно смоделировать пути управления и данных, и вы можете не хотеть вставлять соответствующие задержки на пути управления во время балансировки задержки. Примеры в разделе Управление возможностях балансировки задержки показывают, как эта опция может применяться локально к отдельным подсистемам вместо всего DuT.