Understand the Difference between UVM_SEQ_ARB_FIFO and UVM_SEQ_ARB_STRICT_FIFO

I am trying to understand the difference between UVM_SEQ_ARB_FIFO and UVM_SEQ_ARB_STRICT_FIFO.

My understanding is:

  • UVM_SEQ_ARB_FIFO grants requests in the order they arrive and ignores sequence priority.
  • UVM_SEQ_ARB_STRICT_FIFO first 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?