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
|