Связь часов HDL и сброса с шагами расчета Simulink

Этот пример иллюстрирует отношение шагов расчета Simulink® к часам HDL и сбросу при помощи HDL Verifier™ к cosimulate простой синхронный модуль проверки четности Verilog. Пример также содержит следующее:

  • Объясняет, как разовые дельтой итерации в симуляторе HDL (ModelSim® или Incisive®) могут влиять на результаты cosimulation

  • Показывает использование панели Часов в блоке HDL Cosimulation, чтобы управлять сигналами часов в HDL

  • Показывает, как можно точно сравнить результаты cosimulation путем принятия задержек логики сброса HDL во внимание

Код Verilog, используемый для Cosimulation

Проверка четности является методом добавления бита четности к потоку данных для того, чтобы проверять что данные на любые ошибки. В этом примере мы будем использовать "схему" бита четности. Модуль HDL спроектирован, чтобы быть синхронным и обновляет свое состояние на каждом возрастающем ребре часов.

Синхронный модуль Средства проверки Четности (paritychecker_clk_dut.v) принимает 8-битный вход, выходные параметры 1 бит четности, и управляется на каждом возрастающем фронте синхроимпульса.

Эффекты изменения шагов расчета Simulink в Cosimulation

Если вы используете ModelSim или QuestaSim, модель parity_check_clk.slx должна быть открыта. Если вы используете Incisive или Xcelium, закрываете модель ModelSim и открываете модель parity_check_clk_in.slx.

В модели мы используем 8-битное в противоречии с, предоставляют входные данные HDL-коду через блок HDL Cosimulation и его эквивалентный алгоритм Simulink. Осциллограф используется, чтобы просмотреть их выводы и сравнить результаты. Модель демонстрирует, как частота дискретизации Simulink влияет на cosimulation с модулем HDL. Активируемые кликом мыши аннотации могут использоваться, чтобы изменить шаг расчета выходного порта блока HDL Cosimulation (Спекулянт).

Обратите внимание на то, что часы и входные параметры сброса для проекта под тестом сгенерированы в модуле драйвера HDL, (paritychecker_clk_driver.v). Сброс сохранен высоко для первых 16 нс и низкий после этого. Часы имеют период 8 нс и настраиваются таким образом, что его первое возрастающее ребро происходит на уровне 4 нс. Следовательно модуль способен к обновлению его выхода на максимальном уровне 8 нс, то есть, в каждом возрастающем ребре часов.

1. Запустите ModelSim или острый

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

2. Наблюдайте настройки в панели Портов блока HDL Cosimulation

Дважды кликните на блоке HDL Cosimulation, чтобы отредактировать cosimulation параметры. Диалоговое окно Параметров блоков появляется. Выберите вкладку Ports.

  • Шаг расчета выходного порта (parity_out1) набор должен Рекламировать. Существуют многочисленные способы задать значение Спекулянта. Мы установили начальное значение Ts из PreLoadFcn модели коллбэк (см., Создает Коллбэки Модели (Simulink)). Мы устанавливаем новые значения для Спекулянта, использующего любую из активируемых кликом мыши аннотаций, предоставленных в модели. Можно установить значение Спекулянта в Командной строке MATLAB® также.

  • Обратите внимание на то, что опция для разрешения прямого сквозного соединения не проверялась - это вызвано тем, что, наш код Verilog не является чисто комбинационным.

Модель предоставляет три активируемых кликом мыши аннотации для установки времени выборки выходных портов блока HDL Cosimulation), Спекулянт = 32 нс, 8 нс и 4 нс.

3. Запустите модель со всеми тремя версиями Спекулянта

Рекламируйте = 32 нс

  • Выход модуля HDL производится Simulink на уровне каждых 32 нс

  • Частота дискретизации выходного порта ниже, чем тактовая частота, Спекулянт = 4x (период часов HDL)

  • Выход блока HDL Cosimulation Субдискретизируется, в результате который и parity_out1 сигнал в симуляторе HDL не совпадает результатом Осциллографа Simulink

Рекламируйте = 8 нс

  • Выход модуля HDL производится Simulink на уровне каждых 8 нс

  • Частота дискретизации выходного порта отлично совпадает с тактовой частотой, Спекулянт = (период часов HDL)

  • Ни одни из выходных параметров не пропущены, и формы волны сравнения совпадают

Рекламируйте = 4 нс

  • Выход модуля HDL производится Simulink на уровне каждых 2 нс

  • Частота дискретизации выше, чем тактовая частота, Ts = 0.5x (период часов HDL)

  • Выход Сверхдискретизирован, и выше выходная частота дискретизации не выплачивает дивиденда здесь

Следовательно понимание уровня синхронизации синхронного модуля HDL может быть выгодным для cosimulation, если вы не хотите сверхдискретизировать или субдискретизировать выход от HDL.

4. Наблюдайте результаты в Осциллографе Simulink когда Спекулянт = 8 нс

Вы заметите, что выходные параметры из алгоритма Simulink совпадают с выходными параметрами, полученными из блока HDL Cosimulation (помеченный как 2 в изображении), за исключением первых 24 нс (помеченный как 1 в изображении). Начальные значения этих двух выходных параметров не совпадают из-за логики сброса, используемой в HDL (о котором Simulink не знает и не включает в свой алгоритм). Мы обсудим это подробно позже в примере.

