Как я могу сделать тест, который проходит только тогда, когда утверждение терпит неудачу?

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

В прошлом я делал подобные вещи, используя Verilog PLI. Я изучаю SystemVerilog, и я бы предпочел использовать некоторые конструкции Verilog или SV и по возможности избегать запуска отдельной программы.


person dan    schedule 20.08.2013    source источник


Ответы (2)


Я думаю, вы думаете об этом неправильно.

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

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

Следовательно, вам никогда не нужно требовать, чтобы тест провалился.

Я думаю, что вы имеете в виду:

Я хочу протестировать модуль с «недопустимым» стимулом и хочу убедиться, что модуль замечает (например, помечая ошибку)

В этом случае утверждение становится:

assert @some_event (invalid_input |=> error_caught);

Затем вы используете покрытие, чтобы убедиться, что тест привел к завершению утверждения в какой-то момент.

person Paul S    schedule 22.08.2013

Один из способов сделать это с помощью макросов. Определите макрос для нормальной работы и еще один для тестового режима:

`define MY_ASSERT(X) assert(X)
`ifdef TEST
  `define MY_ASSERT(X) if (!(X)) $display("TEST PASS")
`endif

Пример теста с результатами моделирования на EDA Playground: http://www.edaplayground.com/s/4/ 92

Вот еще один пример, который включает пользовательское сообщение:

`define MY_ASSERT(X,MSG) assert(X) else $error(MSG)
`ifdef TEST
  `define MY_ASSERT(X,MSG) if (!(X)) $display({"TEST PASS with assert:", MSG})
`endif

Используйте это так: `MY_ASSERT(in == 1'b1, "Bad input");

person Victor Lyuboslavsky    schedule 20.08.2013
comment
Это очень плохая идея. Не делай этого! Единичная проверка никогда не должна приводить к отображению сообщения TEST PASS. Вы должны сигнализировать о прохождении теста только в конце теста, когда не произошло ничего неожиданного. - person Paul S; 22.08.2013
comment
Да. В полной тестовой среде у вас должен быть обратный вызов для отслеживания сработавших утверждений (вместо простого $display). Затем, в конце теста, вы можете проверить, действительно ли сработало утверждение, которое вы ожидали запустить. - person Victor Lyuboslavsky; 22.08.2013