//AHB_AGENT
class ahb_agent extends uvm_agent;
//factory registration
`uvm_component_utils (ahb_agent)
//handles for driver, monitor, sequencer
ahb_driver ahb_drv;
ahb_monitor ahb_mon;
ahb_sequencer ahb_seqr;
ahb_agent_config ahb_cfg;
extern function new (string name = "ahb_agent", uvm_component parent);
extern function void build_phase (uvm_phase phase);
extern function void connect_phase (uvm_phase phase);
extern task run_phase (uvm_phase phase);
endclass: ahb_agent
//----------Constructor-----------//
function ahb_agent::new (string name = "ahb_agent", uvm_component parent);
super.new (name, parent);
endfunction: new
//-------------Build Phase--------------//
function void ahb_agent::build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db #(ahb_agent_config)::get(this, "", "ahb_agent_config", ahb_cfg))
`uvm_fatal ("CONFIG", "Cannot get() m_cfg from uvm_config_db. Have you set() it?")
ahb_mon = ahb_monitor::type_id::create("ahb_mon", this);
if(ahb_cfg.is_active == UVM_ACTIVE)
begin
ahb_drv = ahb_driver::type_id::create("ahb_drv", this);
ahb_seqr = ahb_sequencer::type_id::create("ahb_seqr", this);
end
endfunction
////------connect_phase-------///////
function void ahb_agent::connect_phase(uvm_phase phase);
super.connect_phase(phase);
if(ahb_cfg.is_active == UVM_ACTIVE)
begin
ahb_drv.seq_item_port.connect(ahb_seqr.seq_item_export);
end
endfunction
task ahb_agent::run_phase(uvm_phase phase);
uvm_top.print_topology;
endtask