1

当检测到不应该发生的先决条件时,我有一个具有断言的模块。当我为模块提供无效输入时,如何编写基于此断言失败的测试?

过去,我使用 Verilog PLI 做过这类事情。我正在学习 SystemVerilog,如果可能的话,我更喜欢使用一些 Verilog 或 SV 结构,并避免运行单独的程序。

4

2 回答 2

3

我认为你正在考虑这个错误的方式。

当检测到不应该发生的先决条件时,我有一个具有断言的模块。当我为模块提供无效输入时,如何编写基于此断言失败的测试?

这听起来很混乱。如果模块对给定的输入做了正确的事情,则测试应该通过。如果模块做出正确的响应,则为模块提供无效输入不应导致测试失败。正确的做法可能是标记错误、引发中断或只是忽略输入。

因此,您永远不需要要求测试失败。

我想你的意思是:

我想测试一个具有“无效”刺激的模块,并且我想确保模块注意到(例如通过标记错误)

在这种情况下,断言变为:

assert @some_event (invalid_input |=> error_caught);

然后,您使用覆盖率来确保测试导致断言在某个时间点完成。

于 2013-08-22T12:18:38.867 回答
0

一种方法是使用宏。为正常操作定义一个宏,为测试模式定义另一个:

`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");

于 2013-08-20T21:00:12.297 回答