How multiple grabs to the sequencer are handled

In one of my UVM environment, I have 2 sequences, one interrupt service sequence and another normal packet sequence.

Here is the sequence of events:

At 0ns, pkt sequence started without grab. Driver takes 15ns to complete the transaction.
At 10ns, interrupt triggered. interrupt sequence has wait for interrupt event, followed by grab()
At 15ns, after the normal pkt finishes another pkt is initiated with grab()
At 16ns, another interrupt triggered.

In this scenrio I expected following sequence:
1 - pkt 1 finishes at 15ns
2 - first interrupt sequence starts at 15ns and finishes at 30ns
3- Now at 30ns, we have 2 pkts both with grab statments, normal pkt seqeunce with pkt 2 usign grab and interrupt sequence with second interrupt with grab()
4 – Since pkt 2 is initiated with grab first, it takes over and finishes. But I see that second interrupt is finishing first.

Here is the code:
import uvm_pkg::*;
`include “uvm_macros.svh”

interface intr_intf();
logic intr;
endinterface

class pkt extends uvm_sequence_item;
`uvm_object_utils(pkt)

function new(string name=“pkt”);
super.new(name);
endfunction
endclass : pkt

class intr_service_seq extends uvm_sequence;
`uvm_object_utils(intr_service_seq)

uvm_event intr_ev = uvm_event_pool::get_global(“intr_ev”);

function new(string name=“intr_service_seq”);
super.new(name);
endfunction

task body();
pkt m_pkt;
forever begin
intr_ev.wait_on();
intr_ev.reset();
grab();
m_pkt = pkt::type_id::create(“m_pkt”);
start_item(m_pkt);
uvm_info(get_name(),"Servicing interrupt",UVM_LOW) finish_item(m_pkt); uvm_info(get_name(),“Serviced interrupt”,UVM_LOW)
ungrab();
end
endtask
endclass

class pkt_sequencer extends uvm_sequencer#(pkt);
`uvm_component_utils(pkt_sequencer)

intr_service_seq m_intr_seq;
uvm_event intr_ev = uvm_event_pool::get_global(“intr_ev”);
virtual intr_intf vif;

function new(string name, uvm_component parent);
super.new(name,parent);
endfunction

function void build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db#(virtual intr_intf)::get(this,“”,“vif”,vif))
`uvm_fatal(“NO_INTF”, “CAN NOT GET THE INTF : INTR_INTF”)
endfunction

task run_phase(uvm_phase phase);
m_intr_seq = intr_service_seq::type_id::create(“m_intr_seq”);
fork
m_intr_seq.start(this);
join_none
forever begin
@(posedge vif.intr);
intr_ev.trigger;
`uvm_info(get_name(),“Interrupt triggered”,UVM_LOW)
end
endtask
endclass

class driver extends uvm_driver#(pkt);
uvm_component_utils(driver) function new(string name, uvm_component parent); super.new(name,parent); endfunction task run_phase(uvm_phase phase); pkt m_pkt; super.run_phase(phase); forever begin seq_item_port.get_next_item(m_pkt); uvm_info(“DRV”,$sformatf(“Drive Pkt”),UVM_LOW)
#15;
seq_item_port.item_done();
end
endtask
endclass : driver

class seq1 extends uvm_sequence#(pkt);
`uvm_object_utils(seq1)

int unsigned seq_num;

function new(string name=“seq1”);
super.new(name);
endfunction

task body();
pkt m_pkt;
uvm_info(get_name(),"Started Body",UVM_LOW) for(int i=0;i<10;i++) begin m_pkt = pkt::type_id::create("m_pkt"); if(i==1) grab(); start_item(m_pkt); uvm_info(get_name(),$sformatf(“After Start Item pkt_num:%0d”,i),UVM_LOW)
m_pkt.randomize();
finish_item(m_pkt);
uvm_info(get_name(),"After Finish Item ",UVM_LOW) if(i==1) ungrab(); end uvm_info(get_name(),“Ended Body”,UVM_LOW)
endtask
endclass: seq1

class test extends uvm_test;

`uvm_component_utils(test)

