跳转至

输入查询内容

    本页内容

    字符串 default_sequence 不再启动激励

    影响范围

    使用裸 default_sequence 字符串配置、count/max_random_count 或 add_sequence 等旧成员时需要修改。

    具体差异

    旧行为——uvm_config_string::set(..., "default_sequence", ...) 字符串配置 + run_phase 自动 start_default_sequence();新行为——机制整体移除,旧配置静默失效且无 deprecated 警告,test 可能编译通过但不产生激励。

    修改方案

    全局扫描 default_sequence 字符串 config、count/max_random_count 等字段及 add_sequence 等调用,迁移到 phase default sequence(uvm_config_db#(uvm_object_wrapper)::set(this, "<path>.<phase>_phase", "default_sequence", ...))。已是 phase 式写法的不用动

    在 test 的 build_phase 中,旧写法只给 sequencer 配置一个类型名字符串:

    uvm_config_db#(string)::set(this, "env.agent.seqr",
                              "default_sequence", "traffic_seq");
    

    改为按运行阶段配置工厂类型;traffic_seq 是已用 uvm_object_utils 注册的业务 sequence:

    1
    2
    3
    uvm_config_db#(uvm_object_wrapper)::set(
      this, "env.agent.seqr.run_phase", "default_sequence",
      traffic_seq::type_id::get());
    

    把层级路径换成实际 sequencer 路径。run_phase 后缀和 uvm_object_wrapper 类型都不能省略。test 仍需用实际 phase 的 objection 等待激励和检查器完成,配置默认 sequence 本身不保证仿真持续运行。

    配置方式 1.2 2.0
    sequencer 路径 + 类型名字符串 可自动启动 不再自动启动
    sequencer 的 phase 路径 + 类型描述对象或实例 可启动 可启动

    兼容措施与范围:旧字符串 default_sequence 和库管理流程无兼容恢复;已使用 phase wrapper/instance 的配置可保留。

    迁移后验证

    迁移后检查 phase 配置路径和 wrapper/instance 类型;记录 sequence 启动次数和 driver 接收数,已有 phase 式配置保持原行为。

    记录本条结果M06-002 · 状态与证据

    已有实测与复现

    静默失效的只有字符串式uvm_config_db#(string)/uvm_config_string + 裸 default_sequence 字段;uvm_config_string typedef 在 2.0 仍保留——base/uvm_config_db.svh:189deprecated 附录 C.4.2.3.2):1.2 启动(3 条 UVM_DEPRECATED 警告)→ 2.0 下 0 编译错、0 警告、0 报错、sequence 不跑。实测中的两种 phase 配置均有效wrapper 式与 instance 式(1.2 即支持 instance,uvm_sequencer_base.svh:1451)两版均启动——start_phase_sequence 两侧逐行相同(1.2 :1432 / 2.0 :1335),调用点同为 uvm_task_phase.svh(1.2 :110 / 2.0 :108)。已有 phase 式配置无需为字符串式机制的删除改写;路径与 objection 仍按实际配置验证。

    补充查阅

    扫描定位与记录结果

    有扫描规则,覆盖部分可识别写法。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。

    • S1 · 启发式:旧 default_sequence 机制待核对(标准 phase wrapper/instance 无需迁移)。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S1
    

    核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。

    扫描器下载、输入范围与报告说明

    源码与标准依据

    核查方式:源码与实测核对。实测仅覆盖本条所列场景。

    VCS 内置 UVM-1.2uvm_sequencer_base.svh:443–479countmax_random_countmax_random_depthdefault_sequencesequences[$]add_sequence()remove_sequence()set_sequences_queue()start_default_sequence()get_seq_kind()get_sequence()num_sequences()m_add_builtin_seqs()),实现 uvm_sequencer_base.svh:1549–1755(含自动启动默认 sequence 的 run_phase uvm_sequencer_base.svh:1751

    VCS 内置 uvm-ieee-2020-2.0src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh 全部不存在(该类仅 1454 行,无 run_phase)

    引用代码(高亮为引用行);上方行号链接可直接定位。

    src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh
      endfunction
    
      //----------------------------------------------------------------------------
      // DEPRECATED - DO NOT USE IN NEW DESIGNS - NOT PART OF UVM STANDARD
      //----------------------------------------------------------------------------
    
    `ifndef UVM_NO_DEPRECATED
      // Variable- count
      //
      // Sets the number of items to execute.
      //
      // Supercedes the max_random_count variable for uvm_random_sequence class
      // for backward compatibility.
    
      int count = -1;
    
      int m_random_count;
      int m_exhaustive_count;
      int m_simple_count;
    
      int unsigned max_random_count = 10;
      int unsigned max_random_depth = 4;
    
      protected string default_sequence = "uvm_random_sequence";
      protected bit m_default_seq_set;
    
    
      string sequences[$];
      protected int sequence_ids[string];
      protected rand int seq_kind;
    
      extern function void              add_sequence(string type_name);
      extern function void              remove_sequence(string type_name);
      extern function void              set_sequences_queue(ref string sequencer_sequence_lib[$]);
      extern virtual task               start_default_sequence();
      extern function int               get_seq_kind(string type_name);
      extern function uvm_sequence_base get_sequence(int req_kind);
      extern function int               num_sequences();
      extern virtual function void      m_add_builtin_seqs(bit add_simple = 1);
      extern virtual task               run_phase(uvm_phase phase);
    

    src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh
    `ifndef UVM_NO_DEPRECATED
    
    // add_sequence
    // ------------
    //
    // Adds a sequence of type specified in the type_name paramter to the
    // sequencer's sequence library.
    
    function void uvm_sequencer_base::add_sequence(string type_name);
    
      `uvm_warning("UVM_DEPRECATED",{"Registering sequence '",type_name,
         "' with sequencer '",get_full_name(),"' is deprecated. "})
    
      //assign typename key to an int based on size
      //used with get_seq_kind to return an int key to match a type name
      if (!sequence_ids.exists(type_name)) begin
        sequence_ids[type_name] = sequences.size();
        //used w/ get_sequence to return a uvm_sequence factory object that 
        //matches an int id
        sequences.push_back(type_name);
      end
    endfunction
    
    
    // remove_sequence
    // ---------------
    
    function void uvm_sequencer_base::remove_sequence(string type_name);
      sequence_ids.delete(type_name);
      for (int i = 0; i < this.sequences.size(); i++) begin
        if (this.sequences[i] == type_name)
          this.sequences.delete(i);
      end
    endfunction
    
    
    // set_sequences_queue
    // -------------------
    
    function void uvm_sequencer_base::set_sequences_queue(
                                        ref string sequencer_sequence_lib[$]);
    
      for(int j=0; j < sequencer_sequence_lib.size(); j++) begin
        sequence_ids[sequencer_sequence_lib[j]] = sequences.size();
        this.sequences.push_back(sequencer_sequence_lib[j]);
      end
    endfunction
    
    
    // start_default_sequence
    // ----------------------
    // Called when the run phase begins, this method starts the default sequence,
    // as specified by the default_sequence member variable.
    //
    
    task uvm_sequencer_base::start_default_sequence();
      uvm_sequence_base m_seq ;
      uvm_coreservice_t cs = uvm_coreservice_t::get();                                                     
      uvm_factory factory=cs.get_factory();
    
      // Default sequence was cleared, or the count is zero
      if (default_sequence == "" || count == 0 ||
            (sequences.size() == 0 && default_sequence == "uvm_random_sequence"))
        return;
    
      // Have run-time phases and no user setting of default sequence
      if(this.m_default_seq_set == 0 && m_domain != null) begin
        default_sequence = "";
        `uvm_info("NODEFSEQ", {"The \"default_sequence\" has not been set. ",
           "Since this sequencer has a runtime phase schedule, the ",
           "uvm_random_sequence is not being started for the run phase."}, UVM_HIGH)
        return;
      end
    
      // Have a user setting for both old and new default sequence mechanisms
      if (this.m_default_seq_set == 1 &&
         (uvm_config_db #(uvm_sequence_base)::exists(this, "run_phase", "default_sequence", 0) ||
          uvm_config_db #(uvm_object_wrapper)::exists(this, "run_phase", "default_sequence", 0)))
      begin
        `uvm_warning("MULDEFSEQ", {"A default phase sequence has been set via the ",
           "\"<phase_name>.default_sequence\" configuration option.",
           "The deprecated \"default_sequence\" configuration option is ignored."})
        return;
      end
    
      // no user sequences to choose from
      if(sequences.size() == 2 &&
         sequences[0] == "uvm_random_sequence" &&
         sequences[1] == "uvm_exhaustive_sequence") begin
        uvm_report_warning("NOUSERSEQ", {"No user sequence available. ",
                           "Not starting the (deprecated) default sequence."}, UVM_HIGH);
        return;
      end
    
        `uvm_warning("UVM_DEPRECATED",{"Starting (deprecated) default sequence '",default_sequence,
         "' on sequencer '",get_full_name(),
         "'. See documentation for uvm_sequencer_base::start_phase_sequence() for information on ",
         "starting default sequences in UVM."})
    
        //create the sequence object
        if (!$cast(m_seq, factory.create_object_by_name(default_sequence, 
                                                get_full_name(), default_sequence))) 
          begin
            uvm_report_fatal("FCTSEQ",{"Default sequence set to invalid value : ",
                                       default_sequence}, UVM_NONE);
          end
    
        if (m_seq == null) begin
          uvm_report_fatal("STRDEFSEQ", "Null m_sequencer reference", UVM_NONE);
        end
        m_seq.set_starting_phase(run_ph);
        m_seq.print_sequence_info = 1;
        m_seq.set_parent_sequence(null);
        m_seq.set_sequencer(this);
        m_seq.reseed();
        if (!m_seq.randomize()) begin
          uvm_report_warning("STRDEFSEQ", "Failed to randomize sequence");
        end
        m_seq.start(this);
    endtask
    
    
    // get_seq_kind
    // ------------
    // Returns an int seq_kind correlating to the sequence of type type_name
    // in the sequencers sequence library. If the named sequence is not
    // registered a SEQNF warning is issued and -1 is returned.
    
    function int uvm_sequencer_base::get_seq_kind(string type_name);
    
      `uvm_warning("UVM_DEPRECATED", $sformatf("%m is deprecated"))
    
      if (sequence_ids.exists(type_name))
        return sequence_ids[type_name];
    
      `uvm_warning("SEQNF", 
        {"Sequence type_name '",type_name,"' not registered with this sequencer."})
    
      return -1;
    endfunction
    
    
    // get_sequence
    // ------------
    // Returns a reference to a sequence specified by the seq_kind int.
    // The seq_kind int may be obtained using the get_seq_kind() method.
    
    function uvm_sequence_base uvm_sequencer_base::get_sequence(int req_kind);
      uvm_coreservice_t cs = uvm_coreservice_t::get();                         
      uvm_factory factory = cs.get_factory();
      uvm_sequence_base m_seq ;
      string m_seq_type;
    
      `uvm_warning("UVM_DEPRECATED", $sformatf("%m is deprecated"))
    
      if (req_kind < 0 || req_kind >= sequences.size()) begin
        uvm_report_error("SEQRNG", 
          $sformatf("Kind arg '%0d' out of range. Need 0-%0d", 
          req_kind, sequences.size()-1));
      end
    
      m_seq_type = sequences[req_kind];
      if (!$cast(m_seq, factory.create_object_by_name(m_seq_type,
                                              get_full_name(),
                                              m_seq_type))) 
      begin
          uvm_report_fatal("FCTSEQ", 
            $sformatf("Factory cannot produce a sequence of type %0s.",
            m_seq_type), UVM_NONE);
      end
    
      m_seq.print_sequence_info = 1;
      m_seq.set_sequencer (this);
      return m_seq;
    
    endfunction
    
    
    // num_sequences
    // -------------
    
    function int uvm_sequencer_base::num_sequences();
      return sequences.size();
    endfunction
    
    
    // m_add_builtin_seqs
    // ------------------
    
    function void uvm_sequencer_base::m_add_builtin_seqs(bit add_simple=1);
      if(!sequence_ids.exists("uvm_random_sequence"))
        add_sequence("uvm_random_sequence");
      if(!sequence_ids.exists("uvm_exhaustive_sequence"))
        add_sequence("uvm_exhaustive_sequence");
      if(add_simple == 1) begin
        if(!sequence_ids.exists("uvm_simple_sequence"))
          add_sequence("uvm_simple_sequence");
      end
    endfunction
    
    
    // run_phase
    // ---------
    
    task uvm_sequencer_base::run_phase(uvm_phase phase);
      super.run_phase(phase);
      start_default_sequence();
    endtask
    
    
    `endif // UVM_NO_DEPRECATED
    
    //------------------------------------------------------------------------------
    //
    // Class- uvm_sequence_request
    //
    //------------------------------------------------------------------------------
    
    class uvm_sequence_request;
      bit        grant;
    

    完整源码 · SHA256:66b7addbfd531ae8a5579d82e77865fab23259c17a87a43ee4d1dbf7d67133fd

    术语解释 · 兼容配置

    返回Sequence / Sequencer · 迁移清单

    版本适用范围