Who call start() task in uvm_sequence?

Hi all ,
i would like to know who call start() task in uvm_sequence
who execute sequences’s start() task in which phase?
Can anyone explain me more detail ?
Thanks a lot!!!

In reply to peter:

Generally you call the start() method in the run_phase of your test. You can use other time-consuming phases, the sequence doesn’t care or even aware (this may have changed in the lasted version of the UVM, but only for advanced usage). See this link for more details.

Simply, the start() method just pushes a handle to the sequence into the queue of a sequencer. The sequencer pulls a sequence out of the queue to “execute” by calling the body() method of the sequence.

additionally, if you specify a particular sequence as default_sequence ( using config_db ) for a sequencer and for a specific phase, that sequencer will take care of calling start method.
This is done in

 uvm_sequencer_base::start_phase_sequence

for more info you can look at : uvm_sequencer_base.svh

Do you mean that sequencer will call start() method of the sequence ?
i just wonder in which phase the sequencer will call start() method .

there is a sentence in this link ((Sequences/Generation | Verification Academy):
When a sequence is created and then executed using sequence.start(), the sequences body method is executed

I am confused that the who execute sequence.start()? sequence or sequencer?
I did not write sequence.start() in my testbench, i just write some code in body() task, but simulation works. I know that body() task will be executed after executing the start() . So , i just wonder why the sequence.start() method is executed even i did not write sequence.start() in my testbench.
Can anyone explain to me?
Thanks!!!

In reply to peter:

The sequencer calls the sequence.body() method, which you wrote. You call the sequence.start() method from your test, or another sequence body. The start() method is defined in the sequence base class.

As sohan_b mentioned, it’s also possible to set up a “default” sequence for sequencer to call default_sequence.start(). But we don’t recommend doing it that way as, like you, many people get confused about that hidden behavior.

In reply to dave_59:

In reply to peter:
The sequencer calls the sequence.body() method, which you wrote. You call the sequence.start() method from your test, or another sequence body. The start() method is defined in the sequence base class.
As sohan_b mentioned, it’s also possible to set up a “default” sequence for sequencer to call default_sequence.start(). But we don’t recommend doing it that way as, like you, many people get confused about that hidden behavior.

Thanks for reply!
i did not write sequence.start() in my test
do you mean that sequencer will call sequence.start() automatically?

In reply to peter:

do you mean that sequencer will call sequence.start() automatically?

As sohan_b mentioned, it’s also possible to set up a “default” sequence for sequencer to call default_sequence.start(). But we don’t recommend doing it that way as, like you, many people get confused about that hidden behavior.

The default means it’s called automatically.

In reply to dave_59:

Thanks a lot!,I got the point.
One more question, calling sequence.start() in run_phase in uvm_test is a recommend method ?
how about if i call sequence.start() in run_phase in other class(ex:driver class)?
Thanks

In reply to peter:
Calling sequence.start() in run_phase in your test is the recommend method, as well as calling start from the body() method of another sequence. You can call sequence.start() from any other task as long as you have a good and well documented reason for doing so.