跳转至

输入查询内容

    本页内容

    run_test、pre_abort 与命令行配置的执行顺序

    影响范围

    自定义 run_test/pre_abort 流程,或依赖 +uvm_set_* 参数和 root 全局状态。

    具体差异

    run_test 改经 hopper,基本 phase 顺序已有 L2 对照;新增 run_test 前后及 pre_abort callback。die 增加防重入,结束时 m_do_cmdline_checks 调用的是 set_verbosity::check,不能声称所有未命中 action/severity 参数都会告警;+UVM_DUMP_REPORT_ARGS 可输出相关配置。重复构造 root 报 UVM/ROOT/MULTI,覆盖 uvm_top 后在 getter 检查时报 UVM/BAD_TOP。finish_on_completion 和 enable_print_topology 增加访问器。

    修改方案

    删除或修正启动日志指出的无效 +uvm_set_* 配置,逐项确认目标组件和读回值。旧 pre_abort 中必须执行的诊断保留在该钩子内,并检查子组件与父组件的调用顺序;需要围绕 run_test 添加处理时,使用 uvm_run_test_callback 的 pre_run_test/post_run_test,不能以 post_run_test 单独判定业务成功。

    兼容措施与范围:兼容措施不恢复旧启动与退出顺序;保留必要诊断并验证配置结果、回调次序和业务完成。

    迁移后验证

    记录 phase 和 callback 顺序;核对目标组件实际 verbosity/action/severity。即使没有未命中参数警告,也要直接检查配置结果。

    记录本条结果M01-008 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S37
    

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_root.svh:415(run_test,uvm_phase::m_run_phases() + wait(m_phase_all_done))、uvm_root.svh:132(die)、uvm_root.svh:328const uvm_root uvm_top

    VCS 内置 uvm-ieee-2020-2.0uvm_root.svh:484/uvm_root.svh:585–588(run_test 改经 uvm_phase_hopper::run_phases(),含 uvm_run_test_callback::m_do_pre_run_test()/uvm_root.svh:596 post 钩子与 core-state 推进)、uvm_root.svh:150(die 增加 PRE_ABORT 防重入与 m_do_cmdline_checks())、uvm_root.svh:357uvm_top 不再 const,覆写会触发 UVM/BAD_TOP fatal)、uvm_root.svh:814(新 +UVM_DUMP_REPORT_ARGS 报告参数汇总)、uvm_root.svh:1112(新 +uvm_set_config_bitstream plusarg)

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

    src/vcs-uvm-1.2/base/uvm_root.svh
      // It then calls <uvm_report_server::report_summarize> and terminates the simulation
      // with ~$finish~.
    
      virtual function void die();
        uvm_report_server l_rs = uvm_report_server::get_server();
        // do the pre_abort callbacks
        m_do_pre_abort();
    
        l_rs.report_summarize();
        $finish;
      endfunction
    
    
      // Function: set_timeout
      //
      // Specifies the timeout for the simulation. Default is <`UVM_DEFAULT_TIMEOUT>
      //
      // The timeout is simply the maximum absolute simulation time allowed before a
      // ~FATAL~ occurs.  If the timeout is set to 20ns, then the simulation must end
    

    src/vcs-uvm-1.2/base/uvm_root.svh
    // This is the top-level that governs phase execution and provides component
    // search interface. See <uvm_root> for more information.
    //------------------------------------------------------------------------------
    const uvm_root uvm_top = uvm_root::get();
    
    //-----------------------------------------------------------------------------
    // IMPLEMENTATION
    //-----------------------------------------------------------------------------
    
    `UVM_VCS_DEFINITIONS
    
    // get
    // ---
    
    function uvm_root uvm_root::get();
       uvm_coreservice_t cs = uvm_coreservice_t::get();
       return cs.get_root();
    endfunction
    

    src/vcs-uvm-1.2/base/uvm_root.svh
    // run_test
    // --------
    
    task uvm_root::run_test(string test_name="");
    
      uvm_report_server l_rs;
      uvm_coreservice_t cs = uvm_coreservice_t::get();                                                     
      uvm_factory factory=cs.get_factory();
      bit testname_plusarg;
      int test_name_count;
      string test_names[$];
      string msg;
      uvm_component uvm_test_top;
    
      process phase_runner_proc; // store thread forked below for final cleanup
    
      testname_plusarg = 0;
    
      // Set up the process that decouples the thread that drops objections from
    

    完整源码 · SHA256:7a3a006a2f6a7b5bbedc778d199ef5389bbe97f19358c79b12ec5d3b18e81438

    src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh
        // It then calls <uvm_report_server::report_summarize> and terminates the simulation
        // with ~$finish~.
    
        virtual function void die();
          uvm_report_server l_rs;
    
              // Only die once...
              if (get_core_state() inside {UVM_CORE_PRE_ABORT,UVM_CORE_ABORTED})
                return;
    
              l_rs = uvm_report_server::get_server();
          // do the pre_abort callbacks
    
              m_uvm_core_state.push_front(UVM_CORE_PRE_ABORT);
    
    
          m_do_pre_abort();
    
              uvm_run_test_callback::m_do_pre_abort();
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh
    // const value.
    
    //@uvm-compat Provided for compatibility with 1.2
    /* const */ uvm_root uvm_top;
    
    
    //-----------------------------------------------------------------------------
    // IMPLEMENTATION
    //-----------------------------------------------------------------------------
    
    `UVM_VCS_DEFINITIONS
    
    // get
    // ---
    
    function uvm_root uvm_root::get();
        uvm_coreservice_t cs = uvm_coreservice_t::get();
        return cs.get_root();
    endfunction
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh
        process phase_runner_proc; // store thread forked below for final cleanup
    
        uvm_run_test_callback::m_do_pre_run_test();
    
        factory=uvm_factory::get();
            m_uvm_core_state.push_front(UVM_CORE_PRE_RUN);
    
        testname_plusarg = 0;
    
        // Set up the process that decouples the thread that drops objections from
        // the process that processes drop/all_dropped objections. Thus, if the
        // original calling thread (the "dropper") gets killed, it does not affect
        // drain-time and propagation of the drop up the hierarchy.
        // Needs to be done in run_test since it needs to be in an
        // initial block to fork a process.
        uvm_objection::m_init_objections();
    
    // dump cmdline args BEFORE the args are being used
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh
        fork 
              begin
            // spawn the phase runner task
                uvm_phase_hopper hopper;
                hopper = uvm_phase_hopper::get_global_hopper();
                m_uvm_core_state.push_front(UVM_CORE_RUNNING);
                hopper.run_phases();
          end
        join
    
            m_uvm_core_state.push_front(UVM_CORE_POST_RUN);
    
        l_rs = uvm_report_server::get_server();
    
            uvm_run_test_callback::m_do_post_run_test();
    
            m_do_cmdline_checks();
    
        l_rs.report_summarize();
    
            m_uvm_core_state.push_front(UVM_CORE_FINISHED);
        if (get_finish_on_completion())
            $finish;
    
    endtask
    
    
    // find_all
    // --------
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh
      uvm_cmdline_set_verbosity::check(this);
    
      if(clp.get_arg_matches("+UVM_DUMP_REPORT_ARGS", dump_args)) begin
        string msgs[$];
    
    `ifdef UVM_CMDLINE_NO_DPI
        msgs.push_back("\n!!! UVM_CMDLINE_NO_DPI IS DEFINED !!!");
    `endif
    
        msgs.push_back(uvm_cmdline_verbosity::dump());
        msgs.push_back(uvm_cmdline_set_verbosity::dump());
        msgs.push_back(uvm_cmdline_set_action::dump());
        msgs.push_back(uvm_cmdline_set_severity::dump());
    
        uvm_report_info("REPORTARGS", 
                        $sformatf("\n--- UVM Reporting Argument Summary ---\n%s\n", 
                                  `UVM_STRING_QUEUE_STREAMING_PACK(msgs)),
                        UVM_NONE);
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh
        foreach(args[i]) begin
            m_process_config(args[i].substr(20, args[i].len()-1), 1, 0);
        end
        void'(clp.get_arg_matches("/^\\+(UVM_SET_CONFIG_BITSTREAM|uvm_set_config_bitstream)=/",args));
        foreach(args[i]) begin
            m_process_config(args[i].substr(26, args[i].len()-1), 0, 1);
        end
        void'(clp.get_arg_matches("/^\\+(UVM_SET_CONFIG_STRING|uvm_set_config_string)=/",args));
        foreach(args[i]) begin
            m_process_config(args[i].substr(23, args[i].len()-1), 0, 0);
        end
        void'(clp.get_arg_matches("/^\\+(UVM_SET_DEFAULT_SEQUENCE|uvm_set_default_sequence)=/", args));
        foreach(args[i]) begin
            m_process_default_sequence(args[i].substr(26, args[i].len()-1));
        end
    endfunction
    
    
    // m_do_max_quit_settings
    

    完整源码 · SHA256:ec598230e6e36782814b52bcbe1c1b51ed22196ad1a7efe9a6600888916d72a9

    术语解释 · 兼容配置

    返回Object / Factory · 迁移清单

    版本适用范围