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_sequencerget_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()); endtaskitem_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クラスを見ていきます。
次回は、ovm_sequencerクラスの親クラスであるovm_sequencer_baseクラスを見ていきます。
検証、Verification、SystemVerilog、OVM、Open Verification Methodology