I am trying to make APB VIP.
However I am stuck at scoreboard-
The idea is to delay the scoreboard start until the monitor has sent all the transactions (5 writes, 5 reads) to Scoreboard.
I tried the Delay method in run phase and it’s working fine but I want something which can be true for every test.
Is there a way to check the last transaction in sequence or monitor and then trigger an event from there to start the scoreboard ?
Thanks,
SR
MONITOR:
task run_phase(uvm_phase phase);
apb_transaction apb_tx_mon;
forever begin
apb_tx_mon = apb_transaction::type_id::create("apb_tx_mon", this);
@(posedge apb_vin.clk)
begin
if (apb_vin.penable)
begin
apb_tx_mon.paddr = apb_vin.paddr;
apb_tx_mon.pwdata = apb_vin.pwdata;
apb_tx_mon.pwrite = apb_vin.pwrite;
if (!apb_vin.pwrite) begin
#1; apb_tx_mon.prdata = apb_vin.prdata;
end
`uvm_info("MONITOR", "CALLING WRITE METHOD", UVM_MEDIUM);
apb_mon_ap.write(apb_tx_mon);
end
end
end
SCOREBOARD:
task run();
#420;
int i;
i= sb_fifo.used();
while(sb_fifo.used() != 0)
begin
`uvm_info("SCOREBOARD", $sformatf("fifo size: %0d ", sb_fifo.used()), UVM_MEDIUM);
sb_fifo.get(apb_tx);
//`uvm_info("SCOREBOARD_PRINT", $sformatf("paddr=%0d, prdata=%0d, pwdata=%0d, pwrite=%0d", apb_tx.paddr, apb_tx.prdata, apb_tx.pwdata, apb_tx.pwrite), UVM_MEDIUM);
if (!apb_tx.pwrite)
begin
`uvm_info("SCOREBOARD", $sformatf("pwrite= %0d", apb_tx.pwrite ), UVM_MEDIUM);
compare(apb_tx);
end
else
write_box.put(apb_tx);
end[.](https://verificationacademy.com)
endtask