当检测到不应该发生的先决条件时,我有一个具有断言的模块。当我为模块提供无效输入时,如何编写基于此断言失败的测试?
过去,我使用 Verilog PLI 做过这类事情。我正在学习 SystemVerilog,如果可能的话,我更喜欢使用一些 Verilog 或 SV 结构,并避免运行单独的程序。
当检测到不应该发生的先决条件时,我有一个具有断言的模块。当我为模块提供无效输入时,如何编写基于此断言失败的测试?
过去,我使用 Verilog PLI 做过这类事情。我正在学习 SystemVerilog,如果可能的话,我更喜欢使用一些 Verilog 或 SV 结构,并避免运行单独的程序。
我认为你正在考虑这个错误的方式。
当检测到不应该发生的先决条件时,我有一个具有断言的模块。当我为模块提供无效输入时,如何编写基于此断言失败的测试?
这听起来很混乱。如果模块对给定的输入做了正确的事情,则测试应该通过。如果模块做出正确的响应,则为模块提供无效输入不应导致测试失败。正确的做法可能是标记错误、引发中断或只是忽略输入。
因此,您永远不需要要求测试失败。
我想你的意思是:
我想测试一个具有“无效”刺激的模块,并且我想确保模块注意到(例如通过标记错误)
在这种情况下,断言变为:
assert @some_event (invalid_input |=> error_caught);
然后,您使用覆盖率来确保测试导致断言在某个时间点完成。
一种方法是使用宏。为正常操作定义一个宏,为测试模式定义另一个:
`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");