UVM 1.0になって、default_sequence関連が変わったようです。
src/seq/uvm_sequencer_base.svhのstart_phase_sequence関数でその処理を行っています。
日本語部分は、私が追加しました。
日本語部分は、私が追加しました。
function void uvm_sequencer_base::start_phase_sequence(uvm_phase phase); uvm_object_wrapper wrapper; uvm_sequence_base seq; uvm_factory f = uvm_factory::get(); // default sequence instance? // 最初に'''uvm_sequence_baseクラス'''に対して // '''default_sequence'''が設定されるかを確認します // 設定されていれば、その値が'''seq'''に設定されます。 if (!uvm_config_db #(uvm_sequence_base)::get( this, {phase.get_name(),"_phase"}, "default_sequence", seq) ) begin // default sequence object wrapper? // 設定されていないときは、 // '''uvm_object_wrapperクラス'''に対して、同じようにします。 if (uvm_config_db #(uvm_object_wrapper)::get( this, {phase.get_name(),"_phase"}, "default_sequence", wrapper) ) begin // use wrapper is a sequence type // uvm_factory(f)を使って、オブジェクトを生成し、 // $castを使って、seqに代入する if(!$cast(seq , f.create_object_by_type( wrapper, get_full_name(), wrapper.get_type_name()))) begin `uvm_warning("PHASESEQ", {"Default sequence for phase '", phase.get_name(),"' %s is not a sequence type"}) return; end end else begin // '''uvm_object_wrapperクラス'''でも // '''default_sequence'''が設定されていないときは // UVM_INFOでメッセージを表示します。 `uvm_info("PHASESEQ", {"No default phase sequence for phase ' phase.get_name(),"'"}, UVM_FULL) return; end end // ここが実行されるということは、'''default_sequence'''が獲得できた `uvm_info("PHASESEQ", {"Starting default sequence '", seq.get_type_name(),"' for phase '", phase.get_name()}, UVM_FULL) seq.print_sequence_info = 1; seq.set_sequencer(this); seq.reseed(); seq.starting_phase = phase; // ランダム生成する if (!seq.is_randomized && !seq.randomize()) begin `uvm_warning("STRDEFSEQ", {"Randomization failed for default sequence '", seq.get_type_name(),"' for phase ", phase.get_name()}) return; end // シーケンスを開始する fork seq.start(this); join_none // join_noneなので、シーケンスが終了するのを待たない。 endfunction
次回は、default_sequenceの設定方法についてです。
検証、Verification、SystemVerilog、UVM、Unified Verification Methodology