Vengineerの戯言

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

item_doneを実行すると?

Verification Engineerの戯言

OVM 1.1版

Sequenceの例題で、ovm_driverクラスを継承するsimple_driverクラスをみました。
simple_driverクラスrunタスクseq_item_prod_ifget_next_itemタスクでアイテムを獲得し、
item_done関数で終了を通知しています。
get_next_itemタスクitem_done関数は、src/methodology/ovm_driver.svで次のように定義しています。
    task ovm_seq_item_prod_if::get_next_item(output ovm_sequence_item item);
      seqr_ref.get_next_item(item);
    endtask

    function void ovm_seq_item_prod_if::item_done( ovm_sequence_item item=null);
      seqr_ref.item_done_trigger(item);
    endfunction

ここまでは、ovm_driverクラスでもみてみました。

seqr_refget_next_itemitem_done_triggerを呼んでいます。
このseqr_refovm_sequencerクラスインスタンスです。
間接的にシーケンサーからアイテムを獲得し、アイテムを返しているのです。

それでは、シーケンサーの'item_done_trigger関数はどうなっているのでしょうか?
    function void ovm_sequencer::item_done_trigger(ovm_sequence_item item=null);
      item_done.trigger(item);
    endfunction
item_doneイベントにトリガーを送っているだけです!
トリガーを発行する側があれば、トリガー待ちのタスクがあるはずです。

item_done_wait_trigger_dataタスクitem_doneイベントのイベント待ちをしています。
    task ovm_sequencer::item_done_wait_trigger_data(output ovm_sequence_item item);
      ovm_object m_object;
      item_done.wait_trigger_data(m_object);
      if (m_object != null) begin
        if(!$cast(item, m_object)) 
          ovm_report_fatal("ILLCST", $psprintf("cast failure on %0s %0s", 
                                     m_object.get_name(), m_object.get_type_name()));
      end
  endtask

item_doneイベントwait_trigger_dataタスクがイベント待ちの部分です。
イベントが発生すると、m_objectitem_done.trigger(item)で指定したitemが設定されます。

そうすると、item_done_wait_trigger_dataタスクを実行している場所は?
1つ目は、ovm_sequenceクラスm_post_syncタスクです。
    task ovm_sequence::m_post_sync(ovm_sequence_item item);
      b_sequencer.m_last_push_front(item);
      b_sequencer.m_item_ready_trigger(item);
      b_sequencer.item_done_wait_trigger_data(item);
    endtask
実は、このm_post_syncタスクは、ovm_doマクロovm_sequence::finish_itemタスク内で呼ばれています。
m_post_syncタスクovm_doマクロの引数がovm_sequence_itemクラスの時に呼び出されます。
ドライバ側でitem_done関数が引数有りで呼び出されると、その値がm_post_syncタスクの引数type_varに設定されることになるのです。
(item_done関数に引数を設定しない場合、デフォルトでは引数無しでは、引数type_varは変更されることはありません)


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