Известной проблемой в аппаратной симуляции является потенциал для различных результатов на различных выполнениях, когда условия состязания присутствуют. Поскольку симулятор HDL является очень параллельной средой выполнения, необходимо записать HDL, таким образом, что результаты не зависят от упорядоченного расположения выполнения процесса.
Несмотря на то, что существуют известные идиомы кодирования для достижения реалистической симуляции проекта под тестом, необходимо всегда проявлять специальную заботу в испытательном стенде/DUT интерфейсы для применения стимула и чтения результатов, даже в чистых средах HDL. Для интерфейса HDL/иностранного языка, такой как с Simulink® или MATLAB® cosimulation сеанс, усугублена проблема, если у вас нет общего сигнала синхронизации, такого как часы, координируя поток данных.
Всем сигналам в интерфейсе блока HDL Cosimulation в Библиотеке Simulink сопоставили внутреннюю частоту дискретизации с ними. Эта частота дискретизации может считаться неявными часами, которые управляют временем симуляции, в котором может произойти изменение значения. Поскольку эти неявные часы абсолютно неизвестны механизму HDL (то есть, это не сигнал HDL), времена, в которые входные значения управляются в HDL, или выходные значения выбираются от HDL, являются асинхронными к любым часам, закодированным в HDL непосредственно, даже если они номинально на той же частоте.
Для изменений значения Simulink, которые, как запланировали, произойдут в определенном времени симуляции, симулятор HDL не делает гарантий относительно порядка, что изменение значения происходит по сравнению с некоторым другим присвоением сигнала блокирования. Таким образом, если значения Simulink управляются/выбираются в то же время, что и активный фронт синхроимпульса в HDL, существует состояние состязания.
Для случаев, где ваш активный фронт синхроимпульса HDL и ваш внутренний Simulink активные фронты синхроимпульса на той же частоте, можно способствовать желаемому распространению данных путем возмещения одного из тех ребер. Поскольку частоты дискретизации Simulink всегда выравниваются со временем 0, можно выполнить это смещение путем сдвига активного фронта синхроимпульса в HDL прочь времени 0. Если вы кодируете стимул часов в HDL, используйте оператор задержки ("после" или "#"), чтобы выполнить это смещение.
При использовании команды "силы" Tcl, чтобы описать форму волны часов, можно просто поместить первое активное ребро в некоторое ненулевое время. Используя ненулевое значение позволяет частоту дискретизации Simulink, которая совпадает с основной тактовой частотой в вашем HDL. Этот пример показывает часы на 20 нс (таким образом, частоты дискретизации Simulink также составят каждые 20 нс) с активным положительным ребром, которое смещается со времени 0 на 2 нс (пример, показанный для использования с Incisive®):
> force top.clk = 1'b0 -after 0 ns 1'b1 -after 2 ns 1'b0 -after 12 ns -repeat 20 ns
Для HDL Cosimulation блокируется с панелями Часов, можно задать период часов и активное ребро в той панели. Определение формы волны помещает неактивное ребро во время 0 и активное ребро во время T/2. Это размещение устанавливает максимальную настройку, и содержите времена для часов с 50%-м рабочим циклом.
Если частоты дискретизации Simulink на различной частоте, чем часы HDL, то необходимо синхронизировать сигналы между HDL и Simulink, когда вы сделали бы с любым несколько проект временного интервала, даже один в чистом HDL. Например, можно поместить два синхронизирующихся триггеров в интерфейсе.
Если ваш cosimulation не включает часы, то необходимо также обработать взаимодействие через интерфейс Simulink и HDL-кода, как являющегося между асинхронными временными интервалами. Вы, возможно, должны сверхдискретизировать выходные параметры, чтобы видеть, что все переходы данных получены.
Когда вы используете -sensitivity
, -rising_edge
, или опции планирования -falling_edge
к matlabtb
или matlabcp
, чтобы инициировать вызовы функции MATLAB, распространение значений следует за той же семантикой как чистый проект HDL; триггеры должны произойти, прежде чем результаты смогут быть вычислены. У вас все еще могут быть условия состязания, но они могут анализироваться в одном только HDL.
Однако, когда вы используете опцию планирования -time
для matlabtb
или matlabcp
, или используете tnext
в самой функции MATLAB, управление значений сигналов или выборка значений сигналов не могут быть гарантированы относительно никаких изменений сигнала HDL. Именно, как будто потенциальные условия состязания в том основанном на времени планировании похожи на неявные часы, неизвестно механизму HDL и не видим, только смотря на HDL-код.
Средства эквивалентны для взаимодействия через интерфейс Сигнала Simulink: убедитесь, что выборка и управление сигналов не происходят в тех же временах симуляции как вызовы функции MATLAB.
Проблемы, соединяющие интерфейсом с проектами от испытательных стендов и иностранных языков, включая условия состязания в чистых средах HDL, известны и экстенсивно зарегистрированы. Некоторые тексты, которые описывают эти проблемы, включают:
Документация для продукта симулятора HDL каждого поставщика
Спецификации стандартов HDL
Запись Испытательных стендов: Функциональная Верификация Моделей HDL, Janick Bergeron, 2-го выпуска, © 2003
Verilog и глюки SystemVerilog, Стюарт Сазерленд и Дон Миллз, © 2007
SystemVerilog для верификации: руководство по изучению функций языка испытательного стенда, копья Криса, © 2007
Принципы проекта RTL поддающегося проверке, Лайонела Бенинга и Гарри Д. Фостера, © 2001