Monitor scoreboard Error

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.