'uvm_do execution order in the body method

Hi,
When there are multiple uvm_do in the body method of the seq one after another enclosed in begin end block. Then second uvm_do should start getting executed only
after the entire completion of first uvm_do , right? But i am seeing that there is interleaved execution of both uvm_do.
Please clarify this.

In reply to Shipra_s:

PLease show your body method. Then it is possible to give you an reasonable explanation.

In reply to chr_sue:

Code is really huge.
I can show the structure

task body();
fork
begin
uvm_rand_send_with(seq1,...) uvm_rand_send_with(seq2,…)
end
join_none
//Other code
endtask

In reply to Shipra_s:

You are running your 2 `uvm_* macros in a fork/join. This is the reason you get interleaved seq_items.
Are you have special reasons to run a fork/join_none instead of a simple fork/join?.

In reply to chr_sue:
2 `uvm* macros are running in begin end block and not directly in fork join.
So it should be one after another as it is in begin end.
Other begin end blocks inside fork join will run parallely with this begin end.

fork join_none is needed
1)Bcoz there are other operations also that is happening
parallely with this running seq, which is kept inside
different begin end blocks inside fork join_none. Like this

fork
begin

end
begin

end
begin

end
join_none

2)To take care of timeout feature.There is wait statement after fork join_none
block , so it will wait for that time and after that
task will be completed even if sequence is still running.
(Correct me if i am wrong for 2nd reason)

In reply to Shipra_s:

You are right. But they deliver interleaved seq_items because each macro is generating exactly 1 item. The only difference is you have a determined order starting with seq1.

In reply to chr_sue:

Thanks i understood it very well.

In reply to chr_sue:

In reply to Shipra_s:
You are right. But they deliver interleaved seq_items because each macro is generating exactly 1 item. The only difference is you have a determined order starting with seq1.

I am trying to make sense of this , can you elaborate?

In reply to sohan_b:

If you are running two sequences in parallel using fork/join you get interleaved seq_items. Which sequence is picked first is not defined. In your case seq1 is staring first followed by seq2.
fork/join_none spawns dynamic processes. If you have code after the fork/join_none this will be executed at the same time the parallel processes have been started. The fork/joins continues with the code after this construct when bot parallel processes have been finished.