如何才能进行仅在断言失败时才通过的测试?

时间:2013-08-20 19:30:33

标签: unit-testing testing verilog system-verilog

我有一个模块,当检测到一个永不发生的前提条件时,该模块有一个断言。当我给模块无效输入时,如何编写基于此断言传递的测试?

过去,我使用Verilog PLI完成了这类工作。我正在学习SystemVerilog,我更喜欢使用一些Verilog或SV构造,并且如果可能的话,避免必须运行单独的程序。

2 个答案:

答案 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");