-
Notifications
You must be signed in to change notification settings - Fork 0
/
monitor.sv
112 lines (97 loc) · 3.51 KB
/
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
class apb_monitor extends uvm_monitor;
`uvm_component_utils(apb_monitor)
uvm_analysis_port #(apb_sequence_item) tx_port;
apb_sequence_item base_pkt;
virtual apb_interface intf;
function new(string name = "apb_monitor", uvm_component parent=null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
base_pkt=apb_sequence_item::type_id::create("base_pkt");
tx_port = new("tx_port",this);
if (! (uvm_config_db #(virtual apb_interface)::get(this,"*","intf", intf)))
`uvm_error(get_type_name(), "Could not get interface");
endfunction
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
endfunction
virtual task run_phase(uvm_phase phase);
super.run_phase(phase);
forever begin
@(posedge intf.pclk)
if(intf.psel && intf.penable ) begin
base_pkt.PADDR <= intf.paddr;
base_pkt.PWRITE <= intf.pwrite;
base_pkt.PSEL <= intf.psel;
base_pkt.PWDATA <= intf.pwdata;
base_pkt.PENABLE <= intf.penable;
base_pkt.PRDATA <= intf.prdata;
base_pkt.PREADY <= intf.pready;
base_pkt.PSLVERR <= intf.pslverr;
if(enable_check)
begin
fork
valid_paddr();
valid_pwrite();
valid_pwdata();
valid_penable();
valid_prdata();
psel_atmost_one();
valid_address();
pslverr_asserted();
join
end
tx_port.write(base_pkt);
end
end
endtask
virtual function void valid_paddr();
if($isunknown(intf.paddr))
`uvm_error("ERROR","UNVALID VALUE OF PADDR")
else
`uvm_info(get_type_name(),"VALID VALUE OF PADDR",UVM_HIGH)
endfunction
virtual function void valid_pwrite();
if($isunknown(intf.pwrite))
`uvm_error("ERROR","UNVALID VALUE OF PWRITE")
else
`uvm_info(get_type_name(),"VALID VALUE OF PWRITE",UVM_HIGH)
endfunction
virtual function void valid_pwdata();
if(intf.paddr>MEM_SIZE)
`uvm_error("ERROR","PWDATA IS NOT WRITTEN")
else
`uvm_info(get_type_name(),"VALID VALUE OF PWDATA",UVM_HIGH)
endfunction
virtual function void valid_penable();
if($isunknown(intf.penable))
`uvm_error("ERROR","UNVALID VALUE OF Penable")
else
`uvm_info(get_type_name(),"VALID VALUE OF PENABLE",UVM_HIGH)
endfunction
virtual function void valid_prdata();
if(intf.paddr>MEM_SIZE)
`uvm_error("ERROR","UNVALID VALUE OF PRDATA")
else
`uvm_info(get_type_name(),"VALID VALUE OF PRDATA",UVM_HIGH)
endfunction
virtual function void pslverr_asserted();
if(intf.pslverr)
`uvm_error("ERROR","NO READING or WRITING AS PSLVERR HIGH")
else
`uvm_info(get_type_name(),"NO PSLVERR",UVM_HIGH)
endfunction
virtual function void psel_atmost_one();
if($onehot0(intf.psel))
`uvm_info(get_type_name(),"AT MOST ONE SLAVE IS ACTIVE",UVM_HIGH)
else
`uvm_error("ERROR","MORE THAN ONE SLAVE IS ACTIVE")
endfunction
virtual function void valid_address();
if(intf.paddr<MEM_SIZE)
`uvm_info("VALID ADDRESS","ADDRESS IS IN RANGE",UVM_HIGH)
else
`uvm_error("ERROR","OUT OF RANGE ADDRESS")
endfunction
endclass