Этот пример иллюстрирует отношение шагов расчета Simulink ® к часам HDL и сбрасывается с помощью HDL- Verifier™, чтобы косимулировать простой синхронный модуль проверки четности Verilog. Пример также содержит следующее:
Объясняет, как итерации в дельта-времени в HDL-симуляторе (ModelSim ® или Incisive ®) могут повлиять на результаты косимуляции
Показывает использование панели «Часы» в блоке HDL Cosimulation для управления тактовыми сигналами в HDL
Показывает, как вы можете точно сравнить результаты косимуляции, принимая во внимание логические задержки сброса HDL
Проверка четности является методом добавления бита четности к потоку данных в порядок, чтобы проверить эти данные на наличие любых ошибок. В этом примере мы будем использовать схему «четный бит четности». Модуль HDL разработан таким образом, чтобы быть синхронным и обновляет свое состояние на каждом поднимающемся ребре синхроимпульса.
Синхронный модуль проверки четности (paritychecker_clk_dut.v) принимает 8-битный вход, выводит 1 бит четности и управляется на каждом поднимающемся ребре синхроимпульса.
Если вы используете ModelSim или QuestaSim, parity_check_clk.slx модели должны быть открыты. Если вы используете Incisive или Xcelium, закройте модель ModelSim и откройте parity_check_clk_in.slx модели.
В модели мы используем 8-битный счетчик, чтобы предоставить входные данные HDL-коду через блок HDL Cosimulation и его эквивалентный алгоритм Simulink. Область возможностей используется, чтобы просмотреть их выходы и сравнить результаты. Модель показывает, как частота дискретизации Simulink влияет на косимуляцию с помощью HDL-модуля. Нажимаемые аннотации могут использоваться, чтобы изменить шаг расчета выходного порта блока косимуляции (Tout).
Обратите внимание, что входы синхроимпульса и сброса для тестируемого проекта генерируются в модуле драйвера (paritychecker_clk_driver.v). Сброс поддерживается высоким в течение первых 16 нс и после этого является низким. Часы имеют период 8 нс и настроены таким образом, что их первый поднимающееся ребро происходит на 4 нс. Следовательно, модуль способен обновлять свой выход с максимальной скоростью 8 нс, то есть на каждом поднимающемся ребре синхроимпульса.
1. Запуск ModelSim или Incisive
Прежде чем запускать модель, вы должны сначала запустить Симулятор HDL. Используйте для этого команду запуска, предусмотренную в модели.
2. Наблюдайте настройки на панели Порты блока косимуляции
Дважды кликните блок HDL Cosimulation, чтобы отредактировать параметры косимуляции. Откроется диалоговое окно Параметров блоков. Выберите вкладку Ports.
Шаг расчета порта выхода (parity_out1
) устанавливается на Tout. Существует множество способов задать значение Tout. Мы установили начальное значение Ts из PreLoadFcn
модели коллбэк (см. «Создание коллбэков модели» (Simulink)). Мы устанавливаем новые значения для Tout, используя любую из кликабельных аннотаций, представленных в модели. Значение Tout можно задать и в командной строке MATLAB ®.
Обратите внимание, что опция разрешения прямого сквозного соединения не была проверена - это потому, что наш код Verilog не является чисто комбинационным.
Модель предоставляет три кликабельные аннотации для установки времени дискретизации выходных портов блока HDL Cosimulation) Tout = 32ns, 8ns и 4ns.
3. Запустите модель со всеми тремя версиями Tout
Tout = 32ns
Выходы модуля HDL отбираются Simulink каждые 32 нс
Частота дискретизации выходного порта ниже тактовой частоты, Tout = 4x (период синхроимпульса HDL)
Выходы блока HDL Cosimulation являются Недостаточно дискретизированными, в результате чего и parity_out1
сигнал внутри Симулятора HDL не совпадает с результатом Осциллографа Simulink
Tout = 8ns
Выходы модуля HDL отбираются Simulink каждые 8 нс
Частота дискретизации выходного порта идеально соответствует тактовой частоте, Tout = (период синхроимпульса HDL)
Ни один из выходов не пропущен, и формы сравнения совпадают
Tout = 4ns
Выходы модуля HDL отбираются Simulink каждые 2 нс
Частота дискретизации выше тактовой частоты, Ts = 0.5x (HDL-тактовый период)
Выход переизбран, и более высокая частота дискретизации выпуска не платит никаких дивидендов здесь
Следовательно, понимание скорости синхронизации синхронного модуля HDL может быть выгодным для косимуляции, если вы не хотите переопределять или занижать выход из HDL.
4. Наблюдайте результаты в осциллограф Simulink, когда Tout = 8ns
Вы заметите, что выходы алгоритма Simulink совпадают с выходами, полученными из блока HDL Cosimulation (помечен как 2 на изображении), за исключением первых 24 нс (помечен как 1 на изображении). Начальные значения двух выходов не совпадают из-за логики сброса, используемой в HDL (о которой Simulink не знает и не включает в свой алгоритм). Подробно это обсудим позже в примере.
Важно понимать, что механизм Simulink не работает в дельта-временных циклах и, следовательно, Simulink запрашивает выходной порт блока HDL Cosimulation с определенными дискретными временными интервалами. С другой стороны, Симулятор HDL не делает никаких гарантий в отношении порядка изменения значения по сравнению с некоторым другим назначением сигнала блокировки. Таким образом, если значения Simulink управляются/дискретизируются одновременно с активным ребром синхроимпульса в HDL, существует условие гонки. Чтобы избежать таких условий гонки, важно, чтобы значения Simulink не управлялись/дискретизировались одновременно с активным ребром синхроимпульса в HDL.
В коде Verilog обратите внимание paritychecker_clk_driver.v как положительное ребро часов (который является активным ребром) был намеренно смещен на половину своего периода, чтобы избежать потенциального условия гонки.
Случай задержки 24ns
Код Verilog управляется таким образом, что модуль сбрасывается в течение первых 16ns. Однако выходное несоответствие, наблюдаемое в осциллограф Simulink, для 24 нс. Чтобы лучше понять, почему происходит эта задержка, мы запечатлели снимок волны HDL-симулятора (с расширенными задержками в дельта-времени и событиями), когда симуляция выполнялась с Tout = 8ns:
В 16 нс выход parity_out1
в пределах симулятора HDL по-прежнему держит свое предыдущее состояние, так как выход только планируется изменить на возрастающем ребре синхроимпульса. Следовательно, Simulink дискретизирует предыдущее состояние выхода на 16 нс. Кроме того, обратите внимание, что, несмотря на то, что мы установили Ts = Tout = 8ns в Simulink, движок Simulink не знает, как HDL-симулятор будет выполнять свои итерации в дельта-времени. Следовательно, выходы могут быть дискретизирована Simulink в пределах дельта-временных областей значений (обозначенной как 1), показанной на изображении выше.
Часы удобства
Вместо создания собственного кода драйвера (testbench) для HDL-модуля можно использовать удобные часы блока HDL Cosimulation, чтобы сгенерировать вход синхронизации. Можно задать тактовый период (T) и его активное ребро на панели «Часы» блока HDL Cosimulation. Этот синхроимпульс, сгенерированный блоком HDL Cosimulation, имеет преднамеренную T/2 задержку, примененную к первому активному ребру синхроимпульса (который вы задаете) - в порядок избежать гоночных условий. В порядок, чтобы показать, как использовать эти часы, мы предоставили модели, parity_check_convclk.slx (ModelSim) и parity_check_convclk_in.slx (Incisive), которые используют часы, созданные блоком HDL Cosimulation, в качестве ведущего сигнала для измененной версии модулей четного контроля четности (paritychecker_convclk.v).
Панель Часы блоков HDL-косимуляции задается как показано на изображении ниже. Заметьте, как активное ребро часов будет повышаться:
Запустите модель и наблюдайте выходы
Результаты те же, что и в примере Timescales: Absolute, Relative и Automatic. Выход формы волны Симулятора HDL получен на изображении ниже:
Заметьте, как начальный сдвиг фазы T/2 применяется к первому активному ребру clk
- показан меткой 1 на изображении.
Simulink не знает о какой-либо логике сброса, которую может иметь HDL-модуль, и не включает такую логику сброса в свой алгоритм. Следовательно, результаты HDL-косимуляции будут несинхронными относительно алгоритма Simulink (подсистемы).
Теперь, если вам нужно сравнить выход блока HDL Cosimulation с результатами, полученными из алгоритма Simulink, вы должны убедиться, что обе эти симуляции синхронизированы. Для этого существует ряд способов, один из которых показан в parity_check_reset.slx (ModelSim) и parity_check_reset_in.slx (Incisive).
Здесь мы используем tclstart
аргументы для запуска симулятора HDL в течение 16ns (период сброса) сразу после того, как HDL Verifier установит ссылку косимуляции. Следовательно, модуль HDL запускается в течение 16 нс, прежде чем вы начнете симуляцию в Simulink.
Запустите модель и наблюдайте выход возможности
Ключевые моменты, которые необходимо отметить:
Все шаги расчета портов и спецификаций синхроимпульса находятся во времени Simulink. Например, если для timescale задано значение '1s в Simulink, соответствует значению 1s в HDL-симуляторе', тактовый период должен быть T = 8ns. Однако, если шкала времени установлена на '1s в Simulink, соответствует 1ns в HDL-симуляторе', период времени должен быть T = 8s. Это объясняется в примере Timescales: Absolute, Relative и Automatic
Часы, сгенерированные в области часов, предназначены только для управления HDL-кодом
Все сигналы, управляемые с панели Tcl или в tclstart
команды запуска симулятора HDL находятся в HDL времени
Все сигналы, управляемые из HDL-кода, находятся в HDL-времени