SVA中内嵌了边沿检测的函数,用户可以通过这些函数检查信号在采样时钟的前后的高低变化情况。常用的边沿检测函数有$rose和$fell。
1 $rose
在仿真中$rose并不是单纯的判断信号的跳边沿,而是判断时钟采样信号前后是否存在0->1/x->1/z->1的变化。其格式如下:
$rose(expression);
需要注意这里的$rose不是上升沿!
【示例】
timescale 1 ns / 1 ps
module top_tb;
logic clk;
logic [2:0] sig0;
logic sig1;
initial begin
clk = 1'b0;
forever #1 clk = ~clk;
end
initial begin
sig0 = 3'b000; sig1 = 1'b0;
#2 sig0 = 3'b001;
#2 sig1 = 1'b1; sig0 = 3'b000;
#2 sig1 = 1'b0;#2 sig0 = 3'b100;
#2 sig1 = 1'b1;#2 sig1 = 1'b0;
#4 $stop;
end
// property p
property p;
@(posedge clk) $rose(sig0) |-> ##1 sig1;
endproperty // p
// assertion
a : assert property(p) $display("@%0t | p : PASSED!",$time);
else $display("@%0t | p : FAILED!",$time);
endmodule // top_tb
【仿真结果】
示例中3ns时,sig[0]被采样到高电平,先序算子在此刻成功,注意先序算子并没有在2ns时触发。这是因为在该采样时钟之前的上一个采样时钟沿采样到的sig0[0]为低电平,3ns时当前采样时钟采样到sig[0]为高电平,$rose感知到sig[0]在前后2个采样时钟周期存在低高变化,即该函数此时返回为真,所以在仿真中$rose并不