跳转至

输入查询内容

    本页内容

    工厂创建的对象需要带 name 参数的构造函数

    影响范围

    工厂创建无 name 参数构造类,且旧构建依赖 UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR。

    具体差异

    须区分对象的 create() 与 factory registry 的 create_object()。1.2 对象宏的默认分支可用 new() 后设名,但 src/vcs-uvm-1.2/base/uvm_registry.svh:202-208 默认已包含 new(name),只有定义 UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR 才避开。2.0 registry 不再提供该旧开关,注册且只有无参构造函数的类会编译失败;未启用该开关时,相同类在 1.2 已失败,不能算新增断点。2.0 对象宏仍有空名称时 new() 的分支,不能概括为每次调用都传 name。

    修改方案

    对需要 factory/create 的类补齐默认 name 构造参数并转发给 super;先核对 1.2 构建是否依赖 UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR,勿将所有无参类都计为新增断点。

    需要工厂创建的 uvm_object 派生类中,旧构造函数没有名称参数:

    1
    2
    3
    function new();
      super.new();
    endfunction
    

    改为接受并转发名称:

    1
    2
    3
    function new(string name = "my_item");
      super.new(name);
    endfunction
    

    my_item 换成该类的默认名称。用 my_item::type_id::create("req") 创建后确认 get_name() 返回 req。旧版是否能编译还取决于 UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR,不应把所有无参构造都算作切库新增错误。

    兼容措施与范围:旧 constructor 兼容宏不再提供;依赖该宏的注册类须补 name 参数并转发 super。

    迁移后验证

    两库编译同一构造签名,使用 type_id::create 创建对象并检查 get_name;同时核对 super.new 转发。

    记录本条结果M09-003 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

    • C6 · 启发式:无参构造函数:核对旧版 constructor 兼容宏及 factory 注册。 识别有/无括号的无参构造;已知注册宏和显式 registry 关联为编译风险候选。未确认依赖及自定义 create 降为提示,直接 new 的无参类可保留;项目包装宏、外部 registry 和继承仍需核对。

    • D15 · 文本匹配:旧 object 构造兼容开关删除。

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_object_defines.svh:412(VCS 默认分支:tmp = new(); if (name!="") tmp.set_name(name);

    VCS 内置 uvm-ieee-2020-2.0uvm_object_defines.svh:515if (name=="") tmp = new(); else tmp = new(name);

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

    src/vcs-uvm-1.2/macros/uvm_object_defines.svh
    // m_uvm_object_create_func
    // ------------------------
    
    `define m_uvm_object_create_func(T) \
       `ifdef UVM_CREATE_OPT \
            virtual function void call_new(); \
            endfunction \
       `else \
        function uvm_object create (string name=""); \
            T tmp; \
           `ifdef UVM_OBJECT_MUST_HAVE_CONSTRUCTOR \
              if (name=="") tmp = new(); \
              else tmp = new(name); \
           `else \
              tmp = new(); \
              if (name!="") \
                tmp.set_name(name); \
           `endif \
           return tmp; \
    

    完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh
    // m_uvm_object_create_func
    // ------------------------
    
    `define m_uvm_object_create_func(T) \
       function uvm_object create (string name=""); \
         T tmp; \
         if (name=="") tmp = new(); \
         else tmp = new(name); \
         return tmp; \
       endfunction
    
    // Macro --NODOCS-- uvm_type_name_decl(TNAME_STRING)
    // Potentially public macro for Mantis 5003.
    //
    // This macro creates a statically accessible
    // ~type_name~, and implements the virtual
    // <uvm_object::get_type_name> method.
    //
     `define uvm_type_name_decl(TNAME_STRING) \
    

    完整源码 · SHA256:072baece05e653f6811936de05739a8ff55c02651d89a9278f39cca11372a260

    src/vcs-uvm-1.2/base/uvm_registry.svh
      virtual function uvm_object create_object(string name="");
        T obj;
    `ifdef UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR
        obj = new();
        if (name!="")
          obj.set_name(name);
    `else
        if (name=="") obj = new();
        else obj = new(name);
    `endif
        return obj;
      endfunction
    
      const static string type_name = Tname;
    
      // Function: get_type_name
      //
      // Returns the value given by the string parameter, ~Tname~. This method
    

    完整源码 · SHA256:fc5105829c7c96095d9c4d7c43d4dd5b63cf7667ae7b1c4440e4df23b73989c0

    术语解释 · 兼容配置

    返回Object / Factory · 迁移清单

    版本适用范围