Ben cohen provided the code for dynamic delays in verification academy forum.
I have just pasted it here...
Link :
https://verificationacademy.com/forums/systemverilog/sva-package-dynamic-and-range-delays-and-repeats
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | // Ben Cohen December 13, 2018 package sva_delay_repeat_range_pkg; // int d1, d2; // bit a, b, c=1'b1; // sequence q_s; a ##1 c; endsequence // sequence my_sequence; e ##1 d[->1]; endsequence //---------------------------------------------------------------- // ****** DYNAMIC DELAY ##d1 ********** // Application: $rose(a) |-> q_dynamic_delay(d1) ##0 my_sequence; sequence q_dynamic_delay(count); int v; (1, v=count) ##0 first_match((1, v=v-1'b1) [*0:$] ##1 v<=0); endsequence //---------------------------------------------------------------- // ****** DYNAMIC DELAY RANGE ##[d1:d2] ********** //##[d1:d2] ##0 b; // NO sequence followng the "b" // $rose(a) |-> q_dynamic_delay_range(d1, d2, b)) // and b[->1] ##1 my_sequence; // $rose(a) ##0 q_dynamic_delay_range(d1, d2, b) |-> my_sequence; sequence q_dynamic_delay_range(int d1, d2, bit b); int v1, vdiff; (1, v1=d1, vdiff=d2-d1) ##0 q_dynamic_delay(v1) ##0 first_match((1, vdiff=vdiff - 1)[*0:$] ##1 (b || vdiff<=0)) ##0 b; endsequence //---------------------------------------------------------------- // ****** DYNAMIC REPEAT q_s[*d1] ********** // Application: $rose(a) |-> q_dynamic_repeat(q_s, d1) ##1 my_sequence; sequence q_dynamic_repeat(q_s, count); int v=count; (1, v=count) ##0 first_match((q_s, v=v-1'b1) [*1:$] ##0 v<=0); endsequence //---------------------------------------------------------------- // ****** DYNAMIC REPEAT RANGE q_s[*d1:d2] ********** // Application: $rose(a) |-> (q_dynamic_repeat_range(q_s, d1, d2, b) // and b[->1] ##1 my_sequence // use the same "b" // $rose(a) ##1 q_dynamic_repeat_range(q_s, d1, d2, b) |-> my_sequence; sequence q_dynamic_repeat_range(sequence q_s, int r1, r2, bit b); int v, diff; (1, v=r1, diff=r2-r1) ##0 q_dynamic_repeat(q_s, v) ##1 // repeat to r1 first_match((q_s, diff=diff-1'b1) [*0:$] ##1 (b || diff<=0 )) ##0 b; endsequence endpackage import uvm_pkg::*; `include "uvm_macros.svh" import sva_delay_repeat_range_pkg::*; module top; timeunit 1ns; timeprecision 100ps; bit clk, a, b, c=1, w; int d1=2, d2=5; sequence q_s; a ##1 c; endsequence sequence my_sequence; a ##1 w[->1]; endsequence default clocking @(posedge clk); endclocking initial forever #10 clk=!clk; // ****** DYNAMIC DELAY ##d1 ********** // Application: $rose(a) |-> q_dynamic_delay(d1) ##0 my_sequence; ap_dyn_delay: assert property(@ (posedge clk) $rose(a) |-> q_dynamic_delay(d1) ##0 my_sequence); ap_fix_delay: assert property(@ (posedge clk) $rose(a) |-> ##2 my_sequence); // ****** DYNAMIC DELAY RANGE ##[d1:d2] ********** //##[d1:d2] ##0 b; // NO sequence followng the "b" // $rose(a) |-> q_dynamic_delay_range(d1, d2, b)) // and b[->1] ##1 my_sequence; // $rose(a) ##0 q_dynamic_delay_range(d1, d2, b) |-> my_sequence; ap_dly_rng: assert property(@ (posedge clk) $rose(a) |-> q_dynamic_delay_range(d1, d2, b) and b[->1] ##1 my_sequence); ap_2to5: assert property(@ (posedge clk) $rose(a) |->(##[2:5] b) and b[->1] ##1 my_sequence); ap_dly_rng_antc: assert property(@ (posedge clk) $rose(a) ##0 q_dynamic_delay_range(d1, d2, b) |-> my_sequence); ap_2to5_antc: assert property(@ (posedge clk) $rose(a) ##0 first_match(##[2:5] b) |-> my_sequence); //------------------------------------------------------------------ // ****** DYNAMIC REPEAT q_s[*d1] ********** // Application: $rose(a) |-> q_dynamic_repeat(q_s, d1) ##1 my_sequence; ap_rpt: assert property(@ (posedge clk) $rose(a)|-> q_dynamic_repeat(q_s, d1) ##1 my_sequence); ap_rpt2: assert property(@ (posedge clk) $rose(a)|-> q_s[*2] ##1 my_sequence); // ****** DYNAMIC REPEAT RANGE q_s[*d1:d2] ********** // Application: $rose(a) |-> (q_dynamic_repeat_range(q_s, d1, d2, b) // and b[->1] ##1 my_sequence // use the same "b" // $rose(a) ##1 (q_dynamic_repeat_range(q_s, d1, d2, b) |-> my_sequence; ap_rpt_rng: assert property(@ (posedge clk) $rose(a) |-> q_dynamic_repeat_range(q_s, d1, d2, b) and b[->1] ##1 my_sequence); ap_rpt_2to5: assert property(@ (posedge clk) $rose(a) |-> first_match(q_s[*2:5] ##1 b) and b[->1] ##1 my_sequence); ap_rpt_rng_antc: assert property(@ (posedge clk) $rose(a) ##1 q_dynamic_repeat_range(q_s, d1, d2, b) |-> my_sequence); ap_rpt_2to5_antc: assert property(@ (posedge clk) $rose(a) ##1 first_match(q_s[*2:5] ##1 b) |-> my_sequence); initial begin repeat(1000) begin @(posedge clk); #2; if (!randomize(a, b, c, w) with { a dist {1'b1:=1, 1'b0:=1}; b dist {1'b1:=1, 1'b0:=1}; c dist {1'b1:=1, 1'b0:=1}; w dist {1'b1:=1, 1'b0:=1}; }) `uvm_error("MYERR", "randomize error"); end #1; repeat(1500) begin @(posedge clk); #2; if (!randomize(a, b, c, w) with { a dist {1'b1:=1, 1'b0:=2}; b dist {1'b1:=3, 1'b0:=2}; c dist {1'b1:=1, 1'b0:=1}; w dist {1'b1:=3, 1'b0:=1}; }) `uvm_error("MYERR", "randomize error"); end $stop; end endmodule |