Vengineerの妄想

人生を妄想しています。

UVM 1.0 : default_sequence(その1)


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