- 差异参考
- 按模块查阅
- Field Automation / 版本宏
- M09-002
uvm_field_* automation:显式启用需要的字段操作
影响范围
用于 uvm_field_* 的 FLAG 没有显式启用全部所需操作时核对本条:包括 UVM_NOCOPY、UVM_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,同时保留比较、打印、打包和记录:
显式启用操作,再保留原来的禁用意图:
过渡期可在目标库构建中使用 +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 构建;须验证所需操作。
核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。
源码与标准依据
核查方式:源码与实测核对。实测仅覆盖本条所列场景。
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.2:uvm_object_defines.svh:635(uvm_field_int(ARG,FLAG),各操作仅判负向位 !((FLAG)&UVM_NOxxx))
VCS 内置 uvm-ieee-2020-2.0:uvm_object_defines.svh:842(uvm_field_int(ARG,FLAG=UVM_DEFAULT))、uvm_object_defines.svh:787(m_warn_if_no_positive_ops)、uvm_object_defines.svh:800(m_uvm_field_begin)
标准依据:IEEE 1800.2-2020 §B.2.2(各 field 宏原型均为 FLAG=UVM_DEFAULT)
标为“源码标注”或未注明原文核对的条款仅作定位;具体库行为以源码和实测为准。
引用代码(高亮为引用行);上方行号链接可直接定位。
完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1
完整源码 · SHA256:072baece05e653f6811936de05739a8ff55c02651d89a9278f39cca11372a260
返回Field Automation / 版本宏 · 迁移清单