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

Dav*_*ole 5 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)
Run Code Online (Sandbox Code Playgroud)

据我所知,没有办法获得一个行号.因此,如果断言失败,我只会收到一条消息,无法链接回故障位置.

assert failed 65535 != 65534
Run Code Online (Sandbox Code Playgroud)

有没有办法获得当前的行号?或者有更好的方法在Verilog中进行断言测试?

谢谢!

Hac*_*eur 8

SystemVerilog 2009提供编译器指令.引用IEEE Std 1800-2009规范,第22.13节:

`__FILE__以字符串文字的形式扩展为当前输入文件的名称.这是工具打开文件的路径,而不是`include工具的输入文件名参数中指定的短名称.此路径名的格式可能与实现有关.

`__LINE__以简单的十进制数形式扩展到当前输入行号.
例如:
$display("Internal error: null handle at %s, line %d.", `__FILE__, `__LINE__);

有关更多详细信息,请参阅完整规范.


小智 4

如果这是一个程序上下文,您可以使用 $finish(1);它来打印位置。

  • 在 Icarus Verilog 中进行了测试。$finish() 的该参数未实现。但在 Xilinx 中确实有效。我将看看是否可以提交 Icarus Verilog 的修复程序。谢谢! (3认同)