Skip to main content

Sequence Layering in UVM

What is Sequence Layering?

Sequence layering is refered to as running sequences inside sequences. 
So whats the big deal. There are virtual sequences we will use to run multiple sequences. A generic example of sequence layering.
you have two sequences 
  1. Interrupt sequence
  2. register read write sequence.
Generally when you have interrupt, we generally enter into interrupt service routine, which can be implemented as an interrupt sequence. So when you run an interrupt sequence, you might end up running register read /write sequence like polling or clearing interrupts.
Well thats easy, just run one sequence in another.

class top_seq extends uvm_sequence#(txn_item);
  //Two sequencers say.. sub sequences.
  sub_seq1   seq1;
  sub_seq2  seq2;

  ...
  task body();
    seq1.start(some_seqr);
    seq2.start(some_seqr2);


  endtask
endclass

Killing sequences:

That was great you are running nested sequences. But how to kill them when needed.
UVM provides method called seq.kill() to kill the sequences.
Does this kill the sequences started off by a sequence?
when you call top_seq.kill().. does it kill the sub sequences when above code is considered? No. because sequences dont have any hierarchical notion. So we have to mention what is the parent sequence while starting a sub sequence..
When starting a sequence with in another sequence, pass the current sequencer(this) as argument to the start task.

class top_seq extends uvm_sequence#(txn_item);
  //Two sequencers say.. sub sequences.
  sub_seq1   seq1;
  sub_seq2  seq2;

  ...
  task body();
    seq1.start(some_seqr, this);
    seq2.start(some_seqr2, this);


  endtask
endclass

Here if you see we are passing this as argument to seq.start. This will register the child sequences in the top_seq.
By this when you call top_seq.kill(). this will check for child sequences which are started with this top sequence as parent and kill those sequences.





Comments

Post a Comment

Popular posts from this blog

Verdi Uses - I

COVERAGE While going through some of the blog posts, i found that the Verdi supports even coverage right out of the box, but from the 2014 Version. Well till now, we relied on the URG reports and the DVE to review the coverage and apply waivers and create exclusion files. Looks verdi supports all the features.. I did not get any hands on the features of this option, soon i will find some time to play around with this option of coverage in Verdi. How to launch the verdi with coverage. $> verdi -cov -covdir <PATH_TO_TB>.simv.vdb -covdir <PATH_TO_TEST1>.simv.vdb -covdir <PATH_TO_TEST2>.simv.vdb...  You can pass multiple covdirs, where in all the results will be merged. References: SYNOPSYS SITE Think Verification  

Virtual Sequence and Virtual Sequencer in UVM

Virtual sequences and sequencers in UVM are just virtual containers of multiple sequences and sequencers. Using virtual sequencers and sequences can be done in these three ways: Using only virtual Sequence and handles of sequencers inside the virtual sequence. Using Virtual sequencer to hold the sequencers Same as step 2, by using uvm_declare_p_sequencer. Virtual Sequencer does not create any sequencer objects, rather it points to other physical sequencers in different agents.  Virtual Sequencer extends from uvm_sequencer. Virtual sequence will create its sequences and start them. Running sequences can be controlled by user in the body() task. virtual sequence extends from uvm_sequence. METHOD-1: In this method, we will have one base virtual sequence which will hold the handles to different sequencers. Here we dont use any virtual sequencer. We just use the nested seqeunces with handles ot sequencers inside sequence itself. //This is the base virtual se...