Хорошо известная проблема в оборудование симуляции - это потенциал различных результатов на разных запусках, когда присутствуют условия расы. Поскольку Симулятор HDL является высоко параллельным окружением выполнения, вы должны записать HDL так, чтобы результаты не зависели от упорядоченного расположения выполнения процесса.
Хотя существуют известные кодирующие идиомы для достижения реалистичной симуляции тестируемого проекта, вы всегда должны уделять особое внимание интерфейсам испытательный стенд/DUT для применения стимулов и результатов считывания, даже в чистом HDL- окружений. Для интерфейса HDL/иностранного языка, такого как Simulink® или MATLAB® сеанс косимуляции, задача усложняется, если у вас нет общего сигнала синхронизации, такого как часы, координирующие поток данных.
Все сигналы на интерфейсе блока HDL Cosimulation в библиотеке Simulink имеют внутреннюю частоту дискретизации, связанную с ними. Эту частоту дискретизации можно рассматривать как неявный синхроимпульс, который управляет временем симуляции, в котором может произойти изменение значения. Поскольку этот неявный синхроимпульс полностью неизвестен HDL-механизму (то есть он не является HDL-сигналом), время, в которое входные значения приводятся в HDL или выходные значения дискретизируются из HDL, асинхронно всем часам, закодированным в HDL непосредственно, даже если они номинально на той же частоте
Для изменений значения Simulink, запланированных на определенное время симуляции, симулятор HDL не делает никаких гарантий в порядок, что изменение значения происходит по сравнению с некоторым другим назначением сигнала блокировки. Таким образом, если значения Simulink управляются/дискретизируются одновременно с активным ребром синхроимпульса в HDL, существует условие гонки.
В случаях, когда ваше активное ребро синхроимпульса и внутренние активные ребра Simulink имеют одинаковую частоту, можно способствовать желаемому распространению данных, смещая один из этих ребер. Поскольку частоты выборки Simulink всегда выравниваются со временем 0, можно выполнить это смещение путем смещения активного ребра синхроимпульса в HDL вне времени 0. Если вы кодируете синхросигнал в HDL, используйте оператор задержки («после» или «#»), чтобы выполнить это смещение.
При использовании команды Tcl «force» для описания формы волны синхроимпульса можно просто поместить первое активное ребро в некоторое ненулевое время. Использование ненулевого значения позволяет использовать частоту выборки 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. Для примера можно разместить два синхронизирующих триггера на интерфейсе.
Если ваша косимуляция не включает часы, то вы также должны считать, что интерфейсы 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
Writing Testbenches: Functional Verification of HDL Models, Janick Bergeron, 2nd edition, © 2003
Verilog and SystemVerilog Gotchas, Stuart Satherland and Don Mills, © 2007
SystemVerilog for Verification: Руководство по изучению характеристик языка Testbench, Chris Spear, © 2007
Принципы проверяемых Проектов RTL, Лайонел Бенинг и Гарри Д. Фостер, © 2001