2012-03-09 11 views
1

Привет, спасибо за это.Недействительный Kill-switch для SystemVerilog Testbench Simulation (VCS)

Я размышлял над идеей о бездействии killswitch для моделирования SystemVerilog.

Есть ли способ, в течение которого длительная (программируемая) продолжительность бездействия при запуске «simv» может инициировать внутреннее событие для вызова «$ finish»? Или это возможно с помощью команды VCS?

Проведение мозгового штурма. И дайте мне знать, если что-то неясно.

RRS

ответ

1

В VHDL я использую разрешенный сигнал.

Каждый процесс, который генерирует или анализирует данные, записывает 0 в этот сигнал во время работы. Как только он находится в состоянии для моделирования, он пишет 1.

Только в том случае, если все процессы счастливы, состояние изменения сигнала равно 1 (это либо X, либо 0 в остальное время).

Процессы синхронизации часов контролируют этот сигнал, и когда он становится 1, они перестают генерировать тактовые импульсы; дальнейшие переходы не запланированы, и симулятор знает, что нужно остановиться.

Предположительно Verilog может делать что-то подобное.

+0

Это звучит неплохо.В этот момент я использую killswitch, который отсчитывает до 0 и запускает финиш $. Я думал, есть ли способ получить доступ к списку событий в симуляторе, а затем вызвать, когда больше не осталось событий для имитации. Я предполагаю, что большая проблема заключается в том, что переход часов считается событием. Поправьте меня, если я ошибаюсь. – boffin

+0

Симулятор делает именно это (он смотрит список событий и заканчивается, когда нет запланированных), и я убеждаюсь, что отключу все источники событий (которые на моих тестовых стендах - это всего лишь часы, хотя тестовые узлы очень поведенческий). –

1

Внутри чипа дизайнерских компаний, которые я работал, это называется «проверка в состоянии покоя», но я не уверен, что это стандарт название отрасли. Вы внедряете «код инструментария», который проверяет, что система поступила в покое. V̶e̶r̶i̶s̶i̶t̶y̶'̶s̶ Specman-e tool Cadence делает это довольно элегантно с возражением против конца тестового механизма (raise_objection(MAIN_TEST_DONE)/drop_objection(MAIN_TEST_DONE)). По сути, мониторы повсюду в системе «поднимают» возражение в начале моделирования (т. Е. Увеличивают счетчик), затем, когда имитация запускается, они определяют, что их часть тестируемого устройства находится в состоянии покоя и они «уменьшают» возражение (т.е. уменьшают этот глобальный счетчик). Когда больше нет возражений против окончания теста (т. Е. Глобальный счетчик равен 0), то вызывается $finish. Мониторы могут поднимать и уменьшать возражения на протяжении всего теста, но если и когда счетчик когда-либо достигает 0, тест равен $finish 'd.

Универсальная методика проверки (UVM) взяла эту методологию от Specman, и она описана здесь в их UVM Reference Manual. В первую очередь, UVM реализуется с Verilog, поэтому вы можете определенно использовать их свободно доступную библиотеку для реализации «проверки покоя». Справочное руководство Cadence's Specman UVM также описывает этот механизм на http://support.cadence.com. К сожалению, Cadence требует, чтобы вы были клиентом, прежде чем они покажут вам свои документы, и поэтому вы должны использовать поисковую систему, отличную от Google, чтобы найти то, что вы хотите. Это немного боль.

+0

Спасибо за ответ ... это имеет большой смысл. Я использую Synopsys VCS, поэтому я предполагаю, что я должен найти эквивалент для «спокойной проверки» в VCS. Есть ли способ получить доступ к списку событий/счетчику без прохождения UVM? – boffin

+0

AFAIK, проверка покоя не поступает из VCS по умолчанию (как в среде Specman.) Вы можете либо реализовать этот глобальный счетчик самостоятельно, либо импортировать его из uvm. BTW, важно отслеживать _who_ имеет выдающееся возражение против завершения теста для целей отладки. Я бы выполнил его на C++ как 'set', а затем подключил VCS с вызовами DPI к' incr (my_rtl_path) '' decr (my_rtl_path) '. –