SVA中关于采样事件的一些事儿
在SystemVerilog中任何语句的执行都是按照一定的事件顺序处理进行的,断言的处理也是这样的。图中sig1和sig2的采样值来自于prepone区,即来自于上一个时间槽最后确定的sig1和sig2的值。属性中表达式的析构计算发生在时间槽的Observed区,断言后将根据成功还是失败决定执行ap中的成功部分还是失败部分。
并行断言是基于采样事件的,那么就会有一个问题,在SVA三段式的描述中,clocking_event(posedge clk)应该放在assert property、property和sequence中的哪一部分呢?下面我们将通过示例来了解一下。
【示例】
`timescale 1 ns / 1 ps
module top_tb;
logic clk;
logic sig0,sig1,sig2;
initial begin
clk = 1'b0;
forever #1 clk = ~clk;
end
initial begin
sig0 = 1'b0;sig1 = 1'b0;sig2 = 1'b0;
#2 sig0 = 1'b1;
#2 sig0 = 1'b0;sig1 = 1'b1;
#2 sig2 = 1'b1;sig1 = 1'b0;
#4 $stop;
end
// sequence s1
sequence s1;
@(posedge clk) sig1 ##1 sig2;
endsequence // s1
// sequence s2
sequence s2;
sig1 ##1 sig2;
endsequence // s2
// property
property p1;
@(posedge clk) sig0 |->##1 s1;
endproperty // p1
property p2;
@(posedge clk) sig0 |-> ##1 s2;
endproperty // p2
property p3;
sig0 |->##1 s1;
endproperty // p3
property p4;
sig0 |->##1 s2;
endproperty // p4
a1 : assert property(@(posedge clk)p1) $display("@%0t | p1 : PASSED!",$time);
else $display("@%0t | p1 : FAILED!",$time);
a2 : assert property(@(posedge clk)p2) $display("@%0t | p2 : PASSED!",$time);
else $display("@%0t | p2 : FAILED!",$time);
a3 : assert property(@(posedge clk)p3) $display("@%0t | p3 : PASSED!",$time);
else $display("@%0t | p3 : FAILED!",$time);
a4 : assert property(@(posedge clk)p4) $display("@%0t | p4 : PASSED!",$time);
else $display("@%0t | p4 : FAILED!",$time);
a5 : assert property(p1) $display("@%0t | p5 : PASSED!",$time);
else $display("@%0t | p5 : FAILED!",$time);
a6 : assert property(p2) $display("@%0t | p6 : PASSED!",$time);
else $display("@%0t | p6 : FAILED!",$time);
// illegal // a7 : assert property(p3) $display("@%0t | p7 : PASSED!",$time);
// else $display("@%0t | p7 : FAILED!",$time);
// illegal // a8 : assert property(p4) $display("@%0t | p8 : PASSED!",$time);
// else $display("@%0t | p8 : FAILED!",$time);
// illegal // a9 : assert property(sig0 |->##1 s1) $display("@%0t | p9 : PASSED!",$time);
// else $display("@%0t | p9 : FAILED!",$time);
a10 : assert property(@(posedge clk) sig0 |->##1 s1) $display("@%0t | p10 : PASSED!",$time);
else $display("@%0t | p10 : FAILED!",$time);
a11 : assert property(s1) $display("@%0t | p11 : PASSED!",$time);
else $display("@%0t | p11 : FAILED!",$time);
// illegal // a12 : assert property(sig0 |->##1 s2) $display("@%0t | p12 : PASSED!",$time);
// else $display("@%0t | p12 : FAILED!",$time);
a13 : assert property(@(posedge clk)sig0 |->##1 s2) $display("@%0t | p13 : PASSED!",$time);
else $display("@%0t | p13 : FAILED!",$time);
endmodule // top_tb 【仿真结果】