/
mem_driver.sv
39 lines (33 loc) · 1.14 KB
/
mem_driver.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
class mem_driver extends uvm_driver #(mem_seq_item);
protected virtual mem_if vif;
`uvm_component_utils(mem_driver)
function new (string name, uvm_component parent);
super.new(name, parent);
endfunction : new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
if ( !uvm_config_db#(virtual mem_if)::get(this, "", "vif", vif) ) begin
`uvm_fatal("NO_VIF", {"virtual interface must be set for: ", get_full_name(), ".vif"});
end
endfunction : build_phase
virtual task run_phase(uvm_phase phase);
mem_seq_item req;
mem_seq_item rsp;
forever begin
if ( vif.reset ) begin
vif.en <= 1'b0;
end
else begin
seq_item_port.get(req);
vif.en <= req.en;
vif.we <= req.we;
vif.addr <= req.addr;
vif.wdata <= req.wdata;
rsp = new();
rsp.set_id_info(req);
seq_item_port.put(rsp);
end
@(posedge vif.clk);
end
endtask : run_phase
endclass