Эффект часов, управляющих модулем HDL и условиями состязания

Важно изучить, что механизм Simulink не работает в разовых дельтой циклах, и следовательно Simulink запрашивает выходной порт блока HDL Cosimulation в определенных интервалах дискретного времени. С другой стороны, симулятор HDL не делает гарантий относительно порядка изменения значения по сравнению с некоторым другим присвоением сигнала блокирования. Таким образом, если значения Simulink управляются/, произведенный в то же время, что и активный фронт синхроимпульса в HDL, существует состояние состязания. Во избежание таких условий состязания важно, чтобы значения Simulink не управлялись/, произведенный в то же время, что и активный фронт синхроимпульса в HDL.

В коде Verilog paritychecker_clk_driver.v отмечают, как положительное ребро часов (который является активным ребром) было намеренно возмещено наполовину его период поэтому, как избегают потенциального состояния состязания.

Случай для задержки на 24 нс

Код Verilog управляется таким образом, что модуль сбрасывается для первых 16 нс. Однако выходное несоответствие, замеченное на Осциллографе Simulink, для 24 нс. Для того, чтобы лучше изучить, почему эта задержка происходит, мы получили снимок состояния формы волны симулятора HDL (с разовыми дельтой задержками и расширенными событиями), когда симуляция была запущена с Tout=8ns:

На уровне 16 нс, выход parity_out1 в симуляторе HDL все еще содержит его предыдущее состояние, поскольку выход только намечен, чтобы измениться в возрастающем ребре часов. Следовательно Simulink производит предыдущее состояние выхода на уровне 16 нс. Также обратите внимание на то, что даже при том, что мы установили Ts=Tout=8ns в Simulink, механизм Simulink не знает, как симулятор HDL выполнит свои разовые дельтой итерации. Следовательно выходные параметры могли быть произведены Simulink в разовых дельтой областях значений (пометил 1), показанный в изображении выше.

Часы удобства

Вместо того, чтобы создать ваш собственный код драйвера (испытательный стенд) для модуля HDL, можно использовать часы удобства блока HDL Cosimulation, чтобы сгенерировать вход синхронизации. Можно задать период часов (T), и это - активное ребро в панели Часов блока HDL Cosimulation. Эти часы, сгенерированные блоком HDL Cosimulation, имеют преднамеренную задержку T/2, применился к первому активному фронту синхроимпульса (который вы задаете) - во избежание условий состязания. Для того, чтобы показать, как использовать эти часы, мы предоставили модели, parity_check_convclk.slx (ModelSim) и parity_check_convclk_in.slx (Острый), которые используют часы, созданные блоком HDL Cosimulation как ведущий сигнал для модифицированной версии модулей средства проверки четности (paritychecker_convclk.v).

Панель Часов HDL, который блокирует Cosimulation, установлена как показано в изображении ниже. Заметьте, как активное ребро часов собирается повыситься:

Запустите модель и наблюдайте выходные сигналы

Результаты совпадают с полученными в Масштабах времени в качестве примера: Абсолютный, Относительный и Автоматический. Выход формы волны симулятора HDL получен в изображении ниже:

Заметьте, как сдвиг начальной фазы T/2 применяется к первому активному ребру clk - показанный маркировать 1 в изображении.

Составление задержки сброса для того, чтобы сравнить результаты Cosimulation

Simulink не знает ни о какой логике сброса, что модуль HDL может иметь в распоряжении и не включает такую логику сброса в свой алгоритм. Следовательно HDL cosimulation результаты будет вне синхронизации относительно алгоритма Simulink (подсистема).

Теперь, если необходимо сравнить выход блока HDL Cosimulation результатами, полученными из алгоритма Simulink, необходимо гарантировать, что синхронизируются обе этих симуляции. Существует много способов достигнуть этого, один из которых показаны в parity_check_reset.slx (ModelSim) и (Остром) parity_check_reset_in.slx.

Здесь мы используем tclstart аргументы, чтобы запустить симулятор HDL для 16 нс (период сброса) сразу после HDL Verifier настраивают ссылку cosimulation. Следовательно модуль HDL запускается для 16 нс, прежде чем вы запустите симуляцию в Simulink.

Запустите модель и наблюдайте выход Scope

Ключевые пункты к Примечание:

  • Все шаги расчета порта и технические требования часов находятся во время Simulink. Например, если масштаб времени установлен в '1 с в Simulink, соответствует 1 с в симуляторе HDL', период часов должен быть T=8ns. Однако, если масштаб времени установлен в '1 с в Simulink, соответствует 1 нс в симуляторе HDL', период часов должен быть T=8s. Это объяснено в Масштабах времени в качестве примера: Абсолютный, Относительный и Автоматический

  • Часы, сгенерированные в панели часов, предназначаются, чтобы управлять HDL-кодом только

  • Все сигналы управляются от панели Tcl или в tclstart из запуска симулятора HDL команда находятся во время HDL

  • Все сигналы, управляемые из HDL-кода, находятся во время HDL