pkt_sequencer seqr1;
driver drvr;

seq1 m_seq1;

function new(string name, uvm_component parent);
super.new(name,parent);
endfunction

function void build_phase(uvm_phase phase);
super.build_phase(phase);
seqr1 = pkt_sequencer::type_id::create(“seqr1”,this);
drvr = driver::type_id::create(“drvr”,this);
m_seq1 = seq1::type_id::create(“m_seq1”);
endfunction

function void connect_phase(uvm_phase phase);
drvr.seq_item_port.connect(seqr1.seq_item_export);
endfunction

task run_phase(uvm_phase phase);
super.run_phase(phase);
phase.phase_done.set_drain_time(this,100ns);
phase.raise_objection(this);
m_seq1.start(seqr1);
phase.drop_objection(this);
endtask
endclass : test

module tb_top;
import uvm_pkg::*;
`include “uvm_macros.svh”

intr_intf intr_if();

initial begin
uvm_config_db#(virtual intr_intf)::set(uvm_root::get(),“*”,“vif”,intr_if);
end
initial begin
run_test();
end

initial begin
intr_if.intr = 0;
#10ns;
intr_if.intr = 1;
#5ns;
intr_if.intr = 0;
#1ns;
intr_if.intr = 1;
#2ns;
intr_if.intr = 0;
end
endmodule

Here is the output:
UVM_INFO @ 0: reporter [RNTST] Running test test…
UVM_INFO test_interrupt.sv(100) @ 0: uvm_test_top.seqr1@@m_seq1 [m_seq1] Started Body
UVM_INFO test_interrupt.sv(106) @ 0: uvm_test_top.seqr1@@m_seq1 [m_seq1] After Start Item pkt_num:0
UVM_INFO test_interrupt.sv(81) @ 0: uvm_test_top.drvr [DRV] Drive Pkt
UVM_INFO test_interrupt.sv(66) @ 10: uvm_test_top.seqr1 [seqr1] Interrupt triggered
UVM_INFO test_interrupt.sv(109) @ 15: uvm_test_top.seqr1@@m_seq1 [m_seq1] After Finish Item
UVM_INFO test_interrupt.sv(33) @ 15: uvm_test_top.seqr1@@m_intr_seq [m_intr_seq] Servicing interrupt
UVM_INFO test_interrupt.sv(81) @ 15: uvm_test_top.drvr [DRV] Drive Pkt
UVM_INFO test_interrupt.sv(66) @ 16: uvm_test_top.seqr1 [seqr1] Interrupt triggered
UVM_INFO test_interrupt.sv(35) @ 30: uvm_test_top.seqr1@@m_intr_seq [m_intr_seq] Serviced interrupt
UVM_INFO test_interrupt.sv(33) @ 30: uvm_test_top.seqr1@@m_intr_seq [m_intr_seq] Servicing interrupt
UVM_INFO test_interrupt.sv(81) @ 30: uvm_test_top.drvr [DRV] Drive Pkt
UVM_INFO test_interrupt.sv(35) @ 45: uvm_test_top.seqr1@@m_intr_seq [m_intr_seq] Serviced interrupt
UVM_INFO test_interrupt.sv(106) @ 45: uvm_test_top.seqr1@@m_seq1 [m_seq1] After Start Item pkt_num:1
UVM_INFO test_interrupt.sv(81) @ 45: uvm_test_top.drvr [DRV] Drive Pkt
UVM_INFO test_interrupt.sv(109) @ 60: uvm_test_top.seqr1@@m_seq1 [m_seq1] After Finish Item

With this result, it looks like grab always puts the request at the beginning of queue. Even though there are other grabs present in the queue, latest grab will always be pushed to the front of the queue and the latest grab gets executed first-- such as last in first out.

Can anyone clarify if this understanding/behaviour is correct. Thank you very much in advance.