Vengineerの妄想(準備期間)

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

OVM : ovm_driverクラス

Verification Engineerの戯言

OVM 1.0/1.0.1版

ovm_driverクラスは次のように定義されています。
src/methodology/ovm_driver.sv[h]
    virtual class ovm_driver extends ovm_threaded_component;

      // sequence item producer interface
      ovm_seq_item_prod_if seq_item_prod_if;

      // Constructor
      extern function new (string name, ovm_component parent);

    endclass
ovm_driverクラスは、ovm_threaded_componentクラスを継承します。
メンバーにovm_seq_item_prod_ifクラスのseq_item_prod_ifを持つだけです。
ovm_seq_item_prod_ifクラスもovm_driver.sv[h]ファイルで定義されています。
    class ovm_seq_item_prod_if extends ovm_component;

      ovm_sequencer seqr_ref;

      一部、省略
      extern function void connect_if(ovm_seq_item_cons_if seqr_if);

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

    endclass
connect_if関数は、[ Sequencerの例題(1)]のtestモジュールで出てきました。
        driver.seq_item_prod_if.connect_if(sequencer.seq_item_cons_if);
このコードがDriverとSequencerを接続する部分で、次のようになっています。
    function void ovm_seq_item_prod_if::connect_if(ovm_seq_item_cons_if seqr_if);
      $cast(seqr_ref, seqr_if.parent_as_seqr);
      seqr_if.consumer = m_parent;
    endfunction
seqr_refインスタンスが引数seqr_ifのインスタンスparent_as_seqrにキャストされます。
この部分がDriverとSequencerを接続しているところです。

get_next_itemタスクは、seqr_ref.get_next_item(item)を実行しているだけです。
つまり、Sequencerのget_next_itemタスクを呼んでいるのです。
    task ovm_seq_item_prod_if::get_next_item(output ovm_sequence_item item);
      ovm_sequence_item base_item;
      seqr_ref.get_next_item(item);
    endtask
item_done関数は、seqr_ref.item_done_triggerを実行しているだけです。
つまり、Sequencerのitem_done_trigger関数を呼んでいるのです。
    function void ovm_seq_item_prod_if::item_done( ovm_sequence_item item=null);
      seqr_ref.item_done_trigger(item);
    endfunction

次回は、Sequencerのovm_sequencerクラスを見ていきます。

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