Snippet of codes :
////////my_monitor.sv/////////
uvm_analysis_port #(int) m_ap;
…
task write_drv();
@(posedge vif.cb.push)
mon_ap.write_drv(vif.cb.data_in);
endtask
task write_rcv();
@(posedge vif.sb.pull)
mon_ap.write_rcv(vif.cb.data_out);
endtask
//////////my_scoreboard.sv///////
uvm_analysis_imp_decl( _drv )
uvm_analysis_imp_decl( _rcv )
uvm_analysis_imp #(int, my_scoreboard) sb_ap_drv;
uvm_analysis_imp #(int, my_scoreboard) sb_ap_rcv;
uvm_tlm_fifo #(int) expfifo;
uvm_tlm_fifo #(int) outputfifo;
function void write_drv(int data_in);
expfifo.try_put(data_in);
endfunction
function void write_rcv(int data_out);
outputfifo.try_put(data_out);
endfunction
///////my_en.sv///////
my_agent.my_mon.m_ap.connect(scoreboard.sb_ap_drv);
my_agent.my_mon.m_ap.connect(scoreboard.sb_ap_rcv);
Getting error Fatal Error: Unresolved hierarchical reference to “m_ap.write_rcv./0/” from module “my_monitor” (module not found).
In reply to ak_verifsj:
Looks like you did not construct the analysis port. Did you?
In reply to ak_verifsj:
I don’t think your implementation is correct.
There is no write_drv/write_rcv method located in uvm_analysis_port #(int) m_ap.
Maybe you wanted to created two diffrent analysis ports for drv and rcv. Each analysis port will be connected to diffrent imp port. You can refer the following code:
////////my_monitor.sv/////////
uvm_analysis_port #(int) m_ap_drv;
uvm_analysis_port #(int) m_ap_rcv;
.....
task write_drv();
@(posedge vif.cb.push)
m_ap_drv.write(vif.cb.data_in);
endtask
task write_rcv();
@(posedge vif.sb.pull)
m_ap_rcv.write(vif.cb.data_out);
endtask
//////////my_scoreboard.sv///////
`uvm_analysis_imp_decl( _drv )
`uvm_analysis_imp_decl( _rcv )
uvm_analysis_imp_drv #(int, my_scoreboard) sb_ap_drv;
uvm_analysis_imp_rcv #(int, my_scoreboard) sb_ap_rcv;
uvm_tlm_fifo #(int) expfifo;
uvm_tlm_fifo #(int) outputfifo;
function void write_drv(int data_in);
expfifo.try_put(data_in);
endfunction
function void write_rcv(int data_out);
outputfifo.try_put(data_out);
endfunction
///////my_en.sv///////
my_agent.my_mon.m_ap_drv.connect(scoreboard.sb_ap_drv);
my_agent.my_mon.m_ap_rcv.connect(scoreboard.sb_ap_rcv);
Also, dont forget to construct the ports.
In reply to cuonghle:
Thanks that helps.
Is it recommended to have a two separate monitors (input & output) active/passive agents? Or the method that you mentioned of having two analysis port in one monitor is fine too?
In reply to ak_verifsj:
An agent contains a sequencer/driver pair, oen monitor and eventually a configuration object and maybe a coverage collector. There is no need to have for 1 functional interface an additional monitor. This compliactes your topology and makes behavior more complicated.
See the code above.