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
可以将上面代码中的某些sequence或者property单独拿出来使用。