跳转至

输入查询内容

    本页内容

    工厂 name 覆盖延迟解析:TYPNTF 由 set 时推迟到 create 时

    影响范围

    通过字符串设置尚未注册类型的 factory override。

    具体差异

    2.0 允许用尚未注册的类型名设置 override(配合 set_type_alias/set_inst_alias 先设 override 后注册类型)。正向收益是放宽顺序依赖;副作用是 override 类型名拼写错误不再在 set 时报错,而是延迟到首次 create 时才暴露。

    修改方案

    保留已注册类型的按名 override;在建立 override 后实际执行一次 create,并检查返回非空及派生类型。若出现 TYPNTF,修正类型名或注册位置,不要仅因 set_override 没报错而忽略创建失败。

    兼容措施与范围:兼容措施不恢复 set 时的旧名称诊断;按名 override 必须通过实际 create 检查。

    迁移后验证

    用正确名称和故意拼错的名称各 create 一次;正确项产生目标类型,错误项在 create/解析时可被回归诊断捕获。

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

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_factory.svh:1014set_type_override_by_name 时 override 类型未注册即报 TYPNTF error)、uvm_factory.svh:1143(inst override 同)

    VCS 内置 uvm-ieee-2020-2.0uvm_factory.svh:1648/uvm_factory.svh:1768find_override_by_* 解析时才报 TYPNTF,set 时不再校验)

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

    src/vcs-uvm-1.2/base/uvm_factory.svh
      // check that type is registered with the factory
      if (override_type == null) begin
          uvm_report_error("TYPNTF", {"Cannot register override for original type '",
          original_type_name,"' because the override type '",
          override_type_name, "' is not registered with the factory."}, UVM_NONE);
        return;
      end
    
      // check that old and new are not the same
      if (original_type_name == override_type_name) begin
          uvm_report_warning("TYPDUP", {"Requested and actual type name ",
          " arguments are identical: ",original_type_name,". Ignoring this override."}, UVM_NONE);
        return;
      end
    
      foreach (m_type_overrides[index]) begin
        if (m_type_overrides[index].orig_type_name == original_type_name) begin
          if (!replace) begin
    

    src/vcs-uvm-1.2/base/uvm_factory.svh
      // check that type is registered with the factory
      if (override_type == null) begin
        uvm_report_error("TYPNTF", {"Cannot register instance override with type name '",
        original_type_name,"' and instance path '",full_inst_path,"' because the type it's supposed ",
        "to produce, '",override_type_name,"', is not registered with the factory."}, UVM_NONE);
        return;
      end
    
      if (original_type == null)
          m_lookup_strs[original_type_name] = 1;
    
      override = new(.full_inst_path(full_inst_path),
                     .orig_type(original_type),
                     .orig_type_name(original_type_name),
                     .ovrd_type(override_type));
    
      if(original_type != null) begin
        if (check_inst_override_exists(original_type,override_type,full_inst_path))
    

    完整源码 · SHA256:5903939ccda4118b353b3a0dd274267e00f30a584a16c3ac8e5afe48d70e4316

    src/vcs-uvm-ieee-2020-2.0/base/uvm_factory.svh
          override = m_resolve_type_name_by_inst(lindex.ovrd.m_type_name,full_inst_path);
        end
        if(override == null) begin
          uvm_report_error("TYPNTF", {"Cannot resolve override for original type '",
            lindex.orig.m_type_name,"' because the override type '",
            lindex.ovrd.m_type_name, "' is not registered with the factory."}, UVM_NONE);
        end
        return override;
      end
    
      // No override found
      return null;
    
    
    endfunction
    
    
    // find_override_by_type
    // ---------------------
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_factory.svh
          override = m_resolve_type_name_by_inst(lindex.ovrd.m_type_name,full_inst_path);
        end
        if(override == null) begin
          uvm_report_error("TYPNTF", {"Cannot resolve override for original type '",
            lindex.orig.m_type_name,"' because the override type '",
            lindex.ovrd.m_type_name, "' is not registered with the factory."}, UVM_NONE);
        end
        return override;
      end
    
      // No override found
    
      return requested_type;
    
    endfunction
    
    
    // print
    // -----
    

    完整源码 · SHA256:dcaf0974ce7ebac754b3176e73a94a46cfae709f8a249e007c9dfcf3677d2f61

    术语解释 · 兼容配置

    返回Object / Factory · 迁移清单

    版本适用范围