forked from naragece/uvm-testbench-tutorial-simple-adder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
simpleadder_monitor.sv
137 lines (106 loc) · 3.09 KB
/
simpleadder_monitor.sv
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
133
134
135
136
137
class simpleadder_monitor_before extends uvm_monitor;
`uvm_component_utils(simpleadder_monitor_before)
uvm_analysis_port#(simpleadder_transaction) mon_ap_before;
virtual simpleadder_if vif;
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction: new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
void'(uvm_resource_db#(virtual simpleadder_if)::read_by_name
(.scope("ifs"), .name("simpleadder_if"), .val(vif)));
mon_ap_before = new(.name("mon_ap_before"), .parent(this));
endfunction: build_phase
task run_phase(uvm_phase phase);
integer counter_mon = 0, state = 0;
simpleadder_transaction sa_tx;
sa_tx = simpleadder_transaction::type_id::create
(.name("sa_tx"), .contxt(get_full_name()));
forever begin
@(posedge vif.sig_clock)
begin
if(vif.sig_en_o==1'b1)
begin
state = 3;
end
if(state==3)
begin
sa_tx.out = sa_tx.out << 1;
sa_tx.out[0] = vif.sig_out;
counter_mon = counter_mon + 1;
if(counter_mon==3)
begin
state = 0;
counter_mon = 0;
//Send the transaction to the analysis port
mon_ap_before.write(sa_tx);
end
end
end
end
endtask: run_phase
endclass: simpleadder_monitor_before
class simpleadder_monitor_after extends uvm_monitor;
`uvm_component_utils(simpleadder_monitor_after)
uvm_analysis_port#(simpleadder_transaction) mon_ap_after;
virtual simpleadder_if vif;
simpleadder_transaction sa_tx;
//For coverage
simpleadder_transaction sa_tx_cg;
//Define coverpoints
covergroup simpleadder_cg;
ina_cp: coverpoint sa_tx_cg.ina;
inb_cp: coverpoint sa_tx_cg.inb;
cross ina_cp, inb_cp;
endgroup: simpleadder_cg
function new(string name, uvm_component parent);
super.new(name, parent);
simpleadder_cg = new;
endfunction: new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
void'(uvm_resource_db#(virtual simpleadder_if)::read_by_name
(.scope("ifs"), .name("simpleadder_if"), .val(vif)));
mon_ap_after= new(.name("mon_ap_after"), .parent(this));
endfunction: build_phase
task run_phase(uvm_phase phase);
integer counter_mon = 0, state = 0;
sa_tx = simpleadder_transaction::type_id::create
(.name("sa_tx"), .contxt(get_full_name()));
forever begin
@(posedge vif.sig_clock)
begin
if(vif.sig_en_i==1'b1)
begin
state = 1;
sa_tx.ina = 2'b00;
sa_tx.inb = 2'b00;
sa_tx.out = 3'b000;
end
if(state==1)
begin
sa_tx.ina = sa_tx.ina << 1;
sa_tx.inb = sa_tx.inb << 1;
sa_tx.ina[0] = vif.sig_ina;
sa_tx.inb[0] = vif.sig_inb;
counter_mon = counter_mon + 1;
if(counter_mon==2)
begin
state = 0;
counter_mon = 0;
//Predict the result
predictor();
sa_tx_cg = sa_tx;
//Coverage
simpleadder_cg.sample();
//Send the transaction to the analysis port
mon_ap_after.write(sa_tx);
end
end
end
end
endtask: run_phase
virtual function void predictor();
sa_tx.out = sa_tx.ina + sa_tx.inb;
endfunction: predictor
endclass: simpleadder_monitor_after