В этом примере показано, как HDL Coder может автоматически сбалансировать задержки в модели. HDL Coder может ввести дополнительные задержки реализации HDL для данной модели. Эти задержки могут быть введены или определенными реализациями блока или оптимизацией в целях повышения эффективности аппаратных реализаций. Однако представление задержек только на определенных путях может закончиться функциональное поведение, которое отличается от исходного намерения пользовательской модели, таким образом, нарушая функциональную эквивалентность между исходной пользовательской моделью и реализацией HDL.
Задержитесь Балансировка является функцией, поддерживавшей 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 всегда генерирует модель Code Generation, которая получает добавленные задержки во время реализации. Верификация RTL и автоматические функции генерации co-имитационной-модели подтверждают это, симуляция 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. ### Starting HDL check. ### 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. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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') в модели Validation является DUT, как реализовано для генерации HDL-кода, и это - ссылочный DUT при выполнении верификации испытательного стенда RTL и Cosimulation основанная на блоке верификация. Заметьте, что параметр 'OutputPipeline' на блоке 'Gain3' реализован целочисленной задержкой длины 2.
open_system('gm_hdl_delaybalancing_vnl/Subsystem');
Реализация функции квадратного корня в на такте не эффективна для оборудования. Кодер реализует конвейерную архитектуру, и это отражается в модели Code-Generation DUT (под подсистемой квадратного корня) 5 дополнительными задержками.
open_system('gm_hdl_delaybalancing_vnl/Subsystem/Sqrt');
Модель Validation выполняет проверяющий эквивалентности, направляющий те же входные параметры и к (оригинал и к генерация кода) DUTs, использующий 'От' и блоки 'Goto'. Это инкапсулируется в подсистемах 'ToCoverifySrc' и 'FromCoverifySrc'. Оба DUTs теперь отвечают на те же стимулы в каждом временном шаге. Выходные параметры и от DUTs затем производятся в каждом временном шаге и от их эквивалентности, проверяется. Это сделано путем сравнения выходных параметров от каждого выходного порта, вычисления их различия, которое должно всегда быть нулем для функциональной эквивалентности.
В текущем примере, однако, уведомление, что функциональная эквивалентность нарушена. Различие между этими двумя выходными параметрами является ненулевым в нескольких временных шагах. Это приводит к утверждениям несоответствия и также отражается в последней панели осциллографа сравнения.
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
Чтобы решить функциональную эквивалентную задачу, пользователь может включить функцию балансировки задержки путем установки уровня модели опция 'BalanceDelays' на 'on'. Это может быть сделано или посредством hdlset_param команды или в качестве makehdl аргумента.
С этой включенной опцией HDL Coder автоматически идентифицирует местоположения, где соответствие с задержками должно быть добавлено, чтобы гарантировать функциональную эквивалентность. Это покроет регулярные наборы сокращения, многоскоростные контуры и контуры подсистемы, после принятия, чтобы считать, вся реализация - и вызванные оптимизацией задержки.
Теперь, когда мы наблюдаем Генерацию кода, DUT из модели валидации замечают, что несколько дополнительных задержек были добавлены для соответствия с задержками, введенными блоком Sqrt и опцией 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. ### 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_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. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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.