我是Verilog的新手,但多年来一直是C程序员,这让我很危险。
我正在为一堂课做一些Verilog。我想在我的模拟代码中使用C assert()样式测试。 https://en.wikipedia.org/wiki/Assert.h
我们没有使用System Verilog,因此没有可以找到的标准断言。我拼凑了下面的宏。
`define ASSERT_EQUALS(x,y) \
repeat(1)\
begin\
if( (x) != (y) ) \
begin\
$write( "assert failed %d != %d\n", (x), (y) );\
$finish;\
end\
end
// test the assert( should fail)
`ASSERT_EQUALS(t_data_in,16'hfffe)
据我所知,没有办法获得一个行号。因此,如果断言失败,我只会得到一条无法链接回故障位置的消息。
assert failed 65535 != 65534
有没有办法获得当前的行号?或者有更好的方法在Verilog中进行断言测试?
谢谢!
答案 0 :(得分:8)
SystemVerilog 2009提供编译器指令。引自IEEE Std 1800-2009规范,第22.13节:
`__FILE__
以字符串文字的形式扩展为当前输入文件的名称。这是工具打开文件的路径,而不是`include
中指定的短名称或工具的输入文件名参数。此路径名的格式可能与实现有关。
`__LINE__
以简单的十进制数形式扩展为当前输入行号。
例如:
$display("Internal error: null handle at %s, line %d.", `__FILE__, `__LINE__);
有关详细信息,请参阅完整规范。
答案 1 :(得分:4)
如果这是程序上下文,您可以使用$finish(1);
来打印该位置。