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.