在Verilog中有类似__LINE__的东西吗?

时间:2012-10-13 18:32:25

标签: verilog system-verilog

我是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中进行断言测试?

谢谢!

2 个答案:

答案 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);来打印该位置。