7

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

谢谢!

4

2 回答 2

10

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

`__FILE__以字符串文字的形式展开为当前输入文件的名称。这是工具打开文件的路径,而不是在工具的输入文件名参数中指定的短名称`include或作为工具的输入文件名参数。此路径名的格式可能取决于实现。

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

有关详细信息,请参阅完整规范。

于 2012-10-18T11:28:28.793 回答
4

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

于 2012-10-13T20:43:33.537 回答