Race condition between get_next_item and @clk

Hi, I have met an issue about get_next_item().
Here’s my code of my_driver:


task run_phase(uvm_phase phase);
    quiesce_bus();
    do begin
      @(vif.txclk);
    end while (vif.rstn !== 1'b1);

    forever begin
      `uvm_info(get_name(), $sformatf("inside forever:%t",$time), UVM_NONE)
      fork
        detect_reset();
        request_thread();
      join_any
      disable fork;
    end
  endtask

  task request_thread();
    bit can_go=0;

    T req;
    `uvm_info(get_name(), $sformatf("inside request_thread:%1t",$time), UVM_NONE)
    @vif.txclk;
    `uvm_info(get_name(), $sformatf("0: after clk time:%1t",$time), UVM_NONE)
    forever begin
      seq_item_port.get_next_item(req);

      `uvm_info(get_name(), $sformatf("before clk time:%1t",$time), UVM_NONE) // !!!!!! confusing here
      @vif.txclk;
      `uvm_info(get_name(), $sformatf("3: after clk time:%1t",$time), UVM_NONE) // !!!!!
      quiesce_bus();

      seq_item_port.item_done();
    end
  endtask

When I run one specific testcase, I got the confusing output log:

// below just the log after first transaction is sent.
UVM_NONE /…/my_driver.sv(63) @ 553.00ns: my_driver [my_driver] # before clk time:553.00ns
UVM_NONE /…/my_driver.sv(65) @ 553.00ns: my_driver [my_driver] # 3: after clk time:553.00ns

This confusing issue just happen after the first transaction was sent, and it will be normal then. So I guess maybe the issue about get_next_item.
Can anyone explain this?

In reply to zhiyuanwang:

Any differences in how rstn behaves between the two tests?

In reply to dave_59:

have no difference.
The rst_n will be de-asserted at 0ns, and go high at 100ns.
Reset only once in one testcase.