Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

OVM : ovm_sequencerクラス

Verification Engineerの戯言

ovm_sequencerクラスは、src/methodology/sequences/ovm_sequence.sv[h]で定義されています。
    class ovm_sequencer extends ovm_sequencer_base;
        ovm_seq_item_cons_if seq_item_cons_if;

        // 一部、省略
        protected bit pull_mode = 1;               
        protected ovm_sequence m_action_q[$];
        protected ovm_event m_action_e[$];

        ovm_event      item_done;     
        ovm_event      item_ready;    

        protected ovm_sequence_item m_last_queue[$];
        protected int unsigned num_last_items = 1;

        extern protected function bit process_queue(output int index);
        extern virtual task wait_for_sequences ();

        extern task get_next_item (output ovm_sequence_item item);
        extern function void item_done_trigger(ovm_sequence_item item=null);

    endclass: ovm_sequencer
get_next_itemタスクでは、キューに格納されているSequenceを1つ引き出します。
    task ovm_sequencer::get_next_item(output ovm_sequence_item item);

      int index;
      while (!process_queue(index)) begin // select action
        m_wait_for_activate();
      end
      item_ready.wait_trigger(); // wait for pre_do, rand, mid_do to complete
      m_action_q.delete(index);
      m_action_e.delete(index);
      $cast(item, item_ready.get_trigger_data());
 
   endtask
item_done_trigger関数では、item_doneイベントにトリガを与えているだけです。
    function void ovm_sequencer::item_done_trigger(ovm_sequence_item 
                                                   item=null);
      item_done.trigger(item);
    endfunction

では、どのタイミングでSequenceをSequencerに与えているのでしょうか?
次回は、ovm_sequencerクラスの親クラスであるovm_sequencer_baseクラスを見ていきます。

検証、Verification、SystemVerilog、OVM、Open Verification Methodology