- 差异参考
- 按模块查阅
- Object / Factory
- M09-003
工厂创建的对象需要带 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 派生类中,旧构造函数没有名称参数:
改为接受并转发名称:
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 构造兼容开关删除。
核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。
源码与标准依据
核查方式:源码与实测核对。实测仅覆盖本条所列场景。
VCS 内置 UVM-1.2:uvm_object_defines.svh:412(VCS 默认分支:tmp = new(); if (name!="") tmp.set_name(name);)
VCS 内置 uvm-ieee-2020-2.0:uvm_object_defines.svh:515(if (name=="") tmp = new(); else tmp = new(name);)
引用代码(高亮为引用行);上方行号链接可直接定位。
完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1
完整源码 · SHA256:072baece05e653f6811936de05739a8ff55c02651d89a9278f39cca11372a260
完整源码 · SHA256:fc5105829c7c96095d9c4d7c43d4dd5b63cf7667ae7b1c4440e4df23b73989c0