Условия гонки в симуляторах HDL

Избегание гоночных условий

Хорошо известная проблема в оборудование симуляции - это потенциал различных результатов на разных запусках, когда присутствуют условия расы. Поскольку Симулятор HDL является высоко параллельным окружением выполнения, вы должны записать HDL так, чтобы результаты не зависели от упорядоченного расположения выполнения процесса.

Хотя существуют известные кодирующие идиомы для достижения реалистичной симуляции тестируемого проекта, вы всегда должны уделять особое внимание интерфейсам испытательный стенд/DUT для применения стимулов и результатов считывания, даже в чистом HDL- окружений. Для интерфейса HDL/иностранного языка, такого как Simulink® или MATLAB® сеанс косимуляции, задача усложняется, если у вас нет общего сигнала синхронизации, такого как часы, координирующие поток данных.

Потенциальные условия гонки в сеансах косимуляции Simulink

Все сигналы на интерфейсе блока 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-кода находятся между асинхронными временными интервалами. Вам может потребоваться избыточная выборка выходов, чтобы увидеть, что все переходы данных получены.

Потенциальные условия гонки в сеансах косимуляции MATLAB

Когда вы используете -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

Для просмотра документации необходимо авторизоваться на сайте