我在尝试编写这个断言时遇到了一个问题。我试图在信号B
为真之后断言信号A
必须至少为1的情况。
我写的断言如下:
example : assert property(
@(posedge clk) disable iff(reset)
A |-> ##[0:$] B[->1]) else `uvm_error(....)
问题是,如果在B
为真之后模拟信号A
期间永远不为真,则不执行uvm_error
。我预计它会被执行,模拟会报告消息:
example: started at xxxxxxps not finished
即使模拟到达终点,似乎断言也没有完成。
我在谷歌中查了一下,有一个类似的问题: Assertion to check for the toggle (0->1) of a signal
我也试过使用strong()
操作,它也没有帮助。
如何解决这个问题?
答案 0 :(得分:1)
不幸的是,您的解决方案取决于您使用的模拟器。我尝试了四个,每个都有不同的行为。
我认为你的解决方案是:
example3 : assert property(
@(posedge clk) disable iff(reset)
A |-> s_eventually B)
else
$error("%t - Assertion example3 failed", $time);
基于它在两个模拟器上工作以及我对SVA的理解。在一个模拟器上,操作块中的$error
语句实际上已被执行,消息" Assertion example3 failed
"被展示;在另一个中显示一般错误消息。
s_
代表" strong"。断言意味着B
必须在模拟结束之前的某个时间发生。
这是MCVE。如果你包含这样的东西,你的问题会更容易回答。
module M;
bit stop; bit clk; initial while (!stop) #5 clk = ~clk;
bit A, B;
initial begin
#20 A = 1;
#10 A = 0;
// #10 B = 1;
#10 B = 0;
#50 stop = 1;
end
example1 : assert property(
@(posedge clk)
A |-> B[->1])
else
$error("%t - Assertion example1 failed", $time);
example2 : assert property(
@(posedge clk)
A |-> eventually [0:7] B)
else
$error("%t - Assertion example2 failed", $time);
example3 : assert property(
@(posedge clk)
A |-> s_eventually B)
else
$error("%t - Assertion example3 failed", $time);
final
$display("Finished!");
endmodule