006. default_sequence

以前、OVMやUVMの初期?では、default_sequenceの初期値が "random_seuqnece" というもので、実行したいsequenceをセットしておかないと、意図しない動作をしていました。

デバッグで、uvm_top.print_topology();を実行すると、昔はdefault_sequenceの値が見えていました。しかし今は見えません。仕方がないので、uvm_sequencerをextendsして、task run_phaseの中で default_sequence の値を表示させるようにしていました。ところが、uvm_testクラスからuvm_config_dbのsetでdefault_sequenceを設定しても、uvm_sequencerの中で表示されるのは常に uvm_random_sequence。なんでだ?なんでだ?と昨日ずーっと悩んでいました。しかも、uvm_random_sequenceになっていても、指定したsequenceは動いている。

今朝、気づきました。default_sequenceは

protected string default_sequence = "uvm_random_sequence";

となっているのですが、これはDEPRECATEDの中。もう使わなくなるよと言うわけですが、それ以外に、「uvm_config_db」を使っているということは、このstringにセットするわけではないんですよね。ってこ とはですよ。どこかで default_sequence という名前で uvm_config_db を使って get しているところがあるはずだと。調べたらありました。

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?
    if (!uvm_config_db #(uvm_sequence_base)::get(
          this, {phase.get_name(),"_phase"}, "default_sequence", seq) || seq == null) begin
      // default sequence object wrapper?
      if (uvm_config_db #(uvm_object_wrapper)::get(
               this, {phase.get_name(),"_phase"}, "default_sequence", wrapper) && wrapper != null) begin
        // use wrapper is a sequence type
        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_info("PHASESEQ", {"No default phase sequence for phase '",
                               phase.get_name(),"'"}, UVM_FULL)
        return;
      end
    end

UVMでは、この人なんですねー仕事しているの。