I am trying to understand the difference between UVM_SEQ_ARB_FIFO and UVM_SEQ_ARB_STRICT_FIFO.
My understanding is:
UVM_SEQ_ARB_FIFOgrants requests in the order they arrive and ignores sequence priority.UVM_SEQ_ARB_STRICT_FIFOfirst considers priority and then uses FIFO ordering among sequences that have the same priority.
To verify this, I created three sequence with different priorities:
task run_phase(uvm_phase phase);
phase.raise_objection(this);
seqa = seqA::type_id::create("seqa");
seqb = seqB::type_id::create("seqb");
seqc = seqC::type_id::create("seqc");
envo.agt.seqr.set_arbitration(UVM_SEQ_ARB_STRICT_FIFO);
seqa.set_priority(200);
seqb.set_priority(300);
seqc.set_priority(300);
fork
seqa.start(envo.agt.seqr);
seqb.start(envo.agt.seqr);
seqc.start(envo.agt.seqr);
join
phase.drop_objection(this);
endtask
Each sequence repeatedly does:
repeat (5) begin
#2;
wait_for_grant();
`uvm_info(get_type_name(), "Grant received", UVM_HIGH)
assert(req.randomize());
send_request(req);
wait_for_item_done();
end
The driver simply performs:
forever begin
seq_item_port.get_next_item(req);
#5;
seq_item_port.item_done(req);
end
I expected seqB and seqC (priority 300) to be serviced before seqA (priority 200) when using UVM_SEQ_ARB_STRICT_FIFO.
However, the grant order appears similar to UVM_SEQ_ARB_FIFO, and I do not see the lower-priority sequence being deferred.
Here is the result for both cases:
Am I misunderstanding how UVM_SEQ_ARB_STRICT_FIFO works? Is there something about my test setup that prevents priority-based arbitration from becoming visible?
