Task body of sequence doesn't finish though it should

I have the following run_phase in my test

   task run_phase(uvm_phase phase);
      tx_lin_int_big_sm_diff_sequence tx_seq_i;
      axi_config_reg_sequence axi_seq_i;      
      axi_rd_from_file_sequence axi_seq_4_dds_i;
      phase.raise_objection(.obj(this));
      for (int i = 2; i <= 9; i++) begin
	 tx_seq_i = tx_lin_int_big_sm_diff_sequence::type_id::create(.name("tx_seq_i"), .contxt(get_full_name()));
	 axi_seq_i = axi_config_reg_sequence::type_id::create(.name("axi_seq_i"), .contxt(get_full_name()));
	 axi_seq_4_dds_i = axi_rd_from_file_sequence::type_id::create(.name("axi_seq_4_dds_i"), .contxt(get_full_name()));	 
	 axi_seq_i.transfers[0] = i;
	 axi_seq_i.addr = `TX_FE_LIN_INT_ADDR;
	 fork
	    begin
	       tx_seq_i.start(grb_env_i.tx_lin_int_agent_i.tx_lin_int_sequencer);   
	    end
	    begin
	       axi_seq_i.start(grb_env_i.axi_agent_i.axi_sequencer);
	    end
	    begin
	       axi_seq_4_dds_i.start(grb_env_i.axi_agent_i.axi_sequencer);	       
	    end
	 join
      end
      phase.drop_objection(.obj(this));
      super.run_phase(phase);
   endtask // run_phase

Where axi_config_reg_sequence axi_rd_from_file_sequence responsinle for config some regs.

The task body inside tx_lin_int_big_sm_diff_sequence is:

   task body(); 
      tx_lin_int_transaction tx_lin_int_trx;
      
      if(!uvm_config_db #(tx_lin_int_agent_config)::get(m_sequencer, "", "db_tx_lin_int_agent_config", m_cfg)) begin
	 `uvm_error("task_body", "tx_lin_int_agent_config not found")
      end//if            

      //xi- big difference, xq - small difference 
      for (int i = 0; i <= 100; i++) begin //TODO - Change the num    repitition 
	 tx_lin_int_trx = tx_lin_int_transaction::type_id::create(.name("tx_lin_int_trx"), .contxt(get_full_name()));
	 // ~start_item~ and <finish_item> together will initiate operation of
	 // a sequence item.	 	 
	 start_item(tx_lin_int_trx);
	 tx_lin_int_trx.data_xi_min_c = m_cfg.data_xi_min_c;
	 tx_lin_int_trx.data_xi_max_c = m_cfg.data_xi_min_c;
	 tx_lin_int_trx.data_xq_min_c = m_cfg.data_xq_min_c;
	 tx_lin_int_trx.data_xq_max_c = m_cfg.data_xq_max_c;  
	 tx_lin_int_trx.my_randomize(i+1);
	 m_cfg.data_xi_min_c = -tx_lin_int_trx.data_xi_min_c + $pow(-1,i+1);
	 m_cfg.data_xi_max_c = m_cfg.data_xi_min_c;
	 $display("tx_lin_int_trx.data_xi_min_c: %d", tx_lin_int_trx.data_xi_min_c);
	 $display("m_cfg.data_xi_min_c: %d", m_cfg.data_xi_min_c);
	 $display("-1 power %d", $pow(-1,i+1));
         m_cfg.data_xq_min_c = m_cfg.data_xq_max_c + 1;
	 m_cfg.data_xq_max_c = m_cfg.data_xq_min_c ;	 	    	 	    
	 finish_item(tx_lin_int_trx);
      end                        
   endtask: body

The expected behave is that when i>100 the task of the sequence sould be finished, and the index of the loop inside the run_phase of the test should increase by 1.
But for sime reason I can see that the index of the loop inside the run_phase of the test increase by 1 only after some thousands ~20000000ps (too much time).

In reply to saritr:

Two basic things regarding your code:
(1) Never use $display in your UVM code. Instead use `uvm_info
(2) In the run task of your sequencer you are starting on the same sequencer v2 different seuqnces in parallel. The behavior is uncertain.

In reply to saritr:

As you already know, the test loop won’t iterate until all three sequences complete. If things are not completing in a timely manner, one or more of those sequences is to blame.

I’d start by looking at the shared sequencer.
Since both axi_seq_i and axi_seq_4_dds_i are running on the same sequencer, the sequencer will apply the UVM_SEQ_ARB_FIFO arbitration, and pull transaction items interchangeably from each sequence. If you specifically need the tx_lin_int_big_sm_diff_sequence to send all 100 transactions, have the sequence call the ‘lock’ method (of m_sequencer), and unlock when sequence is complete.

In reply to bmorris:

As the other 2 AXI sequences should finish to complete the “fork” thread, it should be the reason for long simulation time.

If you don’t need the AXI sequence running after the TX lint sequence was completed, put them under “fork” “join_any” and kill the AXI thread once after the TX lint sequence was completed.

Thanks,
Shan