In reply to Alex_Verif:
The issue here is that from the ref_clk, you drive a clk_enable from a FF, thus with some sort of hold time. Then, this clk_enble is gated with ref_clk to get a gated_clk, adding another gate delay. Thus, everything is not run from a single clock. The best approach is to use tasks, as described in my paper at: SVA Alternative for Complex Assertions https://verificationacademy.com/news/verification-horizons-march-2018-issue
The test code is at http://systemverilog.us/vf/gated_clk2.sv
Key portions of the code:
bit ref_clk, GatedCLK, clk_ENable;
initial forever #10ref_clk=!ref_clk;
let HOLD_TIME=2ns;
always @ (*) begin
if(clk_ENable) #1 GatedCLK=ref_clk;
else #1 GatedCLK=1'b0;
end
task automatic check_gated_hi();
while (clk_ENable) begin
#HOLD_TIME;
a_REF_HI: assert (GatedCLK == ref_clk);
@(negedge ref_clk);
#HOLD_TIME;
a_REF_LOW: assert (GatedCLK == ref_clk);
end
endtask
task automatic check_gated_lo();
while (clk_ENable) begin
#HOLD_TIME;
a_REF_HI0: assert (GatedCLK == 1'b0);
@(negedge ref_clk);
#HOLD_TIME;
a_REF_LOW0: assert (GatedCLK == 1'b0);
end
endtask
ap_clk_enb_HI: assert property(@ (posedge ref_clk)
$rose(clk_ENable) |-> (1, check_gated_hi()) );
ap_clk_enb_LO: assert property(@ (posedge ref_clk)
$fell(clk_ENable) |-> (1, check_gated_lo()) );