You should definitely check out the Cookbook and the Advanced UVM video for more information on layered sequences. As to your specific questions:
- How to Connect multiple sequencers in one lower sequence which is connected with Driver??
i.e. I am having Sqr1(higher), Sqr2(higher), SeqL(Lower). SqrL is lower one which is running lower sequence, it is connected with Lower Driver which is communicating with DUT pin wiggles. I want to connect Sqr1 and Sqr2 into the Sqr3.
As I understand it, you have two upstream sequencers, each of which presumably is running one (or more) sequence(s). If SqrL (the sequencer) is connected to your driver, then you need to have two translator sequences running on SqrL, each to communicate with one of the upstream sequencers. Each of these translator sequences will get a transaction from the upstream sequencer and convert it into a “lower_transaction” which is the type that the Lower Driver is expecting. The type of the upstream transactions can be different, as long as each translator sequence is paramterized appropriately.
- How to connect one higher level sequencer into multiple lower level sequences?
i.e. I am having one higher sequencer (SqrH), it is connected with two lower level Sequences (seqL1 and seqL2). When i start the higher sequence, these data should be get by any one of the lower sequences depend on my higher sequence logic. But the problem is i couldn’t get the higher layer packets in any of the lower sequencers.
The important thing to remember about sequence layering is that each layer needs to look like it is communicating with a driver at the lower level. So, when you have
// Higher Sequence
class high_sequence extends uvm_sequence#(high_packet);
....
high_packet h_pkt;
task body();
h_pkt.Low_seq1_en = 1;
endtask
endclass
there is no way for the high_sequence to pass a high_packet sequence_item to anybody, since you’ve neglected the start_item()/finish_item() calls.
The other problem you have is that the lower-level sequences are each trying to call get() on the high_sequencer, and the handshakes will get confused. You could implement a semaphore/mutex in high_sequence and have each lower-level translator sequence get the semaphore before calling get, but that makes the translator sequences less reusable.
Please explain why you think you need two lower-level sequences to communicate to a single high_sequence. Are these two lower-level sequences running on the same lower-level sequencer or are they running on different sequencers?