Verification Engineerの戯言
OVM 1.1版
Sequenceの例題で、ovm_driverクラスを継承するsimple_driverクラスをみました。
simple_driverクラスのrunタスクでseq_item_prod_ifのget_next_itemタスクでアイテムを獲得し、
item_done関数で終了を通知しています。
get_next_itemタスクとitem_done関数は、src/methodology/ovm_driver.svで次のように定義しています。
simple_driverクラスのrunタスクでseq_item_prod_ifのget_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_refのget_next_item、item_done_triggerを呼んでいます。
このseqr_refはovm_sequencerクラスのインスタンスです。
間接的にシーケンサーからアイテムを獲得し、アイテムを返しているのです。
このseqr_refはovm_sequencerクラスのインスタンスです。
間接的にシーケンサーからアイテムを獲得し、アイテムを返しているのです。
それでは、シーケンサーの'item_done_trigger関数はどうなっているのでしょうか?
トリガーを発行する側があれば、トリガー待ちのタスクがあるはずです。
function void ovm_sequencer::item_done_trigger(ovm_sequence_item item=null); item_done.trigger(item); endfunctionitem_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_objectにitem_done.trigger(item)で指定したitemが設定されます。
イベントが発生すると、m_objectにitem_done.trigger(item)で指定したitemが設定されます。
そうすると、item_done_wait_trigger_dataタスクを実行している場所は?
1つ目は、ovm_sequenceクラスのm_post_syncタスクです。
m_post_syncタスクはovm_doマクロの引数がovm_sequence_itemクラスの時に呼び出されます。
ドライバ側でitem_done関数が引数有りで呼び出されると、その値がm_post_syncタスクの引数type_varに設定されることになるのです。
(item_done関数に引数を設定しない場合、デフォルトでは引数無しでは、引数type_varは変更されることはありません)
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