always @(posedge req) begin
reg_csr[addr] = wr_data;
if (addr == 3)begin
if((reg_csr[3]/2) % 2 ==0)begin
p1_dur = reg_csr[3]/4;
p2_dur = reg_csr[3]/4;
p3_dur = reg_csr[3]/4;
p4_dur = reg_csr[3]/4;
end else begin
p1_dur = reg_csr[3] /4;
p2_dur = reg_csr[3] /4 + 1;
p3_dur = reg_csr[3] /4;
p4_dur = reg_csr[3] /4 + 1;
end
end
end
//---------------------------FAILING CODE---------------------------
property sen_cvd_p4_checker;
time rise_t;
@(posedge clk) $rose(sen_cvd_p4) ##0 (1, rise_t = $time) |->
##[1:$] $fell(sen_cvd_p4) ##0 f_px_dly_chk(rise_t,$time,"p4");
endproperty
assert property (sen_cvd_p4_checker)
else $error("sen_cvd_p4 assertion failed!");
function automatic bit f_px_dly_chk(time s_time, c_time, string s);
case(s)
"p1" : begin
if(c_time - s_time == 10*p1_dur)begin
return 1;
end
else begin
$error("%s assertion error!",s);
return 0;
end
end
"p2" : begin
if(c_time - s_time == 10*p2_dur)begin
return 1;
end
else begin
$error("%s assertion error!",s);
return 0;
end
end
"p3" : begin
if(c_time - s_time == 10*p3_dur)begin
return 1;
end
else begin
$error("%s assertion error!",s);
return 0;
end
end
"p4" : begin
if(c_time - s_time == 10*p4_dur)begin
return 1;
end
else begin
$error("%s assertion error!",s);
$display(p4_dur, c_time, s_time, c_time - s_time);
return 0;
end
end
endcase
endfunction: f_px_dly_chk
** Error: p4 assertion error!
# Time: 11155 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 11155 11115 40
# ** Error: p4 assertion error!
# Time: 11525 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 11525 11115 410
# ** Error: p4 assertion error!
# Time: 11625 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 11625 11115 510
# ** Error: p4 assertion error!
# Time: 11725 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 11725 11115 610
# ** Error: p4 assertion error!
# Time: 11825 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 11825 11115 710
# ** Error: p4 assertion error!
# Time: 11925 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 11925 11115 810
# ** Error: p4 assertion error!
# Time: 12025 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 12025 11115 910
# ** Error: p4 assertion error!
# Time: 12125 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 12125 11115 1010
# ** Error: p4 assertion error!
# Time: 12225 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 12225 11115 1110
# ** Error: p4 assertion error!
# Time: 12325 ns Scope: tb_top.i_assertion.f_px_dly_chk File: ../sv/assertion.sv Line: 208
# 3 12325 11115 1210
see the rise_time time is stuck at 11155
//---------------------------THIS WORKS FINE---------------------------
property sen_cvd_p4_checker;
time rise_t;
@(posedge clk) $rose(sen_cvd_p4) ##0 (1, rise_t = $time) |->
first_match(##[1:$] $fell(sen_cvd_p4)) ##0 ($time - rise_t == 10*p4_dur);
endproperty
assert property (sen_cvd_p4_checker)
else $error("sen_cvd_p4 assertion failed!");
How first match makes a difference especially here? The first one should work right? However my confusion is that putting 1 in the property is why my code was failing?
SVA sequence re-triggers on multiple $fell events – rise_t not updating