Professional Documents
Culture Documents
`uvm_component_utils(ahb_slave_driver)
//---------------------NEW()--------------------------//
super.new(name, parent);
endfunction: new
endclass: ahb_slave_driver
//---------------------BUILD()--------------------------//
super.build_phase(phase);
mbx = new();
endfunction: build_phase
//---------------------RUN()--------------------------//
super.run_phase(phase);
vif.cb_slave.HREADY <= 0;
drive_address();
endtask: run_phase
//---------------------DRIVE ADDRESS()--------------------------//
task ahb_slave_driver::drive_address();
forever begin
repeat(req.delay_request) @(vif.cb_slave);
vif.cb_slave.HREADY <= 1;
req.HWRITE = vif.cb_slave.HWRITE;
req.HTRANS = vif.cb_slave.HTRANS;
fork
drive_data();
join_none
end
mbx.put(req);
@(vif.cb_slave);
vif.cb_slave.HREADY <= 0;
@(vif.cb_slave);
vif.cb_slave.HREADY <= 0;
end
seq_item_port.item_done(req);
end
endtask: drive_address
//---------------------DRIVE DATA()--------------------------//
task ahb_slave_driver::drive_data();
ahb_item item;
item = ahb_item::type_id::create("item");
mbx.get(item);
@(vif.cb_slave);
endtask: drive_data
`uvm_analysis_imp_decl(_hrdata)
`uvm_component_utils(ahb_slave_driver)
//---------------------NEW()--------------------------//
super.new(name, parent);
endfunction: new
extern virtual task run_phase(uvm_phase phase);
endclass: ahb_slave_driver
//---------------------BUILD()--------------------------//
super.build_phase(phase);
mbx = new();
endfunction: build_phase
//---------------------RUN()--------------------------//
super.run_phase(phase);
vif.cb_slave.HREADY <= 0;
vif.cb_slave.HRESP <= 0;
drive_address();
endtask: run_phase
//---------------------DRIVE ADDRESS()--------------------------//
task ahb_slave_driver::drive_address();
forever begin
vif.cb_slave.HREADY <= 1;
req.HWRITE = vif.cb_slave.HWRITE;
req.HTRANS = vif.cb_slave.HTRANS;
fork
drive_data();
join_none
end
mbx.put(req);
@(vif.cb_slave);
vif.cb_slave.HREADY <= 0;
@(vif.cb_slave);
vif.cb_slave.HREADY <= 0;
end
seq_item_port.item_done();
end
endtask: drive_address
//---------------------DRIVE DATA()--------------------------//
task ahb_slave_driver::drive_data();
ahb_item item;
item = ahb_item::type_id::create("item");
mbx.get(item);
if(!req.HWRITE) begin
if(q.size() > 0)
else
`uvm_fatal(get_type_name(), "Not enough item in the list for HRDATA")
end
@(vif.cb_slave);
endtask: drive_data
//---------------------WRITE()--------------------------//
q.push_back(HRDATA);
endfunction: write_hrdata
`uvm_object_utils(slave_ahb_sequences)
`uvm_declare_p_sequencer(ahb_sequencer)
super.new(name);
endfunction: new
req = ahb_item::type_id::create("req_slave");
repeat(num_seq) begin
start_item(req);
end
endtask: body
endclass: slave_ahb_sequences
`uvm_object_utils(slave_ahb_sequences)
`uvm_declare_p_sequencer(ahb_sequencer)
bit keep_hrdata = 1;
super.new(name);
endfunction: new
req = ahb_item::type_id::create("req_slave");
repeat(num_seq) begin
start_item(req);
finish_item(req);
get_response(rsp);
end
endtask: body
endclass: slave_ahb_sequences
//*****************MONITOR **************************//
uvm_analysis_port#(ahb_item) mon_scb_port;
`uvm_component_utils(ahb_monitor)
//---------------------NEW()--------------------------//
super.new(name, parent);
endfunction: new
//---------------------EXTERN FUNCTION()--------------------------//
endclass: ahb_monitor
//---------------------BUILD()--------------------------//
super.build_phase(phase);
mbx = new();
endfunction: build_phase
//---------------------RUN()--------------------------//
super.run_phase(phase);
fork
take_address();
take_data();
join
endtask: run_phase
//---------------------TAKE DATA()--------------------------//
task ahb_monitor::take_data();
ahb_item item_m;
forever begin
end
endtask: take_data
//---------------------TAKE ADDRESS()--------------------------//
task ahb_monitor::take_address();
ahb_item item;
forever begin
item = ahb_item::type_id::create("item");
item.HSIZE = vif.cb_monitor.HSIZE;
item.HADDR = vif.cb_monitor.HADDR;
item.HWRITE = vif.cb_monitor.HWRITE;
item.HBURST = vif.cb_monitor.HBURST;
item.HTRANS = vif.cb_monitor.HTRANS;
item.HMASTER = vif.cb_monitor.HMASTER;
end
endtask: take_address
//********************AGENT *****************//
ahb_sequencer ahb_sequencer_h;
ahb_master_driver driver_master;
ahb_slave_driver driver_slave;
ahb_monitor monitor;
ahb_agent_config cfg;
`uvm_component_utils(ahb_agent)
//---------------------NEW()--------------------------//
super.new(name, parent);
endfunction: new
endclass: ahb_agent
//---------------------BUILD()--------------------------//
super.build_phase(phase);
endfunction: build_phase
//---------------------CONNECT_PHASE()--------------------------//
super.connect_phase(phase);
driver_master.seq_item_port.connect(ahb_sequencer_h.seq_item_export);
driver_slave.seq_item_port.connect(ahb_sequencer_h.seq_item_export);
endfunction: connect_phase