跳转至

输入查询内容

    本页内容

    uvm_field_* automation:显式启用需要的字段操作

    影响范围

    用于 uvm_field_*FLAG 没有显式启用全部所需操作时核对本条:包括 UVM_NOCOPYUVM_COPY 等部分操作组合、0、进制位以及自定义 FLAG。已有某个正向位不代表其他操作已启用;保留原禁用意图,不批量覆盖原 flag。

    具体差异

    1.2 各操作主要检查对应负向位,因此 UVM_NOCOPY 表示除 copy 外仍执行其他操作。2.0 各操作同时要求对应正向位并且没有禁用位;UVM_COPY 单独使用也会从旧版允许 compare 变成目标只执行 copy,且因已有正向位不会触发 NO_FLAG。纯数值 0 等写法也不能依赖告警发现。UVM/FIELDS/NO_FLAG 仅覆盖特定无正向位组合(UVM Mantis 7187),不是完整检查器。编译期 UVM_LEGACY_FIELD_MACRO_SEMANTICS 可过渡;省略 FLAG 时的新默认值为 UVM_DEFAULT

    修改方案

    审计全部 field FLAG 的实际操作意图,包括部分正向位、自定义宏和纯数字。若要保留旧版“除禁用项外都执行”,使用 UVM_ALL_ON | 原禁用位;若有意只执行部分操作,列出每个需要的正向位及对应禁用约束。S3 会计算受支持 FLAG 表达式的六类操作使能并报告未知表达式;宏展开、set 操作及实际数据行为仍需核对,不能仅凭零命中或没有 NO_FLAG 核销。legacy field 开关作为过渡时仍需验证实际操作。

    旧写法想禁止 copy,同时保留比较、打印、打包和记录:

    `uvm_field_int(value, UVM_NOCOPY)
    

    显式启用操作,再保留原来的禁用意图:

    `uvm_field_int(value, UVM_ALL_ON | UVM_NOCOPY)
    

    过渡期可在目标库构建中使用 +define+UVM_LEGACY_FIELD_MACRO_SEMANTICS。此开关与 UVM_ENABLE_DEPRECATED_API 不同,也不需要靠 import compat 包启用。显式 flag 改写后,应去掉过渡开关重新验证。

    兼容措施与范围

    UVM_LEGACY_FIELD_MACRO_SEMANTICS 在已测负向及部分正向 FLAG 场景恢复旧操作规则,不依赖 deprecated 开关或 compat 包;不恢复旧 automation 分派、打印宏签名或任意位流格式。改写 FLAG 后移除开关并逐项验证所需操作。

    迁移后验证

    创建两个仅 value 不同的对象,直接检查 a.compare(b)应返回 0,表示发现不匹配。再调用 b.copy(a),确认被禁止 copy 的 b.value 保持原值。改写后按所需操作分别验收 print、pack、record;启用过渡开关时,还需在移除开关后复验。

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

    已有实测与复现

    观察量 1.2 旧写法 2.0 旧写法 2.0 旧写法 + legacy field 开关 显式改写后,两版
    注入字段不匹配后 compare 返回值 0 1(漏检) 0 0
    print / record 的字段调用次数 1 / 1 0 / 0 1 / 1 未单独实测
    pack 位数(本例单个 int) 32 0 32 未单独实测
    copy 后目标字段值 保留 123 保留 123 保留 123 保留原值 1

    显式改写列来自 guidance_probe,该组目标字段初始值为 1;前三列使用原负向 FLAG 实验的初始值 123。两组均以“copy 不改变目标值”为验收条件。

    guidance_probe 补充验证 FLAG=UVM_COPY:不匹配对象在 1.2 compare 返回 0,2.0 返回 1,legacy 开关恢复为 0;该部分正向组合没有 NO_FLAG 提示。显式 UVM_ALL_ON | UVM_NOCOPY 在三种构建都检出不匹配且保持 copy 禁用。print/pack/record 的覆盖仍以上表负向 FLAG 与过渡开关为限;实际改写后按所需操作分别验收。

    `uvm_field_int(a, UVM_NOCOPY)(a=5)+ 对照组 b——1.2:print 显示 a、copy 跳过 a、compare 由 a 抓到 miscompare(o1.a 'h5 vs 'h7b),即"只关拷贝";2.0 默认:a 从 print 消失、compare 不再抓 a(miscompare 只来自对照组 b),完全 no-op,首次 field 操作报一次 UVM/FIELDS/NO_FLAG;2.0 + +define+UVM_LEGACY_FIELD_MACRO_SEMANTICS:print/compare 行为恢复与 1.2 一致(警告文本切换为 legacy 说明)。守卫宏源码:1.2 src/vcs-uvm-1.2/macros/uvm_object_defines.svh:645(只查 !(FLAG&UVM_NOCOPY)) vs 2.0 src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:816-821(FLAG&UVM_OP) && !(FLAG&UVM_NOOP),legacy 宏摘除前半)。

    补充查阅

    扫描定位与记录结果

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

    • S3 · 启发式:field FLAG 的启用操作发生变化,或表达式需要展开。 按两版常量计算受支持的 FLAG 位运算,支持已知常量的 uvm_pkg:: 限定写法,明确操作变化逐处报告;同文件相同未知表达式合并为提示,related_lines 保留全部行号。uvm_pkg::UVM_ALL_ON、UVM_DEFAULT | 0 不报警;其他数值掩码按需提示并关联 M04-013。未模拟 field 宏全部类型差异、set 操作、用户预处理或 legacy 构建;须验证所需操作。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S3
    

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

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

    源码与标准依据

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

    1. 每项字段操作增加正向 FLAG 检查

    VCS 内置 UVM-1.2:COPY/COMPARE 分支只检查对应禁用位:uvm_object_defines.svh:642–656。例如 NOCOPY 不会禁用 compare。

    VCS 内置 uvm-ieee-2020-2.0:操作守卫同时检查正向位和禁用位;legacy 开关移除正向检查:uvm_object_defines.svh:816–825。uvm_field_int 的 COPY/COMPARE 调用该守卫:uvm_object_defines.svh:842–849;此段是宏中对应两项操作的片段。

    2. NO_FLAG 告警不能覆盖所有漏操作写法

    VCS 内置 UVM-1.2:旧行为由上面的负向位判断决定;各 FLAG 的实际操作效果见两版实验。

    VCS 内置 uvm-ieee-2020-2.0:告警宏包含无正向位等附加条件,并有仅提示一次的状态:uvm_object_defines.svh:787–798。已有部分正向位或数值 0 的写法可能不提示,须逐项验证操作。

    补充定位

    VCS 内置 UVM-1.2uvm_object_defines.svh:635uvm_field_int(ARG,FLAG),各操作仅判负向位 !((FLAG)&UVM_NOxxx)

    VCS 内置 uvm-ieee-2020-2.0uvm_object_defines.svh:842uvm_field_int(ARG,FLAG=UVM_DEFAULT))、uvm_object_defines.svh:787m_warn_if_no_positive_ops)、uvm_object_defines.svh:800m_uvm_field_begin

    标准依据:IEEE 1800.2-2020 §B.2.2(各 field 宏原型均为 FLAG=UVM_DEFAULT

    标为“源码标注”或未注明原文核对的条款仅作定位;具体库行为以源码和实测为准。

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

    src/vcs-uvm-1.2/macros/uvm_object_defines.svh
    // ~ARG~ is an integral property of the class, and ~FLAG~ is a bitwise OR of
    // one or more flag settings as described in <Field Macros> above.
    
    `define uvm_field_int(ARG,FLAG) \
      begin \
        case (what__) \
          UVM_CHECK_FIELDS: \
            begin \
              __m_uvm_status_container.do_field_check(`"ARG`", this); \
            end \
          UVM_COPY: \
            begin \
              if(local_data__ == null) return; \
              if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
            end \
          UVM_COMPARE: \
            begin \
              if(local_data__ == null) return; \
              if(!((FLAG)&UVM_NOCOMPARE)) begin \
                if(ARG !== local_data__.ARG) begin \
                   void'(__m_uvm_status_container.comparer.compare_field(`"ARG`", ARG, local_data__.ARG, $bits(ARG))); \
                   if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
                end \
              end \
            end \
          UVM_PACK: \
    

    完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh
    `define m_uvm_field_recursion(FLAG) uvm_recursion_policy_enum'((FLAG)&(UVM_RECURSION))
    
    `define m_warn_if_no_positive_ops(ARG,FLAG) \
      begin \
        static bit dont_warn_if_no_positive_ops ; \
        if (!dont_warn_if_no_positive_ops && !((FLAG)&UVM_FLAGS_ON) && ((FLAG)&(~(UVM_COPY|UVM_COMPARE|UVM_PRINT|UVM_RECORD|UVM_PACK|UVM_UNPACK)))) begin \
          string behavior; \
          `ifdef UVM_LEGACY_FIELD_MACRO_SEMANTICS behavior = "As UVM_LEGACY_FIELD_MACRO_SEMANTICS is set, we will treat this as if UVM_ALL_ON had been bitwise-or'd with FLAG.  This is not the behavior specified by IEEE 1800.2-2020."; \
          `else behavior = "Previous Accellera UVM libraries treated this as if UVM_ALL_ON had been bitwise-or'd with this FLAG, but per IEEE 1800.2-2020, we will treat it as a NO-OP (see UVM Mantis 7187)"; \
          `endif \
          `uvm_warning("UVM/FIELDS/NO_FLAG",{"Field macro for ARG uses FLAG without or'ing any explicit UVM_xxx actions. ",behavior}) \
          dont_warn_if_no_positive_ops = 1; \
        end \
      end
    
    `define m_uvm_field_begin(ARG, FLAG, REGEX="") \
      `m_warn_if_no_positive_ops(ARG,FLAG) \
      begin \
        case (local_op_type__) \
          UVM_CHECK_FIELDS: \
            if ( \
               `ifndef UVM_LEGACY_FIELD_MACRO_SEMANTICS (((FLAG)&UVM_SET)) && `endif \
               (!((FLAG)&UVM_NOSET)) \
               ) begin \
              __local_field_names__.push_back('{`"ARG`", REGEX}); \
            end
    
    `define m_uvm_field_end(ARG) \
        endcase \
      end
    
    `define m_uvm_field_op_begin(OP, FLAG) \
    UVM_``OP: \
      if ( \
         `ifndef UVM_LEGACY_FIELD_MACRO_SEMANTICS (((FLAG)&UVM_``OP)) && `endif \
         (!((FLAG)&UVM_NO``OP)) \
      ) begin
    
    
    `define m_uvm_field_op_end(OP) \
      end
    
    `define m_uvm_compat_physical_abstract(FLAG) \
         if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL)) || \
             (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT)) || \
             (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) 
    

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh
    // one or more flag settings as described in <Field Macros> above.
    
    // @uvm-ieee 1800.2-2020 auto B.2.2.1.1
    `define uvm_field_int(ARG,FLAG=UVM_DEFAULT) \
      `m_uvm_field_begin(ARG,FLAG) \
        `m_uvm_field_op_begin(COPY,FLAG) \
          ARG = local_rhs__.ARG; \
        `m_uvm_field_op_end(COPY) \
        `m_uvm_field_op_begin(COMPARE,FLAG) \
          `uvm_compare_int(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \
        `m_uvm_field_op_end(COMPARE) \
        `m_uvm_field_op_begin(PACK,FLAG) \
          `uvm_pack_int(ARG, __local_packer__) \
        `m_uvm_field_op_end(PACK) \
        `m_uvm_field_op_begin(UNPACK,FLAG) \
          `uvm_unpack_int(ARG, __local_packer__) \
        `m_uvm_field_op_end(UNPACK) \
        `m_uvm_field_op_begin(RECORD,FLAG) \
          `uvm_record_int(`"ARG`", \
    

    完整源码 · SHA256:072baece05e653f6811936de05739a8ff55c02651d89a9278f39cca11372a260

    术语解释 · 兼容配置

    返回Field Automation / 版本宏 · 迁移清单

    版本适用范围