`ifndef MY_ENV__SV
`define MY_ENV__SV
class my_env extends uvm_env;
my_agent i_agt;
my_agent o_agt;
my_model mdl;
my_scoreboard scb;
uvm_tlm_analysis_fifo #(my_transaction) agt_scb_fifo;//
uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;//
uvm_tlm_analysis_fifo #(my_transaction) mdl_scb_fifo;//
function new(string name = "my_env", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
i_agt = my_agent::type_id::create("i_agt", this);
o_agt = my_agent::type_id::create("o_agt", this);
i_agt.is_active = UVM_ACTIVE;//
o_agt.is_active = UVM_PASSIVE;//
mdl = my_model::type_id::create("mdl", this);
scb = my_scoreboard::type_id::create("scb", this);
agt_scb_fifo = new("agt_scb_fifo", this);
agt_mdl_fifo = new("agt_mdl_fifo", this);
mdl_scb_fifo = new("mdl_scb_fifo", this);
endfunction
extern virtual function void connect_phase(uvm_phase phase);
`uvm_component_utils(my_env)
endclass
function void my_env::connect_phase(uvm_phase phase);
super.connect_phase(phase);
i_agt.ap.connect(agt_mdl_fifo.analysis_export);
//uvm_analysis_port #(my_transaction) ap;
mdl.port.connect(agt_mdl_fifo.blocking_get_export);
//uvm_blocking_get_port #(my_transaction) port;
o_agt.ap.connect(agt_scb_fifo.analysis_export);
//uvm_analysis_port #(my_transaction) ap;
scb.act_port.connect(agt_scb_fifo.blocking_get_export);
//uvm_blocking_get_port #(my_transaction) act_port;
mdl.ap.connect(mdl_scb_fifo.analysis_export);
//uvm_analysis_port #(my_transaction) ap;
scb.exp_port.connect(mdl_scb_fifo.blocking_get_export);
//uvm_blocking_get_port #(my_transaction) exp_port
endfunction
`endif
ifndef MY_AGENT__SV
`define MY_AGENT__SV
class my_agent extends uvm_agent ;
my_sequencer sqr;
my_driver drv;
my_monitor mon;
uvm_analysis_port #(my_transaction) ap;//////
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
extern virtual function void build_phase(uvm_phase phase);
extern virtual function void connect_phase(uvm_phase phase);
`uvm_component_utils(my_agent)
endclass
function void my_agent::build_phase(uvm_phase phase);
super.build_phase(phase);
if (is_active == UVM_ACTIVE) begin
sqr = my_sequencer::type_id::create("sqr", this);
drv = my_driver::type_id::create("drv", this);
end
mon = my_monitor::type_id::create("mon", this);
endfunction
function void my_agent::connect_phase(uvm_phase phase);
super.connect_phase(phase);
if (is_active == UVM_ACTIVE) begin
drv.seq_item_port.connect(sqr.seq_item_export);
end
ap = mon.ap;//////
endfunction
`endif