我有一个模块,当检测到一个永不发生的前提条件时,该模块有一个断言。当我给模块无效输入时,如何编写基于此断言传递的测试?
过去,我使用Verilog PLI完成了这类工作。我正在学习SystemVerilog,我更喜欢使用一些Verilog或SV构造,并且如果可能的话,避免必须运行单独的程序。
答案 0 :(得分:3)
我认为你正在考虑这种错误的方式。
我有一个模块,当检测到一个永不发生的前提条件时,该模块有一个断言。当我给模块无效输入时,如何编写基于此断言传递的测试?
听起来很混乱。如果模块为输入的输入做了正确的事,测试应该通过。如果模块做出正确的响应,则给模块无效输入不应导致测试失败。正确的事情可能是标记错误,引发中断或者可能只是忽略输入。
因此,您永远不需要要求测试失败。
我认为你的意思是:
我想测试一个带有“无效”激励的模块,我想确保模块注意到(例如通过标记错误)
在这种情况下,断言变为:
assert @some_event (invalid_input |=> error_caught);
然后使用coverage来确保测试导致断言在某个时刻完成。
答案 1 :(得分:0)
一种方法是使用宏。为正常操作定义一个宏,为测试模式定义另一个宏:
`define MY_ASSERT(X) assert(X)
`ifdef TEST
`define MY_ASSERT(X) if (!(X)) $display("TEST PASS")
`endif
在EDA Playground上使用SIM结果进行样本测试: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");