In scoreboard if we use two uvm_tlm_analysis_fifo and uvm_analysis_export and connect those export with analysis_fifo's analysis_export in connect phase . In that case do we need to write two explicit write method for that?

In scoreboard if we use two uvm_tlm_analysis_fifo and uvm_analysis_export and connect those export with analysis_fifo’s analysis_export in connect phase . In that case do we need to write two explicit write method for that? ??? Or we need not to write any write method explicitly??

In reply to Subhra Bera:

No, you do not need to implement a
write()
method, the uvm_tlm_analysis_fifo implements it for you. A handle to that implentation is what gets exported by the analysis_fifo’s analysis_export.

In reply to dave_59:

Hi *,

I have a short question about more complex synchronization items that a scoreboard should handle in order to compute the Golden (reference) model:
For e.g. I have a SCBD (extended from uvm_scoreboard) with 3 analysis imports that have to deal with “custom” transaction types, like:

uvm_analysis_imp_block1 #(block1_txn, my_block1_scbd) bl1_export;
uvm_analysis_imp_block2 #(block2_txn, my_block2_scbd) bl2_export;
uvm_analysis_imp_block3 #(block3_txn, my_block1_scbd) bl3_export;

And, all these 3 different items are written in their monitor (threfore, I have 3 different monitors) such that, the items arrive in SCBD in an asynchronous mode and randomly… Let’s say that I can heve this flux: block2_txn, block2_txn, block1_txn, block2_txn, block3_txn,block1_txn, block2_txn, …

Now, suppose that my scbd (named “my_block1_scbd”) has to predict something like this:
ref_model_eq = block1_txn.A + 2*block2_txn.Operand - block3_txn.x;

My question is: how to synchronize all three items in order to not miss one of them and to have all that I need for the ref. equation “ref_model_eq”?
Currentlly, I’m trying (in a run() task of SCBD) a fork - join_none with 3 threads for each collected item (each thread has a forever loop!)… I know that it is not recommended to use FORKs in a SCBD, right?

Thank you!!

In reply to Aly:
I haven’t heard about that recommendation. I’ve seen fork used many times.

If you need a complete set of transaction from the three monitors, you use a fork/join that blocks until you receive one transaction from each monitor through an analysis_fifo

begin : scbd_loop
    fork
       afifo_1.get(block1_txn);
       afifo_2.get(block2_txn);
       afifo_3.get(block3_txn);
    join
    ref_model_eq = block1_txn.A + 2*block2_txn.Operand - block3_txn.x;
end

If you just need the ref_model_eq updated each time a monitor sends a transaction, you can have each write() method update the ref_model_eq using results from previous transactions from the different monitors.

I can think of other scenarios, but in any case, you need to be clear on when an update to ref_model_eq is required.