Verification Engineerの戯言
OVM 1.0/1.0.1版
ovm_driverクラスは次のように定義されています。
src/methodology/ovm_driver.sv[h]
メンバーにovm_seq_item_prod_ifクラスのseq_item_prod_ifを持つだけです。
ovm_seq_item_prod_ifクラスもovm_driver.sv[h]ファイルで定義されています。
この部分がDriverとSequencerを接続しているところです。
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); endclassovm_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); endclassconnect_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; endfunctionseqr_refインスタンスが引数seqr_ifのインスタンスparent_as_seqrにキャストされます。
この部分がDriverとSequencerを接続しているところです。
get_next_itemタスクは、seqr_ref.get_next_item(item)を実行しているだけです。
つまり、Sequencerのget_next_itemタスクを呼んでいるのです。
つまり、Sequencerのitem_done_trigger関数を呼んでいるのです。
つまり、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); endtaskitem_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