Systemverilog 断言信号在仿真期间至少出现 1 次为真
Systemverilog assertion a signal is true at least 1 occurence during the simulation
我在尝试编写此断言时遇到了问题。我试图断言信号 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
模拟到最后似乎断言还没有结束。
我在google查了一下,有一个类似的问题:
Assertion to check for the toggle (0->1) of a signal
我也试过用strong()
操作,也没用。
如何解决这个问题?
不幸的是,您的解决方案取决于您使用的模拟器。我尝试了四个,每个都有不同的行为。
我认为你的解决方案是这样的:
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
我在尝试编写此断言时遇到了问题。我试图断言信号 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
模拟到最后似乎断言还没有结束。
我在google查了一下,有一个类似的问题: Assertion to check for the toggle (0->1) of a signal
我也试过用strong()
操作,也没用。
如何解决这个问题?
不幸的是,您的解决方案取决于您使用的模拟器。我尝试了四个,每个都有不同的行为。
我认为你的解决方案是这样的:
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