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
| //filename: channel_connection.sv
`ifndef TEST_ATOMIC_GEN_SV_
`define TEST_ATOMIC_GEN_SV_
`include "vmm.sv"
class packet extends vmm_data;
rand bit [31:0] vari;
rand bit [31:0] vari2;
extern function new();
extern virtual function string psdisplay (string prefix = "");
extern virtual function vmm_data allocate ();
extern virtual function vmm_data copy (vmm_data to = null);
extern virtual function void copy_data (vmm_data to = null);
extern virtual function bit compare (vmm_data to,
output string diff,
input int kind = -1);
extern function void post_randomize();
endclass : packet
`vmm_channel(packet)
`vmm_atomic_gen(packet,"atomic_gen")
function packet::new();
super.new();
endfunction
function string packet::psdisplay(string prefix);
$write( psdisplay, "[%s] vari = 32'h%h; vari2 = 32'h%h\n",prefix, vari, vari2 );
endfunction
function vmm_data packet::allocate();
packet i = new();
allocate = i;
endfunction
function vmm_data packet::copy(vmm_data to);
packet cpy;
if (to == null)
cpy = new();
else
if (!$cast(cpy,to)) begin
copy = null;
return copy;
end
copy_data(cpy);
copy = cpy;
endfunction
function void packet::copy_data(vmm_data to);
packet cpy;
super.copy_data(to);
if (!$cast(cpy, to)) begin
return;
end
endfunction
function bit packet::compare (vmm_data to,
output string diff,
input int kind);
string str;
compare = 1;
return compare;
endfunction
function void packet::post_randomize();
super.post_randomize();
endfunction
program test_atomic_gen;
packet_atomic_gen pkt_gen = new("atomic_gen", "test");
packet pkt;
initial
begin
pkt = new();
pkt_gen.stop_after_n_insts = 4;
pkt_gen.randomized_obj.vari.rand_mode(1); //vari to be randomized everytime
pkt_gen.randomized_obj.vari2 = 32'h1234_5678;
pkt_gen.randomized_obj.vari2.rand_mode(0);//turn-off vari2 randomization with a configured value.
$display( "time: %t", $time );
#100;
pkt_gen.start_xactor();
end
initial
begin
#200;
forever
begin
$display( "time: %t", $time );
pkt_gen.out_chan.get(pkt);
pkt.psdisplay();
end
end
endprogram:test_atomic_gen
`endif //TEST_ATOMIC_GEN_SV_ |