在Verilog中断言

时间:2012-12-16 19:34:59

标签: assert verilog

我对Verilog完全不熟悉,所以请耐心等待。

我想知道Verilog中是否有断言声明。在我的测试平台中,我希望能够断言模块的输出等于某些值。

例如,

mymodule m(in, out);
assert(out == 1'b1);
谷歌搜索给了我一个few links,但它们要么太复杂,要么似乎不是我想要的。

5 个答案:

答案 0 :(得分:12)

有一个名为OVL的断言的开源库。但是,它非常沉重。我从那里得到的一个技巧是创建一个模块来做断言。

module assert(input clk, input test);
    always @(posedge clk)
    begin
        if (test !== 1)
        begin
            $display("ASSERTION FAILED in %m");
            $finish;
        end
    end
endmodule

现在,只要你想检查一个信号,你所要做的就是在你的模块中实例化一个断言,如下所示:

module my_cool_module(input clk, ...);

     ...

     assert a0(.clk(clk), .test(some_signal && some_other_signal));

     ...

endmodule

当断言失败时,您将收到如下消息:

ASSERTION FAILED in my_cool_module.a0

display语句中的%m将显示违规断言的整个层次结构,当你在一个较大的项目中有很多这些时,这很方便。

你可能想知道我为什么要检查时钟的边缘。这很微妙,但很重要。如果上面表达式中的some_signal和some_other_signal在不同的always块中分配,则表达式可能在短时间内为false,具体取决于Verilog模拟器调度块的顺序(即使逻辑完全有效)。这会给你一个假阴性。

上面要注意的另一件事是我使用!==,如果测试值是X或Z,这将导致断言失败。如果它使用了正常!=,它可能会默默地给出一些误报例。

答案 1 :(得分:7)

你可以这样写

if(!(out==1'b1)) $finish;

答案 2 :(得分:7)

如果您的模拟器支持SystemVerilog语法,则会有一个assert关键字,可以满足您的需求。

答案 3 :(得分:7)

将上面的内容与宏一起使用对我有用:

`define assert(signal, value) \
        if (signal !== value) begin \
            $display("ASSERTION FAILED in %m: signal != value"); \
            $finish; \
        end

然后在我的测试模块中:

initial begin // assertions
    #32 `assert(q, 16'hF0CB)
end

作为示例测试失败案例:

ASSERTION FAILED in test_shift_register: q != 16'hF0CB

答案 4 :(得分:3)

Verilog不支持断言。有些工具支持PSL,它将断言置于注释中,但这是非标准的。您应该考虑使用来自测试平台的分层引用,否则您必须将每个断言放在一个混乱的过程中。

模仿类似C语句的最简单方法可能是“定义”,因为这会使它们成为全局。

`define assert(condition) if(condition) begin $finish(1); end

为了检查非过程上下文中的信号,例如您的示例,您将需要一个不同的宏来构建条件信号,然后触发该信号的测试事件。

`define assert_always(condition) generate if(1) begin wire test = condition; always @(test) `assert(condition) end endgenerate

上面的生成将为变量测试创建一个新的范围,因此多个实例应该可以工作。

程序中更好的方法可能是在单独的文件中创建一个任务,然后在任何模块声明中包含该任务。

task assert(input condition);
if(!condition)
  $finish(2);
endtask

对于非过程上下文,您需要创建一个包含进程和该模块实例的模块。除非您将其放在生成块中,否则这将需要每个实例的唯一名称。