In reply to bmorris:
The only benefit I can see to the virtual sequencer approach is that you can save some code:
virt_seq.init(.bus_seqr(m_env.m_agent1.m_sequencer),
.gpio_seqr(m_env.m_agent2.m_sequencer));
virt_seq.start(null);
// versus
virt_seq.start(virtual_sequencer);
If you only start a virtual sequence in the base test, then it’s not a big deal, since you can always do factory overrides after that and get a different virtual sequence instantiated. If you start virtual sequences within virtual sequences, then you’ll always have to pass the bus sequencer handles to each sub-sequence. If you have to pass 4, 5, 6, etc. sequencers, this is going to get really old, really fast.