# UVM-1.2 → IEEE 1800.2-2020(v2.0)差异分析 > **技术基线日期**:2026-09-10;逐条状态见 `docs/review/inventory.md`。 > **对比基准**:以 VCS W-2024.09-SP2-8 内置版为落地基准,Accellera 原版为参照—— > - 1.2 侧:`src/vcs-uvm-1.2/`(参照 `src/uvm-1.2/src/`) > - 2.0 侧:`src/vcs-uvm-ieee-2020-2.0/`(参照 `src/1800.2-2020-2.0/src/`) > > **证据来源优先级**:① 仓库内源码和 VCS 实测 → ② IEEE 1800.2-2020 标准原文及版本自带文档 → ③ SV LRM / VCS UG。新增或删除项的一侧可能没有对应定义,引用结构检查不等于语义审核通过。 ## 0. 阅读指南 本文为完整技术分析附录。开始迁移请优先阅读 HTML 的版本与兼容、示例运行与迁移步骤;各条目的“影响类型”“适用条件”“迁移动作”“验证方法”在 HTML 与本文共用。 - 目标读者:熟悉 UVM-1.2、准备迁移到目标库的验证工程师。 - 适用范围:大型 SoC 环境,UVM-1.2 主流用法全覆盖;**OVM 遗留写法不在本文范围**。 - 每条差异标注:**类型**(删除/新增/签名变更/行为变化/废弃)、**双侧源码位置**、**迁移动作**、**兼容说明**(具体措施、恢复范围及仍需修改或验证的部分,区分 compat 包、主库保留项、deprecated 开关与 legacy field 开关)。 - 条目按模块组织,稳定 ID 用于关联改法与证据。预检时识别静默与数据风险,编译跑通后在回归放行前逐项验证;模块内的具体适用条件决定改造范围。 ## 1. L1 冒烟实测记录(工具链与证据链验证) L1 使用 `src/uvm-1.2/examples/simple/hello_world`(producer/consumer 经 TLM FIFO 传 packet,含 config_int 设置与 print)验证"同一 TB 在两侧库下的表现"。 **环境**:VCS W-2024.09-SP2-8(`.env` 加载),命令模板: ```bash vcs -sverilog -full64 -timescale=1ns/1ns -ntb_opts <库> +incdir+$EX $EX/hello_world.sv -o simv ./simv +UVM_VERBOSITY=UVM_LOW -l vcs.log ``` | 场景 | `-ntb_opts` | 编译 | 仿真 | 结论 | |---|---|---|---|---| | 原始 1.2 TB | `uvm-1.2` | PASS | PASS(0 W/E/F,4 INFO) | 基线正常 | | 原始 1.2 TB | `uvm-ieee-2020-2.0` | **FAIL:5 个编译错误** | — | 全部命中 printer knobs 宽度字段删除(见第 2 章) | | 迁移后 TB(删除 5 行 `*_width` 设置) | `uvm-ieee-2020-2.0` | PASS | PASS(0 W/E/F,3 INFO) | 迁移路径成立 | 实测暴露的两个迁移事实: 1. **编译断点**:`uvm_default_table_printer.knobs.{name_width,type_width,size_width,value_width}` 在 2.0 不存在(`m_uvm_printer_knobs`,`src/vcs-uvm-ieee-2020-2.0/base/uvm_printer.svh:617`),列宽改为自动计算。compat/ 包不覆盖此项,必须改代码(本例删除即可)。 2. **日志差异**:该 L1 用例的 2.0 日志少一条 TEST_DONE INFO。1.2 也只有走到相关 all_dropped 路径且报告配置允许时才输出;两版均不应把固定 INFO 条数当成通用成功标准(M03-004)。 另注:VCS Makefile 时代常用的 `+acc` 选项在 W-2024.09 已废弃(编译报 `OBSOLETE_OPTION_PLUSACC`),需改用 `-debug_access+...`,这是仿真器版本问题而非 UVM 迁移问题。 ### 1.1 `-ntb_opts` 选项名与实际库版本的映射(VCS W-2024.09-SP2-8) VCS UG 示例中的简写 `-ntb_opts uvm-ieee` 实际加载的是 **1800.2-2017(UVM 1.0)**,不是 2020 库——迁移命令必须写全名。四组内置库实测映射(`UVM_VERSION_STRING` 取自各目录 `base/uvm_version.svh`): | `-ntb_opts` 值 | `$VCS_HOME/etc/` 目录 | 实际库版本 | |---|---|---| | `uvm-ieee` | `uvm-ieee` | 1800.2-**2017** UVM 1.0(简写陷阱,勿用) | | `uvm-ieee-2020` | `uvm-ieee-2020` | 1800.2-2020 UVM **1.1** | | `uvm-ieee-2020-2.0` | `uvm-ieee-2020-2.0` | 1800.2-2020 UVM **2.0**(迁移目标) | | `uvm-ieee-2020-3.1` | `uvm-ieee-2020-3.1` | 1800.2 2020.3.1 | ### 1.2 compat 包不会被 `-ntb_opts` 自动编译(实测) `-ntb_opts` 的自动解析清单仅 `uvm_pkg.sv` + macros(L1 `compile.log` 可证),compat 四件套(第 10 章)不在其中——实测 `-ntb_opts uvm-ieee-2020-2.0` 下引用 `uvm_compat_pkg::` 直接报 `Error-[SV-LCM-PND] Package not defined`。需显式加入编译列表(已实测编译+仿真通过): ```bash vcs -full64 -sverilog -ntb_opts uvm-ieee-2020-2.0 \ +incdir+$VCS_HOME/etc/uvm-ieee-2020-2.0/src \ +incdir+$VCS_HOME/etc/uvm-ieee-2020-2.0/compat \ $VCS_HOME/etc/uvm-ieee-2020-2.0/compat/uvm_compat_pkg.sv \ <用户文件> ``` ## 2. 模块风险地图 | 章 | 模块 | 稳定 ID 数(含旧入口) | 优先检查 | |---|---|---|---| | 1 | 对象模型核心(object/component/factory/coreservice/transaction) | 17 | policy 体系引入;`begin_event/end_event` 字段删除;废弃方法(kill/stop 系)清除 | | 2 | 策略与 I/O(printer/packer/comparer/recorder/tr) | 15 | packer 位流不兼容;printer knobs 宽度字段删除(L1 实证) | | 3 | phase 与 objection | 14 | stop 机制整体删除;`uvm_test_done_objection` 不再控制 run phase;TEST_DONE 消息移除(L1 实证) | | 4 | 报告与命令行 | 19 | 消息宏 NO_ACTION 短路;WARNING/ERROR 不再受 verbosity 过滤;一批 deprecated 全局函数删除 | | 5 | config_db 与 resource_db | 11 | 自管理接口删除;按名查询的优先级选择需核对(S11) | | 6 | sequence 机制(seq/) | 19 | 旧 default_sequence 机制静默失效;三个基类抽象化;`uvm_do_*` 宏收缩 | | 7 | 寄存器模型(reg/) | 24 | 大端数据、字段 byte-enable 与失败预测行为已实测;caller 参数删除 | | 8 | TLM(tlm1/tlm2) | 11 | FIFO flush 实测残留;GP do_compare/do_pack 行为变化 | | 9 | 宏与废弃 API | 17 | field 宏 flag 语义静默反转;factory create 强制 `new(name)`;deprecated 开关极性翻转 | | 10 | 预定义组件、compat 层与工具集成 | 8 | `DRVCONNECT` 新告警;compat/ 覆盖范围详解;DEVIATIONS.md 整理 | 保留 **159 个稳定 ID**:151 个主条目与 8 个旧 ID 跳转入口。旧入口不重复维护正文;条目数不代表实际代码改动数,检查状态见 `docs/review/inventory.md`。 ## 3. 迁移必改项速览(编译断点 / 静默失效) 以下条目命中主流用法且不改就跑不通/跑错,是 `03-migration-checklist.md` 的核心输入: **编译断点(按缺失成员、宏与签名定位)** | # | 断点 | 详见 | |---|---|---| | C1 | printer knobs 宽度字段(`name_width` 等)与 `uvm_printer_knobs` 类型名删除 | 第 2 章 | | C2 | `uvm_transaction::begin_event/end_event` 字段删除,改 `get_event_pool().get("end")` | 第 1 章 | | C3 | `uvm_component::kill/do_kill_all/stop_phase/enable_stop_interrupt` 与 stop 机制删除 | 第 1、3 章 | | C4 | `uvm_event::add_callback/delete_callback` 删除,改 `uvm_callbacks#(...)::add/delete` | 第 3 章 | | C5 | 15 个 `uvm_do_*` 宏移入 deprecated(`uvm_do_with`/`uvm_do_on*` 等),需 `+define+UVM_ENABLE_DEPRECATED_API` 或改写 | 第 6、9 章 | | C6 | 旧 constructor 兼容宏不再支持;无参注册类须结合 1.2 构建条件判断 | M09-003 | | C7 | `uvm_resource#(T)::set()/set_override()/get_by_*` 删除,改走 `uvm_resource_pool`/`uvm_resource_db` | 第 5 章 | | C8 | sequence_base 新增抽象限制,直接 new 报错;uvm_sequence 在 1.2 已抽象 | M06-004 | | C9 | map 查询删除 caller 参数,显式实参与 override 均需同步 | M07-002 | | C10 | 全局 `set_config_*/set_global_timeout/uvm_test_done`、server `process_report/compose_message`、`get_report_server` 等 deprecated API 删除 | 第 4 章 | | C11 | 手写 override `__m_uvm_field_automation` 的代码失效(钩子改 `do_execute_op(uvm_field_op)`) | 第 1、9 章 | | C12 | 自定义 `uvm_factory` 子类须补 4 个 pure virtual(is_type_registered 等) | 第 1 章 | | C13 | 旧数字后缀打印宏删除;同名宏还须检查 S16 | M02-004 / M09-009 | | C14 | user_priority_arbitration 的旧 integer 返回值与队列签名在目标 VCS 编译失败 | M06-007 | | C15 | port查询输出容器从组件改为port句柄 | M08-011 | | C16 | 特化资源静态查询删除 | M05-011 | **静默与数据风险(编译通过仍需验证)** | # | 风险表现 | 详见 | |---|---|---| | S1 | 旧 `default_sequence` 字符串 config / `count` / `add_sequence()` 机制删除,**激励静默不发** | 第 6 章 | | S2 | `uvm_test_done_objection::get().raise_objection()` 编译通过但不再门控 run phase | 第 3 章 | | S3 | field FLAG 未显式启用所需操作时可能漏操作,包括部分正向位;扫描规则与 NO_FLAG 提示不能完整发现,可用 legacy field 开关过渡 | M09-002 | | S4 | `ifdef UVM_VERSION_1_2` 静默走 else 分支(宏已删除,不报错) | 第 4、9 章 | | S5(兼容性提示) | 默认 coreservice 仍读写 `uvm_resource_base::default_precedence`;旧字段有效,扫描器降为提示 | 第 5 章 M05-004 | | S6 | packer 位流变化;compat 仅部分覆盖,嵌套对象与 GP 必须逐位验收 | M02-001 / M08-003 | | S7 | NO_ACTION 消息在宏入口短路,catcher 可见性变化;直调函数另行区分 | M04-001 | | S8 | comparer:`show_max==0` 语义反转(0=不限量);类型判据改为 wrapper,可能新增不匹配或漏掉类型名差异 | 第 2 章 | | S9 | `uvm_tlm_fifo::flush()` 不再广播;本机 VCS 放入两项后 flush 残留一项 | 第 8 章 M08-001 | | S10(调试输出) | `+UVM_STACKTRACE` 保留解析但不再输出报告调用栈;不计入静默/数据风险 | M04-019 | | S11 | resource_db::get_by_name 在多资源不同优先级时可能选中较低者 | 第 5 章 M05-010 | | S12 | GP extension 集合和后续 extension 可能漏检 | M08-002 | | S13 | 大端 reg map 对整宽 reg_data 反转;有效总线宽度小于 reg_data 整宽时,包含单拍 32 位寄存器/总线也可能数据归零而 status 成功 | M07-020 | | S14 | 字段写退化成整寄存器写,可能覆盖相邻硬件更新值 | M07-021 | | S15 | resource 单侧 override 掩码变为双侧,入池前 precedence 被重置 | M05-004 / M05-005 | | S16 | 旧两参 uvm_print_int 把 radix 当 SIZE | M02-004 / M09-009 | | S17 | 响应队列溢出默认不报错 | M06-008 | | S18 | 宽命令行int配置截断 | M04-018 | | S19 | push第二笔请求未消费,重复发送或报错 | M06-019 | | S20 | library动态缩小max后返回越界索引 | M06-017 | | S21 | regex/glob共用缓存键,匹配依赖调用顺序 | M10-006 | | S22 | backdoor codec修改副本未写回 | M07-023 | | S23 | 全局与实例catcher混用可能重复调用 | M01-016 | | S24 | predictor未聚合后续拍错误 | M07-024 | **新增诊断(包含 warning、error 和 fatal,不能统一当作告警)** - `DRVCONNECT`:driver 的 seq_item_port 未连接即告警(第 10 章),VCS 内置 README 官方建议按需 `set_report_severity_id_action(UVM_WARNING,"DRVCONNECT",UVM_NO_ACTION)` 屏蔽。 - `UVM/PRINT/NO_FLUSH`、`UVM/COMPARER/INT/BAD_SIZE`、`UVM/FIELDS/NO_FLAG`、`PH_BAD_ADD`(原 `PH_ADD_PHASE` 更名)、`UVM/ROOT/MULTI` 等(各章详见)。 ## 4. compat 兼容层覆盖总表 compat 包需显式编译,按命中项使用;deprecated 宏和主库兼容成员是另外两种机制。 | 断裂点 | compat 设施 | 用法 | |---|---|---| | packer 位流/旧 API | uvm_compat_packer,部分覆盖 | 显式传入或设为默认;复杂格式还需 do_pack/do_unpack 与 golden 验收 | | sequence_base 直接构造 | uvm_compat_proxy_sequence#(REQ,RSP) | 已验证具体 proxy 构造;一般优先使用业务具体 sequence | | `unpack_string(int)` 改名(第 2 章) | 宏 `` `uvm_unpack_string_with_size`` | 跨版本通用代码用 | **不在 compat/ 覆盖内、但库内自带兼容的**(迁移动作中标注"库内 @uvm-compat"):`uvm_path_e` typedef、`do_not_randomize`、`starting_phase`、`response_queue_error_report_disabled` 反向 API、`uvm_comparer`/`uvm_recorder` 的旧公开字段、`knobs` 成员本体、`uvm_test_done_objection` 空壳等。 **deprecated/ 目录**(`+define+UVM_ENABLE_DEPRECATED_API` 门控):15 个 `uvm_do_*` 宏、`UVM_SEQ_ARB_TYPE` typedef 等——迁移第一阶段按旧 API 命中情况启用。 纯新增 API 可按需要采用;删除成员按命中处理,主库保留且行为符合需要的成员可继续使用,无需仅为改名替换。各条目的兼容说明给出恢复范围及仍需验证的部分。 --- # 分章差异明细 ## 第 1 章 对象模型核心(object / component / root / coreservice / factory / registry / transaction) > 覆盖类:uvm_object / uvm_component / uvm_root / uvm_coreservice_t / uvm_factory / uvm_registry / uvm_transaction / uvm_copier(新增) / uvm_policy(新增) / uvm_field_op(新增)。 > 对比基准:1.2 侧 `src/vcs-uvm-1.2/base/`,2.0 侧 `src/vcs-uvm-ieee-2020-2.0/base/`。 ### 概览 常规 object/factory 用户先核对 transaction 事件、copy(null) 和按名覆盖的报错时机。使用 field 宏的代码另查字段宏与版本适配主题。自定义 factory、coreservice 和手写 automation 仅在直接依赖 UVM 内部接口的代码路径适用;compat 包不恢复旧内部操作分派。 ### 建议阅读顺序 先看 transaction 事件、对象拷贝与工厂覆盖。自定义 factory 见 M01-004;手写 automation 见 M01-003。 M01-001 → M01-005 → M01-010 目标库的 copy、compare、print 等入口经 policy 分派到字段宏和 do_* 钩子。仅使用公开入口时无需接管分派;依赖旧内部钩子时按直接依赖 UVM 内部接口的代码条目处理。 ### 差异条目 #### uvm_transaction::begin_event/end_event 字段删除,events 池改为 local - **页面标题**:事务开始/结束事件改用 get_event_pool() - **内容类型**:用户接口与行为 - **验证方法**:编译全部访问点;用实际 begin_tr/end_tr 触发事件,确认原等待方能在同一事务边界恢复,避免只验证句柄非空。 - **适用条件**:直接访问 transaction 的 events、begin_event 或 end_event 字段。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API / 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_transaction.svh:409`(`const uvm_event_pool events`)、`:422`(begin_event)、`:443`(end_event) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_transaction.svh:433`(`const local uvm_event_pool events`)、`:358`/`:508`(新增 `get_event_pool()`) - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 事件池从公开字段改为通过方法取得 | `events` 是公开字段:`src/vcs-uvm-1.2/base/uvm_transaction.svh:409-409`。 | `events` 改为 local:`src/vcs-uvm-ieee-2020-2.0/base/uvm_transaction.svh:433-433`;`get_event_pool()` 返回同一个池:`src/vcs-uvm-ieee-2020-2.0/base/uvm_transaction.svh:508-510`。 | | begin/end 事件仍可按池中的键取得 | 原公开句柄由池中的 begin/end 事件赋值:`src/vcs-uvm-1.2/base/uvm_transaction.svh:487-488`。 | 目标在触发时从池中取得事件。begin 分支:`src/vcs-uvm-ieee-2020-2.0/base/uvm_transaction.svh:762-766`;end 分支:`src/vcs-uvm-ieee-2020-2.0/base/uvm_transaction.svh:793-797`。这说明改用池访问后仍能等待相应事件;字段删除范围见完整引用。 | - **差异说明**:1.2 中 `events`、`begin_event`、`end_event` 均为公开字段,driver/sequence 常写 `item.end_event.wait_on()`。2.0 中 `events` 变为 `local`,两个事件句柄字段删除,事件仍按 "begin"/"end" 键在池中触发(`uvm_transaction.svh:764`/`:795`),只能通过新 API `get_event_pool()` 访问。 - **迁移动作**:`item.begin_event` → `item.get_event_pool().get("begin")`;`item.end_event` 同理。 - **兼容说明**:旧 begin_event/end_event 字段不再提供;使用主库 event pool 获取事件,并验证触发与等待时机。 - **标准依据**:IEEE 1800.2-2020 §5.4.2.4(begin_tr 触发 event pool 中 "begin" 事件)、§5.4.2.13(get_event_pool) ##### 修改前后 `tr` 为已有的 `uvm_transaction` 或派生对象。只修改获取事件的方式,保留后续等待逻辑: ```systemverilog // UVM 1.2 uvm_event finished = tr.end_event; // UVM 2.0 uvm_event finished = tr.get_event_pool().get("end"); ``` 开始事件同理,将 `tr.begin_event` 改为 `tr.get_event_pool().get("begin")`。两段是替换关系,不要在同一作用域重复声明。触发仍由事务的 `begin_tr/end_tr` 流程负责。 #### uvm_component 废弃方法删除(kill / do_kill_all / stop / stop_phase / status / enable_stop_interrupt) - **页面标题**:component kill/status 删除与进程收尾 - **内容类型**:用户接口与行为 - **阅读主题**:03 - **验证方法**:分别执行正常收尾和主动停止,确认激励终止、scoreboard 排空、objection 成对释放;停止请求不能跳过必须完成的检查。 - **影响类型**:编译断点 - **一句话结论**:旧 component kill/stop 接口需重建结束控制,用 phase、objection 或受控进程管理表达原意。 - **适用条件**:命中的是 uvm_component 的旧方法时才适用;sequence.kill 和同名用户方法不能机械替换。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API(1.2 中为 deprecated,2.0 彻底移除) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_component.svh:706`(status)、`:714`(kill)、`:723`(do_kill_all)、`:744`(stop_phase)、`:761`(enable_stop_interrupt),实现位于 `:2617` 起(`ifndef UVM_NO_DEPRECATED` 内) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_component.svh` 全文已无这些符号;`src/vcs-uvm-ieee-2020-2.0/deprecated/` 仅存宏兼容层,不含这些方法 - **差异说明**:component 的 kill/do_kill_all/status 被删除,直接引用会编译失败。确需停止用户进程时,必须处理它持有的事务、锁与资源;不能把 sequence.kill 或同名业务方法一并替换。stop/stop_phase/enable_stop_interrupt 以及 root/test_done 的停止流程统一见 M03-002。 - **迁移动作**:先按接收者类型确认旧 component 接口;正常收尾改用显式完成握手与成对 objection。复位重启等确需跳转的流程按 M03-002 / M03-009 设计目标 phase,并自行处理事务、锁和检查器状态。仅对用户自己管理的进程使用 `process::kill`,同时释放相关资源。 - **兼容说明**:旧 component kill/stop 流程无兼容恢复;收尾、objection 和进程资源须按原业务意图重建。 #### `__m_uvm_field_automation` 签名变更 + `__m_uvm_status_container` 删除 - **内容类型**:内部实现 - **阅读主题**:09 - **验证方法**:在迁移后的 do_* 或 do_execute_op 中计数;执行 copy/compare/print/pack,注入字段差异并检查对应钩子确实运行、compare 返回不等。 - **适用条件**:手写旧 automation override,或读写旧 status container;只改签名不能恢复操作调用。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:主库保留 - **类型**:签名变更 / 删除 API(内部钩子,但有用户手写) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_object.svh:804`(`__m_uvm_status_container`)、`:807`(声明,`int what__`)、`:1172`(实现) ;补充:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:153` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:744`(声明,`uvm_field_flag_t what__`)、`:1010`(实现);status container 已不存在 ;补充:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:177` - **差异说明**:`__m_uvm_field_automation` 并未从类中删除,2.0 保留了第二参为 `uvm_field_flag_t` 的空实现;字段操作主路径已改为 `do_execute_op()`。旧手写 override 可能因签名不匹配报错,即使同步签名也不能恢复操作分派。应区分“兼容空钩子仍存在但不再由标准操作调用”与“status container 被删除”;后者的直接引用才是符号缺失的编译断点。 utils_begin/end 宏生成的函数也由 __m_uvm_field_automation 改为 do_execute_op(uvm_field_op op),并用局部 __m_uvm_execute_field_op 分派 COPY/COMPARE/PRINT/RECORD/PACK/UNPACK/SET 等操作。旧内部辅助宏 m_uvm_print_int / m_uvm_record_* 同步退出旧分派路径;手写这些宏的代码改用对应 policy API。只使用 field 宏的代码无需手写分派函数,但仍须按 M09-002 核对 FLAG。 - **迁移动作**:手写 automation 改为对应 do_copy/do_compare/do_print/do_pack/do_record,或在确需统一操作分派时 override do_execute_op(uvm_field_op op)(M01-011);不再读写旧 status container,改用对应 comparer/printer 等策略对象的接口与结果。只改旧钩子签名不能恢复操作调用。 - **兼容说明**:主库保留旧 automation 钩子的空实现,但不会恢复旧字段操作分派;status container 引用仍需改写。 - **标准依据**:IEEE 1800.2-2020 §5.3.13(do_execute_op)、§5.7(uvm_field_op) #### uvm_factory 抽象类新增 pure virtual:自定义 factory 子类必须补实现 - **页面标题**:自定义 factory 子类需要补充虚方法 - **内容类型**:用户接口与行为 - **验证方法**:编译派生工厂,按 type/name 和实例 override 各创建对象,断言实际类型;采用 alias 时验证别名和未注册名称处理。 - **适用条件**:直接 extends uvm_factory 并实现自定义工厂;继承默认工厂的代码先核对已有实现。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:新增 API(对 uvm_factory 子类为强制性签名变更) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_factory.svh:118` 起(pure virtual 列表,无这些成员) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_factory.svh:230`(`is_type_name_registered`)、`:237`(`is_type_registered`)、`:287`(`set_type_alias`)、`:296`(`set_inst_alias`);另新增静态 `uvm_factory::set(uvm_factory f)`(`:96`) - **差异说明**:`is_type_name_registered` / `is_type_registered` / `set_type_alias` / `set_inst_alias` 在 uvm_factory 基类上为 **pure virtual**,直接 extends uvm_factory 的自定义 factory 在 2.0 下编译报错,必须实现这 4 个方法。新能力:类型别名(把未注册字符串映射到已注册类型)与按实例别名。 - **迁移动作**:直接继承 uvm_factory 时补 is_type_name_registered、is_type_registered、set_type_alias 和 set_inst_alias;四个方法必须使用同一注册/别名状态。能沿用默认工厂算法时,可继承 uvm_default_factory 并保留业务 override,具体签名与选择条件见下方代码。 - **兼容说明**:兼容开关不会补齐自定义 factory 的纯虚方法;派生实现仍须完整且共享同一注册状态。 - **标准依据**:IEEE 1800.2-2020 §8.3.1.7.3 / §8.3.1.7.4 ##### 修改前后 保留自定义工厂算法时,在已有 `extends uvm_factory` 的类中补齐下面四个方法。若原实现统一委托给同一个 `uvm_default_factory delegate`,可以继续转发到该对象: ```systemverilog virtual function bit is_type_name_registered(string type_name); return delegate.is_type_name_registered(type_name); endfunction virtual function bit is_type_registered(uvm_object_wrapper obj); return delegate.is_type_registered(obj); endfunction virtual function void set_type_alias(string alias_type_name, uvm_object_wrapper original_type); delegate.set_type_alias(alias_type_name, original_type); endfunction virtual function void set_inst_alias(string alias_type_name, uvm_object_wrapper original_type, string full_inst_path); delegate.set_inst_alias(alias_type_name, original_type, full_inst_path); endfunction ``` 这里的 `delegate` 必须也是原 register、override、create 等方法使用的对象;不要单独新建一个空工厂来处理这四个接口。自行维护注册表的实现,应将查询及别名解析接入自己的同一份状态,不能用空函数或固定返回值绕过抽象方法检查。 如果原需求允许沿用默认工厂算法,可将基类从 `uvm_factory` 改为 `uvm_default_factory`,保留业务需要的 override;该方式沿用默认实现,不要求再写上述四个转发方法。已有 C12 编译实验覆盖了这条路径。 安装实例使用 `uvm_factory::set(custom_factory)`。应在业务注册/创建之前统一安排;替换工厂不会自动迁移旧实例中的 override 与别名。 #### uvm_object::copy 增加 copier 参数;null 拷贝由 warning 升级为 error - **页面标题**:copy(null) 现在计为错误;普通 copy 调用可保留 - **内容类型**:用户接口与行为 - **验证方法**:分别复制有效对象和 null;检查字段、嵌套对象身份和错误计数。null 路径应产生目标 OBJ/COPY 错误,不能被成功计数掩盖。 - **适用条件**:可能传入 null 的 copy,或使用自定义 copier/递归策略。 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:签名变更 / 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_object.svh:458`(声明 `copy(uvm_object rhs)`)、`:1044`(实现,null rhs 报 `NULLCP` warning 后忽略) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:454`(声明 `copy(uvm_object rhs, uvm_copier copier=null)`)、`:953`(实现,null rhs 报 `uvm_error OBJ/COPY`) - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | copy(null) 从 warning 变为 error,两版均提前返回 | null 分支发出 `NULLCP` warning 后返回:`src/vcs-uvm-1.2/base/uvm_object.svh:1063-1066`。 | 对应分支发出 `OBJ/COPY` error 后返回:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:957-960`。变化会影响错误计数;不能仅凭调用能编译判断行为不变。 | | 普通 copy(rhs) 调用仍可保留 | 旧声明只有 rhs 参数:`src/vcs-uvm-1.2/base/uvm_object.svh:458-458`。 | 新声明的 copier 参数默认是 null:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:454-454`。省略参数时,从 coreservice 取得默认 copier 并分派复制:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:962-973`。 | - **差异说明**:拷贝改由 uvm_copier 策略执行(`m_copier.copy_object(this,rhs)`),1.2 的 `uvm_global_copy_map` 循环引用防护由 copier 内部接管;递归策略(UVM_DEEP/SHALLOW/REFERENCE)由 copier 的 `set_recursion_policy` 控制。默认 copier 来自 `uvm_coreservice_t::get_default_copier()`。旧调用 `obj.copy(rhs)` 源码兼容(新参数有默认值),但 null rhs 现在计为 UVM_ERROR,可能影响 error 计数/门禁脚本。 - **迁移动作**:排查回归中对 `copy(null)` 的依赖;需要浅拷贝/引用拷贝语义的用 `uvm_copier::set_recursion_policy`。 - **兼容说明**:兼容措施不恢复 copy(null) 的旧诊断;保留有效对象拷贝,并明确空对象处理与递归策略。 - **标准依据**:IEEE 1800.2-2020 §5.3.8.1(copy)、§16.6(uvm_copier) ##### 修改前后 已有的 `dst.copy(src)` 可继续使用。如果 `src` 在业务上允许为空,明确处理这个分支: ```systemverilog if (src != null) dst.copy(src); ``` 这里只适用于“空源表示本次不更新”。若源对象本应存在,应修复对象创建或传递流程,不能加判空来掩盖缺失事务。 #### uvm_registry 重写:type_name 变静态函数、注册延迟到 uvm_init、新增抽象 registry - **页面标题**:registry 延迟注册与初始化实现 - **内容类型**:内部实现 - **验证方法**:初始化后查询注册项并 create 具体对象;对抽象类型提供具体 override,检查返回非空和实际类型。类型名读取的编译验证见 M09-006。 - **适用条件**:直接依赖 registry 的静态注册时机,或自行绕过标准初始化入口。普通 type_id::create/type_name 读取可保留;公开 coreservice 的替换要求见 M01-014,类型名变量用法见 M09-006,新增抽象注册能力见 M09-012。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:内部重构(含行为变化)/ 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_registry.svh:71`(`const static string type_name = Tname;`,uvm_object_registry 同见于 `:213`),`get()` 在静态初始化即向 factory 注册 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_registry.svh:68`(`static function string type_name()`)、`:290`(uvm_abstract_component_registry)、`:411`(uvm_abstract_object_registry)、`:155`(`set_type_alias`) - **差异说明**:2.0 通过 `uvm_deferred_init` 队列在 `uvm_init()` 中注册(`base/uvm_globals.svh:422`),而 coreservice 首次 `get()` 会自动触发初始化,不能据此断言普通 `factory.print()` 会看不到注册项。自定义 coreservice/静态初始化代码仍需核对调用顺序。新增 `uvm_abstract_component_registry`/`uvm_abstract_object_registry` 支持抽象类注册;未 override 而创建时报 `UVM/ABST_RGTRY/CREATE_ABSTRACT_*`,这与直接 new 抽象类的编译失败不同。新增 `type_id::set_type_alias("别名")`。 registry.type_name 的成员形态变化统一见 M09-006。 - **迁移动作**:普通 type_name 读取与 type_id::create 可保留;自定义初始化不要绕过 uvm_init 的 deferred 注册。若通过抽象 registry 创建对象,先设置具体派生类 override,再检查返回非空和实际类型;整体替换 coreservice 的时机按 M01-014 核对。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### apply_config_settings 引入模式系统;VCS 1.2 的 disable_apply_cfg_settings 消失 - **页面标题**:禁用自动字段配置:旧开关改为组件方法 - **内容类型**:用户接口与行为 - **阅读主题**:05 - **验证方法**:对同一字段设置非默认配置,分别开启/关闭 use_automatic_config,断言 build 后实际字段值;未注册字段不能因 CONFIG_STRICT 就预期自动赋值。 - **适用条件**:依赖 disable_apply_cfg_settings、旧禁止自动配置开关,或定制字段自动赋值。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化 / 新增 API / 删除 Synopsys 扩展 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_component.svh:3527`(apply_config_settings);`src/vcs-uvm-1.2/base/uvm_root.svh:272-276`(`disable_apply_cfg_settings`,由 `+define+UVM_DISABLE_APPLY_CFG_SETTINGS` 或 `+UVM_DISABLE_APPLY_CFG_SETTINGS` plusarg 控制) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_component.svh:1561-1580`(`config_mode_e`:CONFIG_STRICT/CONFIG_HIGHEST_PRECEDENCE/CONFIG_CHECK_NAMES,默认 CONFIG_CHECK_NAMES)、`:1589`/`:3382`(`apply_config_settings_mode()`)、`:917`/`:3388`(`use_automatic_config()`,默认返回 1)、`:3930-3931`(build() 内自动调用);默认宏 `src/vcs-uvm-ieee-2020-2.0/macros/uvm_global_defines.svh:42` - **差异说明**:自动配置仍默认开启,改由 set_local(resource) 和 UVM_SET 操作赋值。默认 CONFIG_CHECK_NAMES 先通过 UVM_CHECK_FIELDS 枚举字段名再查询资源;CONFIG_STRICT 扩大查询范围,仍需字段操作完成赋值,不会发现任意未注册 SV 成员。VCS 1.2 的 disable_apply_cfg_settings 及对应 plusarg 被删除,目标版可在用户组件基类 override use_automatic_config 返回 0。 - **迁移动作**:检索 `disable_apply_cfg_settings`/`UVM_DISABLE_APPLY_CFG_SETTINGS` 使用点并改 override;如脚本依赖 `+UVM_DISABLE_APPLY_CFG_SETTINGS` 需删除。 - **兼容说明**:旧自动配置开关不再生效;用 use_automatic_config 控制,并验证字段赋值。 - **标准依据**:IEEE 1800.2-2020 §13.1.5.1(apply_config_settings)、§13.1.5.2(use_automatic_config) ##### 修改前后 旧构建依赖 `+UVM_DISABLE_APPLY_CFG_SETTINGS` 时,目标库不会再按这个参数关闭自动字段赋值。在需要禁用的用户组件基类中加入: ```systemverilog virtual function bit use_automatic_config(); return 0; endfunction ``` 随后删除无效旧参数。此方法只影响继承该基类的组件;第三方 VIP 和其他基类需分别核对。显式 `uvm_config_db::get()` 仍可用于读取配置。 #### uvm_root::run_test / die / uvm_top 机制变化;新增 uvm_run_test_callback - **页面标题**:run_test、pre_abort 与命令行配置的执行顺序 - **内容类型**:用户接口与行为 - **验证方法**:记录 phase 和 callback 顺序;核对目标组件实际 verbosity/action/severity。即使没有未命中参数警告,也要直接检查配置结果。 - **适用条件**:自定义 run_test/pre_abort 流程,或依赖 +uvm_set_* 参数和 root 全局状态。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:内部重构(含行为变化)/ 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_root.svh:415`(run_test,`uvm_phase::m_run_phases()` + `wait(m_phase_all_done)`)、`:132`(die)、`:328`(`const uvm_root uvm_top`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh:484`/`:585-588`(run_test 改经 `uvm_phase_hopper::run_phases()`,含 `uvm_run_test_callback::m_do_pre_run_test()`/`:596` post 钩子与 core-state 推进)、`:150`(die 增加 PRE_ABORT 防重入与 `m_do_cmdline_checks()`)、`:357`(`uvm_top` 不再 const,覆写会触发 `UVM/BAD_TOP` fatal)、`:814`(新 `+UVM_DUMP_REPORT_ARGS` 报告参数汇总)、`:1112`(新 `+uvm_set_config_bitstream` plusarg) - **差异说明**:run_test 改经 hopper,基本 phase 顺序已有 L2 对照;新增 run_test 前后及 pre_abort callback。die 增加防重入,结束时 m_do_cmdline_checks 调用的是 set_verbosity::check,不能声称所有未命中 action/severity 参数都会告警;+UVM_DUMP_REPORT_ARGS 可输出相关配置。重复构造 root 报 UVM/ROOT/MULTI,覆盖 uvm_top 后在 getter 检查时报 UVM/BAD_TOP。finish_on_completion 和 enable_print_topology 增加访问器。 - **迁移动作**:删除或修正启动日志指出的无效 +uvm_set_* 配置,逐项确认目标组件和读回值。旧 pre_abort 中必须执行的诊断保留在该钩子内,并检查子组件与父组件的调用顺序;需要围绕 run_test 添加处理时,使用 uvm_run_test_callback 的 pre_run_test/post_run_test,不能以 post_run_test 单独判定业务成功。 - **兼容说明**:兼容措施不恢复旧启动与退出顺序;保留必要诊断并验证配置结果、回调次序和业务完成。 #### print/sprint/record/compare 全面委托策略类 - **页面标题**:自定义打印、比较与录制:检查策略状态和输出 - **内容类型**:用户接口与行为 - **验证方法**:连续操作两个对象,检查状态没有串扰;同时比较返回值、输出内容和记录次数。不要把 recorder 当成与 sprint 相同的自动 flush 契约。 - **适用条件**:自定义 printer/comparer/recorder,或将打印和比较日志作为 golden。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化(输出时机/报错路径) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_object.svh:913`(print 对 `uvm_default_printer==null` 报 `NULLPRINTER` error,经 `printer.knobs.mcd` 输出)、`:1120`(compare 内直接报 `MISCMP` info)、`:1350`(record 内经 `__m_uvm_field_automation(UVM_RECORD)` 驱动) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:873-874`(`uvm_printer::get_default()` + `printer.get_file()`,NULLPRINTER 检查移除)、`:884`(sprint 顶层先 `printer.flush()`)、`:992`(compare 委托 `comparer.compare_object()`,缺省 comparer 改由 `uvm_comparer::get_default()`)、`:1178`(record 委托 `recorder.record_object(get_name(), this)`) - **差异说明**:操作改由对应 policy 驱动;`sprint`、`compare`、`copy` 在 active depth 为 0 时执行各自 flush,不能推广为所有 recorder 调用均自动清理。自定义 policy 要核对新调用契约。默认策略建议经 `set_default/get_default` 访问;默认 printer 仍为 table printer,但内部行模型与格式生成已重写,文本黄金文件必须重新对照,不能假定输出逐字相同。 - **迁移动作**:保留业务 do_print/do_compare/do_record 钩子;其中调用的 printer/comparer/recorder API 分别按 M02-003 / M02-005 / M02-007 / M02-012 改写。每次独立对象操作核对策略状态,消息过滤按实际 comparer 发出的 MISCMP 路径配置;用返回值、输出内容和字段调用次数验证,不能只按日志数量判定成功。 - **兼容说明**:业务 do_* 钩子可保留,其策略状态和报告行为仍按目标接口核对;packer 的部分兼容见 M02-001。 #### 工厂 name 覆盖延迟解析:TYPNTF 由 set 时推迟到 create 时 - **内容类型**:用户接口与行为 - **验证方法**:用正确名称和故意拼错的名称各 create 一次;正确项产生目标类型,错误项在 create/解析时可被回归诊断捕获。 - **适用条件**:通过字符串设置尚未注册类型的 factory override。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_factory.svh:1014`(`set_type_override_by_name` 时 override 类型未注册即报 `TYPNTF` error)、`:1143`(inst override 同) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_factory.svh:1648`/`:1768`(`find_override_by_*` 解析时才报 `TYPNTF`,set 时不再校验) - **差异说明**:2.0 允许用尚未注册的类型名设置 override(配合 set_type_alias/set_inst_alias 先设 override 后注册类型)。正向收益是放宽顺序依赖;副作用是 override 类型名拼写错误不再在 set 时报错,而是延迟到首次 create 时才暴露。 - **迁移动作**:保留已注册类型的按名 override;在建立 override 后实际执行一次 create,并检查返回非空及派生类型。若出现 TYPNTF,修正类型名或注册位置,不要仅因 set_override 没报错而忽略创建失败。 - **兼容说明**:兼容措施不恢复 set 时的旧名称诊断;按名 override 必须通过实际 create 检查。 #### 新增 uvm_policy / uvm_copier / uvm_field_op 与 do_execute_op / set_local 钩子 - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无对应(1.2 `uvm_object.svh:565` 仅有 pack/pack_bytes/pack_ints) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_policy.svh:31`(uvm_policy:extension 机制、active object 栈)、`base/uvm_copier.svh:40`(uvm_copier:`copy_object` `:76`、`set_recursion_policy` `:127`)、`base/uvm_field_op.svh:30`(uvm_field_op:`set()` `:57`)、`base/uvm_object.svh:718`(`do_execute_op`)、`:723`(`set_local`)、`:571`/`:668`(新增 `pack_longints`/`unpack_longints`)、`base/uvm_component.svh:1553`(组件级 `do_execute_op`,UVM_PRINT 时按 print_enabled 打印子组件) - **差异说明**:纯新增能力:uvm_policy 为所有策略类基类(扩展挂接 set_extension/get_extension);uvm_field_op 描述字段操作并由 `do_execute_op` 分发——**自定义字段自动化行为应 override `do_execute_op` 而非旧钩子**;pack/unpack 新增 longint 流变体。`set_int_local/set_string_local/set_object_local` 保留但改经 uvm_field_op 实现。 - **迁移动作**:无(存量代码可不动);新代码建议直接使用新钩子。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §16.1(uvm_policy)、§16.6(uvm_copier)、§5.7(uvm_field_op)、§13.1.2.3(组件 do_execute_op)、§5.3.11.1(unpack_longints) #### uvm_transaction::begin_tr 增加 parent_handle;返回类型 integer→int - **页面标题**:transaction 开始录制与组件回调的参数变化 - **内容类型**:用户接口与行为 - **验证方法**:编译所有 override;记录一组父子事务,检查父句柄和后处理中的链接关系,不只检查 integer/int 位宽。 - **适用条件**:重写 transaction/组件录制虚方法,或依赖父子 transaction 链接。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:签名变更(源码兼容) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_transaction.svh:204`(`function integer begin_tr(time begin_time=0)`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_transaction.svh:213`(`function int begin_tr(time begin_time=0, int parent_handle=0)`);组件侧 `uvm_component::begin_tr/begin_child_tr/record_*` 同步 integer→int(`uvm_component.svh:1422` 等) - **差异说明**:begin_tr 可直接挂父句柄;相应地 `uvm_component::m_begin_tr` 中父子链接由 `tr.begin_child_tr(...)` 改为 `tr.begin_tr(..., parent_handle)`(1.2 `src/vcs-uvm-1.2/base/uvm_component.svh:2951` → 2.0 `src/vcs-uvm-ieee-2020-2.0/base/uvm_component.svh:2980`)。integer 与 int 同为 32 位有符号四态;普通句柄赋值不受位宽影响,但不能据此保证虚方法 override 或队列实参类型检查通过,见 M06-007。 - **迁移动作**:transaction 普通 begin_tr(begin_time) 调用可保留;需要父子链接时目标可调用 tr.begin_tr(begin_time, parent_handle)。该 transaction 方法本身非 virtual,业务开始钩子使用 virtual protected function void do_begin_tr();组件侧的 do_begin_tr(uvm_transaction tr, string stream_name, int tr_handle) override 应将旧 integer 句柄形参同步为 int,并保留 super 调用。普通句柄变量无需扩大到 64 位。 - **兼容说明**:普通 begin_tr(begin_time) 调用可保留;组件 do_begin_tr override 仍须同步目标签名并核对父子记录。 #### use_uvm_seeding 静态变量 → get/set_uvm_seeding() - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:主库保留 - **类型**:新增 API(旧变量保留) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_object.svh:87`(`static bit use_uvm_seeding = 1;`)、`:836`(reseed 直接读该变量) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:65-66`(变量保留,标 `@uvm-compat`)、`:71`/`:76`(新增 `get_uvm_seeding()`/`set_uvm_seeding(bit)`,经 coreservice 转发)、`:804`(reseed 改读 get_uvm_seeding()) - **差异说明**:新旧接口读写同一变量(`uvm_default_coreservice_t::get_uvm_seeding()` 直接返回 `uvm_object::use_uvm_seeding`,`uvm_coreservice.svh:367-371`),**旧代码 `uvm_object::use_uvm_seeding = 0;` 在 2.0 仍然生效**;新写法是标准推荐形式。 - **迁移动作**:建议统一改为 `uvm_object::set_uvm_seeding(0)`;不强制。 - **兼容说明**:主库保留 use_uvm_seeding 字段,普通读写无需开启宏或编译 compat 包;改用访问器后仍需检查对象随机种子。 - **标准依据**:IEEE 1800.2-2020 §5.3.3.1 / §5.3.3.2 #### uvm_coreservice_t 扩展:缺省 policy 访问器、资源池、phase hopper、::set() - **页面标题**:自定义 coreservice:新增虚方法与初始化时机 - **内容类型**:用户接口与行为 - **验证方法**:在真实录制配置下断言 get 返回自定义 service,并检查自定义资源池/policy 生效;关闭 Verdi 的探针对照不能代替实际集成验证。 - **影响类型**:编译断点、静默/数据风险 - **一句话结论**:自定义 coreservice 必须匹配目标接口,并在库实际初始化之前安装;用户 initial 的第一行不保证足够早。 - **适用条件**:自行派生或整体替换 coreservice 的环境需检查初始化顺序;普通服务调用按实际依赖核对。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_coreservice.svh:31-35`(`UVM_CORESERVICE_TYPE` 宏选择实现类)、`:93`(inst 直接 new) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_coreservice.svh:120`(`get_global_seed`)、`:124-127`(`set/get_default_copier`)、`:132`(`get/set_uvm_seeding`)、`:153`(`get_phase_hopper`)、`:165`(新增静态 `uvm_coreservice_t::set(cs)`)、`:158-160`(get() 空实例时先 `uvm_init(null)`) - **差异说明**:coreservice 新增策略、资源池、hopper、种子等 pure virtual 接口。`set(cs)` 只是直接替换静态句柄,不执行 deferred registry/global 初始化;不能将它当成完整初始化流程。`uvm_init(cs)` 接收自定义实例,并执行初始化;库已初始化后再传不同实例会告警且忽略(`src/vcs-uvm-ieee-2020-2.0/base/uvm_globals.svh:369`)。 - **迁移动作**:自定义 coreservice 补齐目标签名。只有库尚未初始化时,uvm_init(custom_cs) 才能安装;不能把“用户 initial 第一行”视为满足此前提。默认 VCS Verdi 集成在 `src/vcs-uvm-ieee-2020-2.0/base/uvm_globals.svh:629` / `:643` 的静态变量初始化调用 root getter,实测 initial 中安装被忽略;仅关闭 UVM_NO_VERDI_RECORD 对应集成后,本探针安装成功。关闭录制不是通用迁移要求,有 Verdi 需求时优先通过现有 coreservice 的服务访问器定制单项能力,整体替换须单独设计初始化与已有引用的迁移。 - **兼容说明**:兼容开关不恢复旧 coreservice 初始化契约;自定义服务须满足安装时机,Verdi 集成另验。 ##### 修改前后 需要保留自己的 coreservice 时,先决定是否可以继承 `uvm_default_coreservice_t` 并只覆盖业务所需服务。直接继承抽象 `uvm_coreservice_t` 的实现还须补齐下面的目标方法族;原 factory/report/root 等接口继续保留: | 服务 | 目标方法签名 | |---|---| | phase 上限 | `void set_phase_max_ready_to_end(int max)` / `int get_phase_max_ready_to_end()` | | printer | `void set_default_printer(uvm_printer printer)` / `uvm_printer get_default_printer()` | | packer | `void set_default_packer(uvm_packer packer)` / `uvm_packer get_default_packer()` | | comparer | `void set_default_comparer(uvm_comparer comparer)` / `uvm_comparer get_default_comparer()` | | copier | `void set_default_copier(uvm_copier copier)` / `uvm_copier get_default_copier()` | | 全局 seed | `int unsigned get_global_seed()` | | seeding 控制 | `void set_uvm_seeding(bit enable)` / `bit get_uvm_seeding()` | | resource pool | `void set_resource_pool(uvm_resource_pool pool)` / `uvm_resource_pool get_resource_pool()` | | 默认 precedence | `void set_resource_pool_default_precedence(int unsigned precedence)` / `int unsigned get_resource_pool_default_precedence()` | | phase hopper | `uvm_phase_hopper get_phase_hopper()` | 以上均是 function,派生类以 virtual function 实现对应返回类型及形参;getter/setter 使用同一份状态,不要返回临时新对象。目标默认实现可作为各服务的行为参照。 如果只需要替换一种策略,优先在现有 coreservice 上调用对应 setter,例如 `uvm_coreservice_t::get().set_default_comparer(cmp)`。真正安装全新实例必须满足 `uvm_init(custom_cs)` 尚未执行过初始化的前提;`uvm_coreservice_t::set(custom_cs)` 仅替换句柄,不补做 deferred 注册,也不迁移已有引用。 本机默认 Verdi 集成在用户 initial 前已触发 UVM 初始化,已有探针确认 initial 中调用 uvm_init(custom_cs) 会被忽略。关闭该集成的探针结果仅用于说明初始化时机,不是有 Verdi 需求时的通用改法。原 UVM_CORESERVICE_TYPE 选择也不能机械换成用户 initial 中的安装调用。 #### uvm_component 杂项:tr_database 访问器、print_config_matches 访问器、set/get_config_* 去废弃化等 - **页面标题**:组件配置与 transaction database 改用访问器 - **内容类型**:用户接口与行为 - **验证方法**:编译访问器改写并读回设置;记录事务后检查数据库对象身份,配置匹配和 tracing 输出按实际需要验证。 - **适用条件**:使用 m_get_tr_database、print_config_matches 或旧 component 配置接口。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:新增 API / 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_component.svh:1631`(公开 virtual 内部接口 `m_get_tr_database()`)、`:1024`(`static bit print_config_matches`)、`:3388` 等(get/set_config_* 首用报 `UVM/CFG/SET|GET/DPR` 废弃 warning)、`:3750`(print_config_settings 报废弃 warning) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_component.svh:1600`/`:1603`(公开 `get_tr_database()` + 新增 `set_tr_database(db)`)、`:965`(`get/set_print_config_matches()`,原变量保留标 `@uvm-compat for compatibility with 1800.2-2017`)、`:2655` 起(set_config_* 实现保留但**不再报废弃 warning**)、`:936`(print_config_settings 保留不再告警)、`:1672-1688`/`:3652-3671`(新增 `get/set_recording_enabled`、`set_recording_enabled_hier`,底层仍是 `recording_detail != UVM_NONE`)、`:2111`(`lookup()` 对含 `..`/`*`/`?` 的名字新增 warning 并返回 null) - **差异说明**:一批小口径调整。最需注意的是 get/set_config_* 的废弃告警消失(回归日志 diff 会变化)以及 lookup() 非法模式告警。 - **迁移动作**:将 obj.m_get_tr_database() 改为 obj.get_tr_database();派生类的 virtual function uvm_tr_database m_get_tr_database() 同步改名,方法体保留原数据库选择逻辑。通过 set_tr_database(db) 配置时检查读回对象身份。主库仍保留组件 set/get_config_*,无需因其不再报 deprecated warning 而重写调用;print_config_matches 可继续使用,或改用 get/set_print_config_matches。 - **兼容说明**:主库保留组件 set/get_config_* 和 print_config_matches,无需开关;旧 m_get_tr_database 名称未保留,调用和 override 仍须改为 get_tr_database。 #### callbacks 新增 get_all,取消同名告警与部分全局 catcher 去重 - **页面标题**:callback 注册与重复 catcher 调用次数 - **内容类型**:用户接口与行为 - **验证方法**:分别用两种注册顺序发出一条已知消息,计数每个 catcher 的调用次数;动态注册/删除流程另测,不能以 get_all 去重证明执行队列不重复。 - **影响类型**:静默/数据风险 - **一句话结论**:核对每条消息实际触发的 catcher 次数;全局与实例注册顺序可能改变重复调用行为。 - **适用条件**:同时注册全局与实例 catcher、动态增删回调或重复调用 get_all 的环境需核对。 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:新增 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_callback.svh:670,681`(对象队列合并时的 UVM_NO_GLOBAL_CATCHER_DUPL_CHK 分支) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_callback.svh:666`(队列合并)、`:926`(get_all) - **差异说明**:m_cb_find_name 及 UVM/CB/NAM/SAM 同名告警删除;同一句柄的重复注册检查仍存在,不能将同名对象等同于同一对象。新增 get_all 将选中的 callback 按实例 ID 去重后追加到调用者队列,并不先清空传入队列。原 VCS 1.2 的全局 catcher 合并去重分支删除,依赖多层注册的环境须核对实际调用次数。 - **迁移动作**:注册按句柄管理;反复 get_all 前清空输出队列。utility_probe 先注册全局 catcher 再注册实例 catcher,全局调用次数为 1 / 2,实例均为 1;先完成实例注册再添加全局 catcher,两库均各调用一次。这个顺序替代仅覆盖初始化后注册集合固定的场景;后续动态创建实例或增删 catcher 必须重新核对,不能以 get_all 的去重结果推断执行路径只调用一次(S23)。 - **兼容说明**:兼容措施不恢复 catcher 执行去重;固定注册顺序仅覆盖已验证的静态集合,动态生命周期仍需核对。 #### link 工厂显式保存调用进程的随机状态 - **内容类型**:内部实现 - **验证方法**:同一 seed 下在 link 创建前后采样随机值,与不创建 link 的对照比较;另外检查建立的父子关系。 - **适用条件**:在 sequence 等进程内创建 transaction link,并要求随机序列保持稳定。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:内部行为防护 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_links.svh:172,251,330` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_links.svh:122,199,275` - **差异说明**:parent_child / cause_effect / related 三种 get_link 在 new 前后新增 process::get_randstate/set_randstate。utility_probe 对 parent_child 的观察两版都保持随机状态,不能从新增防护代码推断本机旧版必然改变后续随机序列。 - **迁移动作**:无强制修改;同 seed 跨库逐事务一致仍须由实际激励验证。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | FGP、UVM_CREATE_OPT 与锁属性 | 1.2 的实例计数原子操作、线程 copy map、快速 create 分支在 2.0 移除 | FGP 使用条件及未确认替代见 M10-007;构造宏须结合 registry 判断,见 M09-003。 | | 自动配置和 verbosity 修复开关 | disable_apply_cfg_settings 与 plusarg 删除;UVM_APPLY_VERBOSITY_FIX 旧分支不再存在 | 自动配置改法见 M01-007;命令行 verbosity 解析背景见 M04-017。数值解析的 UVM_DO_NOT_USE_SSCANF 旧分支改为内建转换。 | | VCS 动态加载与命令行扩展 | 目标 root 保留 UVM_VCS_DECLARATIONS/DEFINITIONS、UVM_VCS_DTL 的 refresh_test、Verdi verbosity 参数校验和 MAX_QUIT_COUNT 缺省解析 | 属 VCS 集成实现;实际加载与调试参数需结合目标安装检查。目标 `src/vcs-uvm-ieee-2020-2.0/src/base/uvm_root.svh:367-379` 可定位参数校验。 | | Component Verdi 与 DTL 钩子 | 目标包含 HIER/COMPWAVE/TLM/NO_IMPLICIT_GET 解析、is_sequencer/is_driver/check_component_type、SNPS_COMP_TRACE、uvm_set_verbosity DPI、refresh_component 和 UVM_VCS_CHECK | 用于层次与事务追踪;见目标 `src/vcs-uvm-ieee-2020-2.0/src/base/uvm_component.svh:255-307`、`:894-961`。不能由主 API 保留推断全部 Verdi 集成已验收。 | | Transaction 附加录制 | 两版延续 transaction_id 与 UVM_NO_VERDI_RECORD 下的 Begin_No_Parent/Begin_End 标签 | 实际输出按录制后端核对;目标 `src/vcs-uvm-ieee-2020-2.0/src/base/uvm_transaction.svh:118-119`。 | | Object、coreservice、factory、registry、copier、policy、field_op | 目标文件与 Accellera 2.0 一致 | 无目标厂商额外改动;版本间 API/行为差异仍按本模块主条目处理。 | --- ## 第 2 章 策略与 I/O(printer / packer / comparer / recorder / tr_database / cache) ### 概览 优先核对跨版本位流和直接定制 printer/comparer 的代码。目标库重构了策略类;packer 默认布局、printer knobs 和打印宏参数均有变化。跨边界 packet 必须与旧版 golden 对照,输出格式变化按项目的日志契约验收。 ### 建议阅读顺序 先确认是否存在跨版本 packet 契约,再看自定义 comparer/printer。输出格式变化与数据协议变化应分别验收。 M02-001 → M02-005 → M02-003 → M02-004 ### 差异条目 #### uvm_packer 打包布局不兼容(big_endian/use_metadata 移除,pack_object/pack_string 恒带元数据) - **页面标题**:pack 位流格式改变:检查外部接收端与历史数据 - **内容类型**:用户接口与行为 - **验证方法**:保存 1.2 golden,逐位检查长度和第一个差异;覆盖空对象、嵌套对象和 GP。只有本版 pack/unpack 闭环通过不足以证明跨版本兼容。 - **影响类型**:编译断点、静默/数据风险 - **一句话结论**:跨版本位流必须逐位对照 1.2 golden;compat packer 只覆盖部分路径,嵌套对象和 GP 需明确格式。 - **适用条件**:packet 跨库、DPI 或外部 golden 边界传递时重点核对;同版 pack/unpack 也应覆盖实际对象图、空对象与数组。 - **处理级别**:按条件核对 - **兼容机制**:compat 包 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_packer.svh:322`(use_metadata)、`:358`(big_endian=1) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_packer.svh:49`(类定义)、实现见 `:584` 起(pack_field 等不再查 big_endian) - **差异说明**:1.2 默认 `big_endian=1`(msb 在前)、`use_metadata=0`(pack_object 不写 null 标记、pack_string 不写终止符)。2.0 移除 big_endian/use_metadata/policy 字段,固定为 lsb→msb 顺序;`pack_object` 恒写 4-bit null 标记(null→4'h0,非空→4'hF);`pack_string` 恒补 null 字节。依赖这些布局的跨版本 golden、DPI/C 数据契约和留存向量不能直接沿用;是否实际失配取决于所用入口、旧配置和字段内容,不能据此认定所有位流必然不同。 - **迁移动作**:同版 pack/unpack 仍需验证实际对象类型、空对象和数组长度;跨边界流必须与保留的 1.2 golden 逐位对照。可用 `uvm_compat_packer` 配合显式 do_pack/do_unpack 固定契约,或统一升级两端格式。不能将替换 packer 本身作为位流兼容性验收。 - **兼容说明**:显式使用兼容包提供的类或宏后生效。直接 pack_field_int / pack_string 已实测恢复旧流;但新 field_object 宏走 with_meta 路径,含嵌套对象的同一 packet 即使用 compat packer 也由 148 位变为 308 位。compat::pack_object 还在写 null 标记前先执行子对象 do_execute_op(`src/vcs-uvm-ieee-2020-2.0/compat/uvm_compat_packer.svh:412`),与 1.2 顺序不同。显式旧格式示例 `tests/uvm_review/serialization_probe.sv` 固定四位标记和字段顺序后,两版生成完全相同的 148 位流并成功回读;该例不涵盖循环引用或任意对象图。GP 新增 m_dmi 另见 M08-003。 - **标准依据**:IEEE 1800.2-2020 §16.5(标准不再定义 big_endian 旋钮,打包布局属实现细节;§16.5.3 注明 state stream 格式"未指定",仅同兼容实现间可移植) ##### 修改前后 若外部模型或保存的数据仍按 1.2 格式读取,可先在目标库中显式传入兼容 packer: ```systemverilog import uvm_compat_pkg::*; // Inside the task/function that packs the existing packet: uvm_compat_packer packer = new(); bit bits[]; int nbits; nbits = packet.pack(bits, packer); ``` 先按“版本与兼容”指南编译 `uvm_compat_pkg.sv`。`packet` 是已有事务对象;示例只展示调用点,不改变对象的 `do_pack` 实现。 把 `nbits` 和 `bits` 与保存的 1.2 输出逐位对比。**同库 pack/unpack 往返成功不能证明格式兼容**。涉及嵌套对象、空句柄或 TLM2 通用事务时,兼容 packer 仍可能与旧格式不同,应为外部接口定义固定格式。 #### uvm_packer 状态存取 API 重命名与签名变更 - **内容类型**:用户接口与行为 - **验证方法**:编译新接口调用,分别检查有效 bit 数、状态流长度和 unpack 结果;状态流中的迭代器元数据不能算作协议有效载荷。 - **适用条件**:调用旧 packer 状态存取 API,或把状态流当成有效载荷发送。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:compat 包 - **类型**:删除 API / 签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_packer.svh:380`(`get_packed_bits()` 返回 `uvm_pack_bitstream_t`)、`:386`(get_bits)、`:390`(put_bits)、`:398`(reset) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_packer.svh:103`(`get_packed_bits(ref bit unsigned stream[])` 返回 void)、`:75`(set_packed_bits)、`:134`(flush) - **差异说明**:`get_packed_bits` 同名但签名全改(返回值 → ref 数组);`get_bytes/get_ints` → `get_packed_bytes/get_packed_ints`,新增 `get_packed_longints`;`put_bits/put_bytes/put_ints` → `set_packed_bits/bytes/ints/longints`;`get_bit/get_byte/get_int`、`reset()`、`set_packed_size()`、`unpack_object_ext()`、公开字段 `count/scope/m_packed_size` 全部删除;`reset()` 由 `flush()` 取代。注意 2.0 的 get_packed_* 流内含 64-bit 迭代器元数据(`uvm_packer.svh:427`),不可与 1.2 流混用。 - **迁移动作**:把 get_bits/get_bytes/get_ints 改为 get_packed_bits/get_packed_bytes/get_packed_ints,把 put_* 改为 set_packed_*,reset() 改为 flush();同名 get_packed_bits 的返回值调用必须改为 ref 数组调用。目标状态流包含迭代器元数据,外部位流协议按 M02-001 单独迁移。 - **兼容说明**:显式使用兼容包提供的类或宏后生效。`uvm_compat_packer` 内联提供了 get_bits/get_bytes/get_ints/put_*/reset 等 1.2 API,`compat/uvm_compat_packer.svh:476-524`;但仅在使用 compat packer 时生效。 - **标准依据**:IEEE 1800.2-2020 §16.5.3(state retrieval/assignment 方法) ##### 修改前后 `p` 为正在使用的 packer。下表列出直接管理 packer 状态时的替换,保留原数组元素类型: | 旧调用 | 目标调用 | 注意事项 | |---|---|---| | `p.get_bits(bits)` | `p.get_packed_bits(bits)` | `bit unsigned bits[]`,通过 ref 参数输出 | | `p.get_bytes(bytes)` | `p.get_packed_bytes(bytes)` | 使用 byte 数组 | | `p.get_ints(words)` | `p.get_packed_ints(words)` | 使用 int 数组 | | `p.put_bits(bits)` | `p.set_packed_bits(bits)` | 装入目标 packer 状态流 | | `p.put_bytes(bytes)` / `p.put_ints(words)` | `p.set_packed_bytes(bytes)` / `p.set_packed_ints(words)` | 不能把旧有效载荷直接当成新状态流 | | `p.reset()` | `p.flush()` | 开始独立操作前清理状态 | 同名 `get_packed_bits` 的旧返回值形式也要调整: ```systemverilog // UVM 1.2: fixed packed return value uvm_pack_bitstream_t state; state = p.get_packed_bits(); ``` ```systemverilog // UVM 2.0: dynamic unpacked array supplied by reference bit unsigned state[]; p.get_packed_bits(state); ``` 这是接口形态对照,两个 state 的布局并不相同。2.0 状态流含 64 位迭代器元数据,不能把 state.size() 直接当协议有效 bit 数。跨 DPI、文件或模型的载荷改法见 M02-001;直接使用 get_bit/get_byte/get_int、set_packed_size、unpack_object_ext 或旧内部字段的代码,应改为明确的字段 pack/unpack 或状态数组处理,不存在统一改名。 #### uvm_printer_knobs 改名与宽度字段移除 - **页面标题**:删除无效的打印宽度配置,使用 printer 访问器 - **内容类型**:用户接口与行为 - **验证方法**:编译原打印配置;生成包含长名字、宽值和嵌套对象的输出,检查列宽及 golden。不要给已删除且旧版已忽略的字段添加无效替代。 - **影响类型**:编译断点、日志/调试变化 - **一句话结论**:旧 printer knobs 类型和宽度字段需要改写;保留且行为符合需要的字段可继续使用,访问器改写为可选。 - **适用条件**:声明旧 knobs 类型、访问被删宽度字段或定制输出截断的代码受影响;先区分保留与删除成员。 - **处理级别**:命中后修改 - **兼容机制**:主库保留 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_printer.svh:416`(`class uvm_printer_knobs`)、`:620-626`(宽度字段)、`:631-632`(typedef uvm_table_printer_knobs / uvm_tree_printer_knobs) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_printer.svh:617`(`class m_uvm_printer_knobs`,NODOCS 内部类) - **差异说明**:`uvm_printer_knobs` 类型名消失,改名 `m_uvm_printer_knobs` 且无 typedef 别名;两个派生 typedef 删除。宽度字段 `max_width / truncation / name_width / type_width / size_width / value_width / sprint` 在 1.2 中已标注 "Deprecated knobs, hereafter ignored",2.0 中彻底删除——读写这些字段直接编译报错。`knobs` 成员本身保留(`uvm_printer.svh:58`,@uvm-compat),其中 `header/footer/full_name` 也标注 @uvm-compat(`:778`);`identifier/type_name/size/depth/reference/begin_elements/...` 等字段仍在但已降级为内部实现,正式 API 是 set_*/get_* 访问器。 - **迁移动作**:删除旧 knobs 类型引用,改通过 printer 访问器配置。已被 1.2 忽略的宽度赋值可直接删除;只有确有输出截断需求时才另行实现。保留字段按实际 printer 类型选访问器:`mcd/prefix/show_radix/default_radix` 对应 `set_file/set_line_prefix/set_radix_enabled/set_default_radix`;`set_indent`、`set_separators` 需核对具体 printer 子类,不能对任意基类句柄照搬。 - **兼容说明**:主库保留 printer.knobs 的部分成员;已删除的宽度字段及 uvm_printer_knobs 类型没有恢复方案。保留字段可继续使用,删除项按正文调整。 - **标准依据**:IEEE 1800.2-2020 §16.2.5(printer 配置 accessor) ##### 修改前后 这类宽度赋值在 1.2 就已被忽略,迁移时直接删除: ```systemverilog uvm_default_table_printer.knobs.name_width = 20; ``` 对于仍有意义的深度配置,目标写法可改为公开访问器: ```systemverilog // Old configuration printer.knobs.depth = 3; // Target configuration printer.set_max_depth(3); ``` `printer` 是实际打印对象。不要为了通过编译而把 `name_width` 替换成 `depth`,两者含义不同;前者没有等价的宽度替代。 #### `uvm_print_*` 宏族签名重构 - **页面标题**:打印整数时显式传位宽,避免把 UVM_HEX 当宽度 - **内容类型**:用户接口与行为 - **验证方法**:优先用探针捕获传入 printer 的 SIZE/RADIX,确认实际位宽与进制;再渲染正常宽度值,避免直接打印被误当位宽的 radix 常量。 - **影响类型**:编译断点、静默/数据风险 - **一句话结论**:旧打印宏按目标原型改写,并验证 SIZE 与 RADIX;同名两参宏可能编译通过却传错位宽。 - **适用条件**:自定义 do_print 直接使用旧打印宏时受影响;数字后缀宏删除与同名宏参数变化需分别处理。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_printer_defines.svh:39`(`uvm_print_int(F, R)`)、`:67`(`uvm_print_object(F)`)、`:82`(`uvm_print_string(F)`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_printer_defines.svh:41`(`uvm_print_int(VALUE, SIZE, RADIX, VALUE_TYPE, PRINTER)`)、`:74`、`:104` - **差异说明**:打印宏改用显式 policy 参数(默认局部变量 printer),新增 named 与 real/enum 等变体;旧数字后缀宏被移除。需要区分两类影响:旧 `uvm_print_int3` 等直接编译失败;同名两参 `uvm_print_int(value, UVM_HEX)` 仍可能编译,但第二参从 radix 变为 SIZE,必须改为 `uvm_print_int(value, $bits(value), UVM_HEX)`。不能仅以编译通过核销旧打印宏。 删除的旧变体还包括 uvm_print_int4、uvm_print_object2、uvm_print_string2 和 uvm_print_*_qda*;新增 uvm_print_named_*、real/enum 变体。此处影响直接调用打印宏的代码,field 宏自动展开不需要按这些参数逐项改写。 - **迁移动作**:保留现有 `do_print` 的字段选择,按目标原型改写,例如 `` `uvm_print_named_int("nm", val, $bits(val), UVM_HEX, integral, printer)``;或直接调用 `printer.print_field_int("nm", val, $bits(val), UVM_HEX)`(不超过 64 位)。已有 field automation 的字段不要再重复注册或打印;改用 field 宏前需单独明确 copy/compare/pack 等操作意图。 - **兼容说明**:旧数字后缀打印宏和旧参数含义无兼容恢复;按目标原型明确 SIZE、RADIX 与 printer。 - **标准依据**:IEEE 1800.2-2020 §16.2.3.8 / §16.2.3.9 定义底层 print_field / print_field_int 方法;本条 `uvm_print_*` 宏原型以目标实现为准。 ##### 修改前后 在 `do_print(uvm_printer printer)` 内打印一个不超过 64 位的整数字段 `value`: ```systemverilog // UVM 1.2 macro `uvm_print_int(value, UVM_HEX) ``` 改为两版均支持的直接调用,字段名、宽度和进制一一对应: ```systemverilog printer.print_field_int("value", value, $bits(value), UVM_HEX); ``` 若继续使用目标版宏,应写成 `uvm_print_int(value, $bits(value), UVM_HEX)`。旧两参调用可能仍能编译,但第二参在目标版是位宽,输出会错。更宽的数据应使用 `print_field` 并核对其位宽限制。 #### uvm_comparer 行为变化(check_type 改用 wrapper 判据、消息格式、show_max=0 语义反转、init() 删除) - **页面标题**:自定义比较:检查类型设置和不匹配消息数量 - **内容类型**:用户接口与行为 - **验证方法**:注入字段不匹配并检查返回值及消息数;分别核对类型名与 wrapper,尤其是不同类型名共用 wrapper 的对象;重复比较核对 flush 后 check_type;超过 64 位字段改用适合宽度的接口。 - **影响类型**:编译断点、静默/数据风险、日志/调试变化 - **一句话结论**:类型检查由类型名改为 wrapper,不同类型名共用 wrapper 时可能漏检;顶层 compare 会重置 check_type,show_max=0 改为不限输出。 - **适用条件**:依赖 comparer 配置持久化、跨类型比较、继承注册或手写 get_type_name、旧 init/scope 接口或消息数量时,逐项核对。 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:行为变化 / 删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_comparer.svh:34`(class)、`:411`(`static function uvm_comparer init()`)、`:364`(print_rollup);`src/vcs-uvm-1.2/base/uvm_object.svh:1137`(按 get_type_name 判断类型不匹配) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_comparer.svh:40`(class extends uvm_policy)、`:432`(get_object_type 检查)、`:282`(BAD_SIZE 报错)、`:528`(show_max 逻辑) - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 类型判据从类型名改为 wrapper | `check_type` 启用时比较 `get_type_name()`:`src/vcs-uvm-1.2/base/uvm_object.svh:1137-1141`。 | 外层条件比较 `get_object_type()`;内层类型名比较只选择消息内容:`src/vcs-uvm-ieee-2020-2.0/base/uvm_comparer.svh:432-439`。不同类型名共用 wrapper 时,不进入这个类型不匹配分支。 | | 顶层 compare 会重新启用 check_type | 顶层入口清理结果与比较映射:`src/vcs-uvm-1.2/base/uvm_object.svh:1104-1113`;原 check_type 设置保留的效果另见本条实测。 | 顶层 compare 调用 flush:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh:987-994`;flush 明确将 check_type 设为 1:`src/vcs-uvm-ieee-2020-2.0/base/uvm_comparer.svh:568-573`。两个函数需连起来看。 | | show_max=0 从抑制消息变为不限制数量 | `result` 先递增,只有 `result <= show_max` 才输出:`src/vcs-uvm-1.2/base/uvm_comparer.svh:342-354`。 | 输出条件增加 `get_show_max() == 0`:`src/vcs-uvm-ieee-2020-2.0/base/uvm_comparer.svh:524-534`。0 因而直接满足数量条件,仍受报告 verbosity/action 控制。 | | compare_field_int 增加 size>64 的错误分支 | 旧入口直接构造 64 位 mask:`src/vcs-uvm-1.2/base/uvm_comparer.svh:202-211`;超宽截断的具体观察见本条实测。 | 新入口在构造 mask 前检查 size,报 `BAD_SIZE` 并返回 0:`src/vcs-uvm-ieee-2020-2.0/base/uvm_comparer.svh:274-284`。旧 init/print_rollup 的声明位置保留在完整引用中。 | - **差异说明**:以下变化按实际使用的 comparer 入口分别核对: | 使用点 | VCS UVM-1.2 | VCS 2.0 | |---|---|---| | `check_type=1` 的类型判据 | 比较 `get_type_name()` 字符串 | 比较 `get_object_type()` wrapper;同名但 wrapper 不同会新增不匹配,不同名共用 wrapper 时可能漏检 | | 顶层 `uvm_object::compare()` 的配置 | 保留 `check_type` 设置 | 默认和显式 comparer 都先 `flush()`,并将 `check_type` 重置为 1 | | `show_max=0` | 不显示不匹配消息 | 不限制消息数量 | | `compare_field_int` 的 `size>64` | 静默截断 | 新增 `UVM/COMPARER/INT/BAD_SIZE` 并返回 0 | | 消息与旧接口 | 原消息格式,提供 `init()`、`print_rollup()` 和 `scope` | 字段名内嵌进消息,删除上述接口;具体替代见下文 | wrapper 相同时,若字段与 `do_compare` 均通过,目标可返回相等;类型名比较仅决定 wrapper 不同分支中的消息内容。不能将类型判据变化概括为单向加严。 - **迁移动作**:`uvm_comparer::init()` 改用 `uvm_comparer::get_default()` 获取默认实例;需要清理状态时另调 `flush()`。**不能用较大的 show_max 恢复静默**,它只放宽输出数量;可在 severity 为 UVM_INFO 时将 comparer verbosity 设为高于报告阈值,或在报告配置中针对 `MISCMP` 设置 action,并保留 compare 返回值与 result 检查。顶层 `obj.compare(rhs, comparer)` 对显式传入和默认 comparer 都会先 `flush()`,本实现将 `check_type` 重置为 1;确需跨类型比较时,可先 `flush()`、再 `set_check_type(0)`,然后直接调用 `comparer.compare_object(name, lhs, rhs)`,由调用方管理独立比较之间的清理。 - **兼容说明**:主库保留 policy/show_max/verbosity/sev/miscompares/result 等公开字段,可继续直写;这不恢复类型名判据或 show_max=0 的旧含义,也不阻止顶层 compare 重置 check_type。deprecated / legacy field 开关及 compat 包均不恢复旧类型判据。相关实现:`uvm_comparer.svh:107-204`。 - **标准依据**:IEEE 1800.2-2020 §16.3.3.9(get_result)、§16.3.5.1(show_max 默认 1)、§16.3.6(threshold) ##### 修改前后 业务若要求类型名不同即比较失败,不能只依赖 `check_type=1`。例如两个派生类继承同一个已注册基类的 wrapper,却分别覆盖 `get_type_name()`:旧版会报告类型不匹配,目标版在字段相等时可能通过。对两个非空顶层对象,可在原调用处增加类型名限制: ```systemverilog // 修改前:依赖库的类型判据 same = lhs.compare(rhs, cmp); // 修改后:业务要求类型名相同才继续比较 same = (lhs.get_type_name() == rhs.get_type_name()) && lhs.compare(rhs, cmp); ``` 此检查只约束该调用处的顶层类型;嵌套对象仍需按业务契约比较。同名不保证属于同一类型,具体派生类的 factory 注册和 wrapper 也应与实际类型一致。检查 `same`,不要用上次保留的 comparer result 代替短路返回值。`comparer_fact_probe` 在 check_type 始终为 1 时实测原调用返回 **0 / 1**,增加上述限制后两版均返回 **0**;目标 comparer 与 Accellera 2.0 源码相同。 仅当业务确实允许比较不同派生类型时,旧代码可能先关闭类型检查: ```systemverilog cmp.check_type = 0; same = lhs.compare(rhs, cmp); ``` 目标版的对象 `compare` 入口会重置该设置。应通过 comparer 入口完成此类比较: ```systemverilog cmp.flush(); cmp.set_check_type(0); same = cmp.compare_object("pair", lhs, rhs); ``` 每次独立比较前先清理旧状态再配置。普通同类型事务比较无需改用此写法。另注意 `show_max=0` 在目标表示不限制消息数,不能再用它静音;比较是否成功应检查 `same`,不能按日志是否为空判断。 其他 comparer 调用按下面处理: | 旧依赖 | 修改方法 | |---|---| | `uvm_comparer::init()` | 用 `uvm_comparer::get_default()` 获取默认实例;独立比较需要清理时另调 `flush()` | | `show_max=0` 静音 | INFO 比较消息可将 comparer verbosity 配为高于报告阈值,或按 `MISCMP` 的 severity/ID 设置 action;仍检查比较返回值 | | `compare_field_int` 比较超过 64 位的数据 | 改用 `compare_field(name, lhs, rhs, size, radix)`,同时核对 `size` 不超过实际 bitstream 类型容量 | | 直接操作旧 `scope`、调用 `print_rollup()` | 改由比较入口管理路径,通过返回值及 `get_result()` 获取结果,自定义摘要由用户报告逻辑生成;旧 scope 和摘要调用没有统一改名 | 保留自己的字段比较逻辑;只替换其依赖的接口和消息策略,不要因删除 scope 而跳过字段比较。 ##### 实现细节 类型判据实现注释引用 Mantis 6602;内部 `compare_map` 改为 `bit[lhs][rhs]`。顶层 `uvm_object::compare()` 调用 `flush()` 的路径见目标 `uvm_object.svh:987-990`。公开接口的影响及处理见上方对照。 #### uvm_printer emit() 必须配 flush(),新增 UVM/PRINT/NO_FLUSH 检查 - **内容类型**:用户接口与行为 - **验证方法**:独立输出之间执行 flush,连续输出两次应无 NO_FLUSH 且无上一对象残留;普通 sprint 路径单独对照。 - **适用条件**:绕过 sprint、直接重复调用 printer.emit,或手工复用同一 printer。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_printer.svh:1046`(table emit 内部清 m_rows) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_printer.svh:1362`、`:1526`(emit 内 `uvm_error UVM/PRINT/NO_FLUSH`)、`:195`(flush 声明) - **差异说明**:printer 内部由"m_rows 行队列"改为"uvm_printer_element 树 + 回收栈"。1.2 emit() 结束自动清行缓存;2.0 要求 emit 与 flush 配对,连续两次 emit 且无 flush 直接报 UVM_ERROR。`uvm_object::sprint/print` 在顶层会自动 flush(`uvm_object.svh:886`),常规 `obj.print()` 不受影响;**自定义 printer 子类或手动 print_field+emit 拼输出的代码**可能踩雷。 - **迁移动作**:直接拼装输出时,每次独立输出先 printer.flush(),再 print_field 等填入字段,最后保存 printer.emit() 返回值;下一次输出重新执行同样顺序。普通 obj.sprint(printer) 顶层已负责 flush,可保留该路径。 - **兼容说明**:兼容措施不恢复 emit 后自动清空;手工输出遵循 flush → 填字段 → emit,普通 sprint 可保留。 - **标准依据**:IEEE 1800.2-2020 §16.2.4(flush/emit) ##### 修改前后 `p` 为已构造的 `uvm_table_printer`,`value` 为 32 位数据,`text` 为 string。旧代码可能连续执行以下两行: ```systemverilog p.print_field("value", value, 32, UVM_HEX); text = p.emit(); ``` 目标版每次开始独立输出时清理状态: ```systemverilog p.flush(); p.print_field("value", value, 32, UVM_HEX); text = p.emit(); ``` 完成一次输出后,下一次仍从 flush 开始;不能在已填入字段后、emit 前 flush,否则会清掉本次内容。普通 `obj.sprint(p)` 顶层已负责 flush,可继续使用。 #### uvm_recorder::do_record_object 由 pure virtual 变为带默认实现的 virtual - **页面标题**:自定义 recorder 的对象递归与文本输出 - **内容类型**:用户接口与行为 - **验证方法**:记录含嵌套对象和重复引用的样例,核对递归次数与对象身份;检查覆盖 do_record_object 后是否意外重复递归。 - **适用条件**:自定义 recorder 的对象递归实现或解析文本 inst_id。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:签名变更(语义放宽)/ 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_recorder.svh:613`(pure virtual do_record_object)、`:43`(extends uvm_object) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_recorder.svh:513`(virtual 默认实现,内部走 do_execute_op+do_record)、`:48`(extends uvm_policy)、`:149`(flush) - **差异说明**:2.0 基类提供 do_record_object 默认递归实现,record_object 的 cycle_check/递归由基类 `m_recur_states` 接管。已有 override 且签名相同的子类无需改动;但**子类若靠 `super.do_record_object` 之外自行调 `value.record(this)` 做递归**,2.0 下会与新机制叠加(循环检测报错路径变化)。另:uvm_text_recorder 记录对象 id 的属性名由"字段名"改为固定 `"inst_id"`(`uvm_recorder.svh:819`),解析 tr_db.log 的脚本注意。 - **迁移动作**:仅用于手工递归的 do_record_object override 可移除,由目标基类递归。需要自定义属性时保留该 override,但只保留一次递归入口:选择 super.do_record_object(name, value) 后,删除重复的 value.record(this)。自定义后端仍保留必要的写属性逻辑;文本后处理改为读取 inst_id,并核对嵌套对象身份。 - **兼容说明**:主库保留 tr_handle、physical/abstract/identifier/default_radix/policy 字段;对象递归和 inst_id 输出仍按目标语义核对。 相关实现:`uvm_recorder.svh:104`。 - **标准依据**:IEEE 1800.2-2020 §16.4.7.7(Mantis 6591 将 LRM pure virtual 改 virtual) #### uvm_tree_printer.newline 字段私有化;uvm_table_printer::calculate_max_widths 删除 - **内容类型**:用户接口与行为 - **验证方法**:编译派生 printer 与调用方,用多层对象检查换行和列宽输出;外部直接字段访问应迁移到允许的配置路径。 - **适用条件**:访问 tree printer 的 newline,或调用 table printer 的 calculate_max_widths。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_printer.svh:360`(`string newline = "\n";` 公开)、`:333`/`:1013`(calculate_max_widths) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_printer.svh:517`(`protected string m_newline`) - **差异说明**:`uvm_tree_printer.newline` 公开字段改名 protected `m_newline`(配 m_linefeed),直接写 `my_tree_printer.newline = " "` 的代码编译报错;table printer 的公开方法 calculate_max_widths() 删除(逻辑并入 pop_element);table/tree/line printer 构造函数由 `new()` 变为 `new(string name="")`(向后兼容),并全部 `uvm_object_utils` 注册进工厂。 - **迁移动作**:需要单行输出时使用 `uvm_line_printer`;自定义换行规则需在派生 printer 中实现并对照输出。`set_separators` 配置对象的起止分隔字符,不替代 newline。删除 `calculate_max_widths()` 调用后,验证目标自动列宽满足原输出契约。 - **兼容说明**:旧 newline 公开字段和 calculate_max_widths 无兼容恢复;换行与列宽按实际输出需求处理。 #### uvm_printer 新增标准配置/查询 API(accessor、set_default/get_default、element 栈) - **内容类型**:新增功能 - **验证方法**:设置配置并读回,在独立 sprint 中检查实际布局;替换默认实例后断言使用的是预期对象。 - **适用条件**:需要新增 printer 配置访问器、默认 printer 替换或 element 栈接口。 - **影响类型**:日志/调试变化 - **处理级别**:可选采用 - **兼容机制**:主库保留 - **类型**:新增 API - **1.2 位置**:无(1.2 对应能力靠 knobs 字段直写) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_printer.svh:198-263`(set_name_enabled ~ set_end_elements)、`:277-288`(push_element/pop_element/get_top_element/get_bottom_element)、`:795`(static set_default) - **差异说明**:新增全套标准化接口:set/get_name_enabled、type_name_enabled、size_enabled、id_enabled、radix_enabled、radix_string、default_radix、root_enabled、recursion_policy、max_depth、file、line_prefix、begin/end_elements;`uvm_printer::set_default/get_default` 及各子类同名静态方法(经 uvm_coreservice_t 管理默认实例);新类 `uvm_printer_element`/`uvm_printer_element_proxy`(`:366`/`:410`)与 element 栈 API 供自定义 printer 使用;`object_printed()` 提供递归状态查询。`print_generic_element(name,type_name,size,value)` 替代了 1.2 用 size=-2 打 "..." 的技巧(print_array_range 内部改用它)。 - **迁移动作**:保留且行为符合需要的 knobs 字段可继续使用,无需仅为改名替换;需要标准配置接口时采用访问器并验证输出。删除成员按 M02-003 处理。 - **兼容说明**:主库提供旧字段及对应访问器,无需启用开关;采用访问器后仍需核对策略配置与操作结果。 - **标准依据**:IEEE 1800.2-2020 §16.2.5/§16.2.7/§16.2.8;recursion policy 默认 UVM_DEFAULT_POLICY≡UVM_DEEP(§16.2.5.9) #### uvm_packer 新增 API(pack_object_with_meta / unpack_object_with_meta / set_default 等) - **内容类型**:新增功能 - **验证方法**:区分普通 pack_object 和带元数据接口,记录位数与对象类型/空标记;跨版本交换按 M02-001 的 golden 逐位比较。 - **适用条件**:采用 pack_object_with_meta 或新的默认 packer 管理接口。 - **影响类型**:静默/数据风险 - **处理级别**:可选采用 - **兼容机制**:compat 包 - **类型**:新增 API - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_packer.svh:220`(pack_object_with_meta)、`:321`(unpack_object_with_meta)、`:244`(is_object_wrapper)、`:119`(static set_default/get_default) - **差异说明**:新增对象引用追踪打包(with_meta 系列,可保持结构/句柄一致性,@uvm-contrib 待进标准)、pack_object_wrapper/unpack_object_wrapper、is_object_wrapper;`uvm_packer` 注册进工厂(`uvm_object_utils`),构造 `new(string name="")`,经 coreservice 管理默认实例。另新增 compat 辅助 `unpack_string_with_size(int num_chars=-1)`(`:363`,注意基类实现忽略 num_chars,直接等价 unpack_string())。 - **迁移动作**:无(新增能力,可选用) - **兼容说明**:显式使用兼容包提供的类或宏后生效。`unpack_string(int num_chars)` 旧签名由 compat 宏 `` `uvm_unpack_string_with_size``(`compat/uvm_compat_macros.svh:32`)与 `uvm_compat_packer::unpack_string_with_size`(`compat/uvm_compat_packer.svh:384`)承接 - **标准依据**:IEEE 1800.2-2020 §16.5.2(构造/默认实例) #### uvm_comparer 新增标准配置 API - **内容类型**:新增功能 - **验证方法**:分别改变停止阈值和显示上限,注入多处不匹配;检查停止比较的时点、消息数和最终比较结果。 - **适用条件**:使用新 comparer 配置访问器,尤其 threshold 与 show_max。 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_comparer.svh:46-95`(flush/object_compared/get_miscompares/get_result/set_result/set_recursion_policy/set_check_type/set_show_max/set_verbosity/set_severity/set_threshold)、`:216`(static set_default/get_default) - **差异说明**:`uvm_comparer extends uvm_policy` 并注册工厂,`new(string name="")`;新增 flush()(重置 miscompares/check_type/result/递归状态——注意不重置 show_max/verbosity/sev/threshold)、`set_threshold`(快速失败阈值,默认 1)、object_compared() 递归状态查询。1.2 字段 policy/show_max/verbosity/sev/miscompares/result/check_type 全部保留(@uvm-compat)。 - **迁移动作**:无(新增);建议新代码用 accessor - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §16.3.2/§16.3.4/§16.3.5/§16.3.6 #### uvm_recorder / uvm_tr_stream / uvm_tr_database 句柄类型 integer→int 与配套新增 - **页面标题**:重写 recorder、stream、database 方法时同步句柄类型 - **内容类型**:用户接口与行为 - **验证方法**:编译所有 override;建立、结束和释放一条记录,检查句柄有效性及 stream/database 关联。 - **适用条件**:派生 recorder/stream/database 虚方法,或调用被移除的内部句柄接口。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:签名变更 / 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_tr_stream.svh:407`(`function integer get_handle()`)、`:431`(virtual m_get_handle) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_tr_stream.svh:327`(`function int get_handle()`) - **差异说明**:recorder/stream/database 全族 handle 相关方法与回调由 `integer` 改为 `int`(get_handle、get_recorder_from_handle、get_stream_from_handle、begin_tr/end_tr/link_tr/free_tr 等,文本后端同改)。**`uvm_tr_stream::m_get_handle()`(1.2 留给厂商 override 的钩子)被删除**——Synopsys 自家 verdi/vcs 后端已同步改造,用户若 override 过该方法需删除。recorder 新增 set/get_recursion_policy、set/get_id_enabled、set/get_default_radix、flush()、object_recorded();`record_object` 对 null 直接记录。 - **迁移动作**:普通 integer 变量存储 int 句柄无需因 64 位仿真而修改,两种整数都为 32 位四态。覆盖虚方法时须匹配目标版签名(参见 M06-007 的 VCS 类型检查);删除已失去调用入口的 m_get_handle override。 - **兼容说明**:兼容措施不恢复 m_get_handle 钩子或旧虚方法签名;普通句柄变量可保留,override 按目标接口修改。 - **关联变化**:VCS 两侧在未定义 `UVM_VERDI_NO_PORT_RECORDING` 时都声明 pure virtual 的 `port_begin_recording_cb/port_end_recording_cb`;直接派生 `uvm_tr_database` 时须实现真实端口录制,不能用空回调冒充后端。已有实现可继续按目标签名核对。两侧 begin 的输出句柄均为 `ref int`,end 的输入句柄均为 `int`,不能由本条标题推断所有 VCS 回调都改过类型。TLM2 begin/end 的 delay 从 `uvm_tlm_time` 名称变为 `uvm_time`,旧名称主库 typedef 见 M08-007。`get_object_id()` 在未定义 `UVM_VCS_RECORD` 时也为延续的 VCS 虚方法。源码:`src/vcs-uvm-1.2/base/uvm_tr_database.svh:289-342`、`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_tr_database.svh:233-285`。此处证据范围为扩展声明核对,不包含任意自定义后端的实测。 - **标准依据**:IEEE 1800.2-2020 §16.4.5/§7.2.6 #### uvm_text_tr_database / uvm_text_tr_stream 拆分为独立文件 - **内容类型**:内部实现 - **验证方法**:使用目标文件组织重新编译;生成一条 stream/transaction 并对照解析结果,不能仅凭文件拆分就认定格式完全相同。 - **适用条件**:直接 include 旧 recorder 文件,或解析 text database 的注册和句柄输出。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:内部重构(仅影响直接 include 的场景) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_tr_database.svh:355`(uvm_text_tr_database)、`src/vcs-uvm-1.2/base/uvm_tr_stream.svh:524`(uvm_text_tr_stream) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_text_tr_database.svh:54`、`src/vcs-uvm-ieee-2020-2.0/base/uvm_text_tr_stream.svh:35` - **差异说明**:text database/stream 拆为独立文件,set_file_name 等入口与 UVM_CHANGE_DEFAULT_TR_DB_NAME 定制保留;注册与句柄类型也随新框架更新,不能称类体逐字不变。正常通过 uvm_pkg 获得类型;自行 include 宿主文件并依赖 text 类型的用法需同步文件依赖。 - **迁移动作**:通过 uvm_pkg 使用类型时无需修改;直接 include 旧宿主文件且依赖 text 类型时,同步目标文件依赖。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 新增 uvm_cache / uvm_lru_cache(及内部 uvm_regex_cache) - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_cache.svh:41`(virtual uvm_cache#(KEY_T,DATA_T):size/exists/get/put/evict/keys/flush/set_max_size,默认 max_size=256)、`src/vcs-uvm-ieee-2020-2.0/base/uvm_lru_cache.svh:46`(uvm_lru_cache 实现 LRU 逐出)、`src/vcs-uvm-ieee-2020-2.0/base/uvm_regex_cache.svh:33`(内部单例,缓存 uvm_is_match 编译结果) - **差异说明**:通用缓存基类 + LRU 实现,标注 @uvm-contrib(尚未进标准正文)。纯新增,不影响存量代码。 - **迁移动作**:无 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:无(IEEE 1800.2-2020 未收录,Accellera 贡献扩展) #### 新增 pack/compare/record 宏文件 - **页面标题**:新增 comparer 宏与命名比较辅助 - **内容类型**:新增功能 - **影响类型**:静默/数据风险 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:3481` 起(uvm_record_* 内嵌于 object_defines;uvm_pack_* 见 :3632 起) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_packer_defines.svh:136`(`uvm_pack_int(VAR,PACKER=packer)` 等全族)、`macros/uvm_comparer_defines.svh:52`(`uvm_compare_int` 等)、`macros/uvm_recorder_defines.svh:100`(`uvm_record_int(...,RECORDER=recorder)` 等) - **差异说明**:目标新增 comparer 宏族(uvm_compare_int/enum/real/object/string/sarray/qda、named 变体及 threshold begin/end),供手写 do_compare 时按目标 comparer 策略调用。pack/record 宏的拆分、默认 policy 参数和原有调用兼容性统一见 M09-010;跨版本位流变化见 M02-001。 - **迁移动作**:已有 do_compare 无需仅为新宏改写。选择新 comparer 宏时,按目标原型传入字段名、值和 comparer,并用相等/不等对象验证比较返回值与诊断。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §B.2.3(recording)、§B.2.4(packing)、§B.2.5(unpacking)。新增 comparer 宏及额外 policy 形参按目标实现核对,不能由这些标准条款推导其原型。 #### VCS 数组录制上限开关与 verdi_get_array_limit 被移除 - **页面标题**:旧数组录制上限失效:显式控制记录项数 - **内容类型**:用户接口与行为 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:删除 API / 配置变化(Synopsys 定制) - **适用条件**:运行参数含 `+UVM_ARRAY_NUM_LIMIT`,或自定义 recorder/字段操作调用 `verdi_get_array_limit()`、访问 `max_array_limit_check/max_array_num_limit`。 - **一句话结论**:目标库不再读取旧数组录制上限;需要限制记录项数时,在对象 do_record 中显式控制,并关闭该字段的自动录制。 - **差异说明**:VCS 1.2 的 recorder 读取 `+UVM_ARRAY_NUM_LIMIT`,数组/队列 field 宏调用 `verdi_get_array_limit()` 选择记录项数;目标 recorder 与 Accellera 2.0 相同,已无该方法和配置字段,旧 plusarg 没有原来的消费路径。直接调用旧方法会报成员不存在;只留下 plusarg 通常不能通过编译报错发现失效。此项是 VCS 旧版定制的移除,不是所有 recorder 的通用数组限制。 - **迁移动作**:先确认需要记录全部元素还是限定元素;需要上限时,给对应字段的 field FLAG 加 `UVM_NORECORD`,在 `do_record(uvm_recorder recorder)` 中按显式上限调用 `record_field_int/record_object` 等对应接口。调用旧 getter 的代码改读自己维护的配置;验证记录内容后再删除旧 plusarg。已有手工录制字段不要同时启用自动录制。 - **兼容说明**:deprecated、legacy field 开关和 compat 包都不恢复这套 VCS 数组上限;显式 do_record 的上限由用户配置维护。 - **验证方法**:用超过上限的数组检查记录项数、索引和值;也覆盖空数组、短数组及所用元素类型。确认没有自动录制叠加,并检查实际后端输出与所需的文件体积;不能把文本 recorder 实验扩展到全部 Verdi 工作流。 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_recorder.svh:124-155`;`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:2668-2740` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_recorder.svh` 全文件不含旧方法和字段;`src/vcs-uvm-ieee-2020-2.0/src/macros/uvm_recorder_defines.svh:237-262` - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 旧上限由 recorder 读取,field 宏消费 | getter 读取 plusarg:`src/vcs-uvm-1.2/base/uvm_recorder.svh:145-155`;整型数组宏按上限分支记录:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:2668-2740`。 | 目标 field 宏调用 qda 宏:`src/vcs-uvm-ieee-2020-2.0/src/macros/uvm_object_defines.svh:1451-1453`;qda 录制宏没有该 getter:`src/vcs-uvm-ieee-2020-2.0/src/macros/uvm_recorder_defines.svh:237-262`。方法删除同时依据 recorder 全文件核对和编译断点,不能仅由该片段推断。 | - **标准依据**:VCS 1.2 私有扩展;两侧 Accellera recorder 无该 getter,不作为 IEEE 标准要求。 ##### 修改前后 旧写法通过仿真参数控制自动录制:`+UVM_ARRAY_NUM_LIMIT=2`。下面给出整数数组只记录前两项的显式写法;`data` 若仍注册 field 宏,应在原 FLAG 上增加 `UVM_NORECORD`,保留所需 copy/compare/pack 操作。 ```systemverilog class bounded_record_item extends uvm_object; int data[] = '{11, 22, 33, 44}; int unsigned record_limit = 2; function new(string name = "bounded_record_item"); super.new(name); endfunction // This example does not register data with a field macro. function void do_record(uvm_recorder recorder); super.do_record(recorder); foreach (data[i]) begin if (i >= record_limit) break; recorder.record_field_int($sformatf("data[%0d]", i), data[i], 32, UVM_DEC); end endfunction endclass ``` 这里的上限 0 表示不记录任何元素,与旧开关的 0 分支不同;迁移配置时明确转换含义。对象数组用相应的 `record_object` 并单独验证对象身份和递归。 ##### 已有实测结果 `vendor_compile_probe` 的旧 getter 调用在 1.2 编译通过,2.0 报 `Error-[MFNF]`。`vendor_migration_probe` 两库对四项整数数组均记录两项,值之和为 33,最后字段为 `data[1]`;只验证手工 do_record 与文本 recorder 调用,不代表所有 field 宏或 Verdi 文件格式等价。 #### VCS UVM_VERDI_BEGIN_TR_REALTIME 运行开关被移除 - **页面标题**:旧录制取时开关失效:明确事务时间契约 - **内容类型**:用户接口与行为 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:配置变化(Synopsys 定制) - **适用条件**:传入 `+UVM_VERDI_BEGIN_TR_REALTIME`,并依赖 `uvm_tr_stream::open_recorder` 的默认取时路径。 - **一句话结论**:目标默认取时不再由旧 plusarg 切换;显式传入非零 time 可固定调用契约,不能借此恢复任意小数时间精度。 - **差异说明**:未定义 `UVM_VERDI_FORCE_BEGIN_TR_TIME` 时,1.2 在 open_time 为 0 时按旧 plusarg 在 `$realtime` 与 `$time` 间选择,并赋给 time 变量;2.0 固定使用 `$time`。两版均可传入非零 open_time;两版的 FORCE 宏仍会强制置零。因此不能把删除 plusarg 直接解释为所有事务必然损失时间精度,也不能认为 time 参数能保留任意小数。 - **迁移动作**:若只需目标默认取时,删除失效 plusarg 后核对实际事务时间;若已有明确的整数时间契约,在调用 `stream.open_recorder(name, recorded_time, type_name)` 时传入按项目单位换算的非零 time。原先依赖小数分辨率或 Verdi 展示的路径需核对源 timeunit/timeprecision、time 转换和后端;没有已验证的通用开关替换。 - **兼容说明**:兼容开关和 compat 包不恢复旧取时 plusarg;显式非零 time 只固定该参数,不能恢复被量化的小数部分。`UVM_VERDI_FORCE_BEGIN_TR_TIME` 定义时仍优先置零。 - **验证方法**:检查调用点时间单位、0/非零参数和 FORCE 宏;对所需时间间隔核对 recorder.get_open_time 与实际 Verdi 展示。若依赖小数时间,在实际集成中验证量化和舍入,不能只检查参数存在。 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_tr_stream.svh:320-337` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_tr_stream.svh:262-272` - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 默认取时分支移除旧 plusarg,显式时间与 FORCE 分支保留 | 根据 plusarg 选择并存入 time:`src/vcs-uvm-1.2/base/uvm_tr_stream.svh:320-337`。 | open_time 为 0 时直接取 $time:`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_tr_stream.svh:262-272`。 | - **标准依据**:旧 plusarg 是 Synopsys 定制;Accellera 两版无此分支。此处结论基于实际源码,不宣称已验证所有工具时间显示。 ##### 已有实测结果 `vendor_migration_probe` 未定义 FORCE 宏,显式传入 time 值 7,两个库的 `get_open_time()` 均返回 7。旧开关默认取时及小数精度差异仅作源码核对,尚无全部 Verdi 集成实测。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | 数组录制上限、verdi_get_array_limit | VCS 1.2 有,2.0 移除 | 显式限制录制项数及编译断点见 M02-016。 | | UVM_VERDI_BEGIN_TR_REALTIME | VCS 1.2 的取时分支在 2.0 移除 | 时间单位、显式 time 参数及验证边界见 M02-017。 | | Database 端口录制回调 | 两版均有,Accellera 无 | 未定义 UVM_VERDI_NO_PORT_RECORDING 时,直接派生数据库须实现 port_begin/end_recording_cb;这是延续的基类要求。TLM2 delay 名称及句柄签名核对见 M02-012、M08-007。 | | UVM_CHANGE_DEFAULT_TR_DB_NAME | 两版延续 +UVM_TR_DB_LOG_NAME 解析 | 目标 `src/vcs-uvm-ieee-2020-2.0/src/base/uvm_text_tr_database.svh:77-102`;已有配置可按所用后端核对。 | | UVM_VERDI_FORCE_BEGIN_TR_TIME | 两版延续 | 定义后 open_time 强制为 0,与旧运行取时开关不同;见 M02-017。 | | Printer / packer / comparer / recorder / cache | 目标 printer 仅注释差异,其余所列目标文件与 Accellera 一致 | 不代表 1.2→2.0 行为相同;版本间变化见各主条目。 | --- ## 第 3 章 phase 与 objection 机制 ### 概览 优先检查旧 `uvm_test_done_objection`:类仍可用,但 raise/drop 不再控制 run phase。常规 phase objection 与 `phase_ready_to_end` 入口保持;旧 stop 流程和 event 回调需要改写。TEST_DONE 日志、phase hopper 和新增查询接口按实际使用核对。 ### 建议阅读顺序 先确认 run 能保持到激励与检查器完成,再处理旧停止流程、event 回调和日志解析。 M03-003 → M03-002 → M03-001 → M03-004
实际 phase.raise_objection激励完成与检查器排空对应 drop 与 phase 收尾
目标库的旧 test_done 单例不再控制这条路径;对象仍能创建也不能据此判断运行时有效。 ### 差异条目 #### 1. uvm_event 的 add_callback/delete_callback 删除,uvm_event_callback 基类改为 uvm_callback - **页面标题**:event 回调改用 uvm_callbacks 注册和删除 - **内容类型**:用户接口与行为 - **验证方法**:注册后 trigger 一次,检查 pre_trigger/post_trigger 次数与数据;删除 callback 后再次 trigger,确认不再回调。 - **影响类型**:编译断点、其他行为变化 - **一句话结论**:event 回调改用 uvm_callbacks 注册与删除,并匹配新的回调类型体系。 - **适用条件**:对 uvm_event 调用 add_callback/delete_callback 或定制回调基类的代码需修改;同名的用户接口先确认类型。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API + 签名变更(基类) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_event.svh:357`(`add_callback`)、`:375`(`delete_callback`);`src/vcs-uvm-1.2/base/uvm_event_callback.svh:40`(`virtual class uvm_event_callback#(T) extends uvm_object`) - **2.0 位置**:两个方法不存在;`src/vcs-uvm-ieee-2020-2.0/base/uvm_event_callback.svh:43`(`extends uvm_callback`);注册走标准回调机制 `src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh:254-272`(`cbs_type` typedef + `m_register_cb`) - **差异说明**:旧 `ev.add_callback(cb)` 使用 event 自带队列;目标改用 `uvm_callbacks#(uvm_event#(T), uvm_event_callback#(T))::add(ev, cb)` / `::delete(ev, cb)`。库的 `uvm_event_callback#(T)` 改为继承 `uvm_callback`,用户派生类仍应继承 `uvm_event_callback#(T)`,并保留匹配同一 T 的 `pre_trigger/post_trigger`。直接改成 `extends uvm_callback` 会失去 event 回调类型契约。 - **迁移动作**:确认接收者为 event 后替换注册/删除调用。旧 `ev.add_callback(cb)` 对应 `uvm_callbacks#(uvm_event#(T), uvm_event_callback#(T))::add(ev, cb)`;旧 `ev.add_callback(cb, 0)` 表示插到队首,须显式传第三参 `UVM_PREPEND`。删除用同一特化类型的 `::delete(ev, cb)`。核对回调顺序及 pre_trigger 的阻止触发返回值。 - **兼容说明**:旧 event 注册方法不再提供;用户回调仍继承 uvm_event_callback#(T),注册类型与顺序须匹配。 - **标准依据**:IEEE 1800.2-2020 §10.2(uvm_event_callback 经 uvm_callbacks 挂接,源码标注 `@uvm-ieee 1800.2-2020 auto 10.1.x`) ##### 修改前后 `ev` 是 `uvm_event#(uvm_object)`,`cb` 是继承 `uvm_event_callback#(uvm_object)` 的回调对象。 旧写法: ```systemverilog ev.add_callback(cb); ev.delete_callback(cb); ``` 目标写法(注册与删除发生在各自原来的时机): ```systemverilog typedef uvm_callbacks#(uvm_event#(uvm_object), uvm_event_callback#(uvm_object)) event_callbacks; event_callbacks::add(ev, cb); event_callbacks::delete(ev, cb); ``` 若事件使用自定义数据类型,两处 `uvm_object` 都替换为该类型。旧 `add_callback(cb, 0)` 要保留队首插入顺序,改为 `event_callbacks::add(ev, cb, UVM_PREPEND)`。 #### 2. stop 机制整体删除:stop_phase / enable_stop_interrupt / stop_request / force_stop - **内容类型**:用户接口与行为 - **验证方法**:用显式完成握手和 phase objection 验证正常结束、主动停止和超时;检查所有必须收尾任务执行完毕,跳 phase 不能自动等价于旧 stop 流程。 - **适用条件**:使用 global_stop_request、stop_phase 或旧 stop_timeout 收尾。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_component.svh:744`(`stop_phase`,1.2 已标 DEPRECATED)、`:761`(`enable_stop_interrupt`);`src/vcs-uvm-1.2/base/uvm_root.svh:296-301`(`uvm_root::stop_request()`);`src/vcs-uvm-1.2/base/uvm_objection.svh:1202`(`uvm_test_done_objection::stop_request`)、`:1338`(`force_stop`)、`:1226`(`stop_timeout`) - **2.0 位置**:以上全部不存在(`uvm_root.svh`/`uvm_component.svh` 中 grep 无 stop 相关成员;`uvm_objection.svh:1172` 的 test_done 类仅余空壳,见条目 3) - **差异说明**:1.2 中 `global_stop_request()`/`uvm_test_done.stop_request()` 会 raise test_done objection、调用各组件 `stop_phase` 并等其返回(受 `stop_timeout` 约束,超时报 STOP_TIMEOUT);2.0 整条链路删除,无任何替代 API。引用这些符号的代码编译失败。 component kill/do_kill_all/status 的接收者与进程管理边界见 M01-002。uvm_root::die() 是异常终止,$finish 会直接结束仿真,都不能代替正常停止握手与检查。 - **迁移动作**:把旧 stop_phase 中必须执行的收尾任务移到显式停止握手:停止产生新事务,等待在途事务与检查器排空,再成对 drop 实际 phase 的 objection。`end_prematurely()` / `jump()` 会改变 phase 执行流程,不能自动完成这些任务;仅在确需提前结束或重启阶段时单独设计并验证。旧 stop_timeout 应改为握手超时检查,不能直接等同于整个测试的 set_timeout。 - **兼容说明**:旧 stop 流程与 stop_timeout 无自动恢复;显式收尾握手及其超时须独立实现。 - **标准依据**:IEEE 1800.2-2020 正文无 stop 机制定义(uvm_root 已降级至附录 F,§F.7 无 stop_request) #### 3. uvm_test_done_objection:类保留但不再关联 run phase(静默行为变化) - **页面标题**:旧 test_done 不再保持 run 存活 - **内容类型**:用户接口与行为 - **影响类型**:静默/数据风险 - **一句话结论**:使用实际 run phase 的 objection 保持仿真存活;旧 test_done 单例的 raise/drop 在目标库中不能控制 phase 结束。 - **处理级别**:命中后修改 - **兼容机制**:主库保留 - **类型**:行为变化 + 废弃(deprecated) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_phase.svh:889`(run phase 节点的 `phase_done` 直接挂 `uvm_test_done_objection::get()` 单例);`src/vcs-uvm-1.2/base/uvm_objection.svh:1124`(类定义,含 raise/drop/all_dropped 重写) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_objection.svh:1171-1244`(`//@uvm-compat for compatibility with 1.2`,仅保留 `new/qualify/get_type/get_type_name/create/get`);`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase.svh:567-580`(`get_objection()` 惰性创建普通 `uvm_objection`,全库不再引用 `uvm_test_done_objection`) - **差异说明**:旧行为——`uvm_test_done_objection::get()` 就是 run phase 的 objection,对它 raise/drop 直接门控 run phase 结束;新行为——该单例与 phase 机制完全脱钩,**对其 raise/drop 编译通过但不产生任何 phase 控制效果**。因此 test 可能编译通过,而 run phase 因无有效 objection 直接结束。 - **迁移动作**:检查 `uvm_test_done` 相关结束控制,保留 raise/drop 的配对、计数与收尾条件,改用实际 `run_phase(uvm_phase phase)` 参数调用 `phase.raise_objection(this)` / `phase.drop_objection(this)`。`phase.get_objection()` 返回 objection 对象,不是 phase 句柄;sequence 中需要由调用方传入 phase,或确认 get_starting_phase() 返回了所需的非空 phase。 - **兼容说明**:主库保留类与 get() 等符号,允许继续编译引用;旧对象不再保持 run 存活,stop 方法也未恢复,结束控制仍需改为实际 phase objection。 ##### 适用条件 test 或 component 用 `uvm_test_done_objection::get()` 保持 run phase 存活时需要修改。已经通过实际 `run_phase(uvm_phase phase)` 的 phase 句柄 raise/drop 的代码,不需要因为本条再换一套 objection。 ##### 修改前后 旧写法(片段放在 component 的 run_phase 中): ```systemverilog task run_phase(uvm_phase phase); uvm_test_done_objection::get().raise_objection(this); #10; completed = 1; uvm_test_done_objection::get().drop_objection(this); endtask ``` 修改后保持业务流程,用实际 phase 控制结束: ```systemverilog task run_phase(uvm_phase phase); phase.raise_objection(this); #10; completed = 1; phase.drop_objection(this); endtask ``` 完整示例的 `completed` 为 test 成员,并在 report_phase 输出。真实环境把延时部分替换成激励完成与检查器排空的握手,raise/drop 应成对管理。 ##### 如何验证 在 `report_phase` 检查 `completed==1`;示例的对应输出名为 `run_completed`。环境级验证还应检查实际事务数、激励完成标志和 scoreboard 排空状态。 ##### 已有实测结果 | 观察量 | 1.2 旧写法 | 2.0 旧写法 | 修改后,两版 | |---|---|---|---| | run 中的 `completed` 是否被置 1 | 是 | 否,run 提前结束 | 是 | #### 4. TEST_DONE 消息移除 - **内容类型**:用户接口与行为 - **验证方法**:用一条成功测试和一条故意失败的测试检验脚本;成功需要业务完成及检查器结果,不能只靠出现 report 总结判定。 - **适用条件**:回归脚本依赖 TEST_DONE 消息判定完成、时间戳或裁剪日志。 - **影响类型**:日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(消息/日志) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_objection.svh:1252`(`uvm_info_context("TEST_DONE", "All end-of-test objections have been dropped. Calling stop tasks", UVM_FULL, ...)`)、`:1276`(`uvm_info_context("TEST_DONE", {"'run' phase is ready to proceed to the 'extract' phase"}, UVM_LOW, ...)`) - **2.0 位置**:两条消息均不存在;仅剩 `TEST_DONE_NOHIER` 错误(`src/vcs-uvm-ieee-2020-2.0/base/uvm_objection.svh:1207`,由保留的 `qualify()` 发出) - **差异说明**:两条 TEST_DONE 消息由 1.2 `uvm_test_done_objection::all_dropped` 路径发出,stop 机制删除后随之消失。第二条为 UVM_LOW,但仍取决于是否进入该路径及报告配置,不能作为每次仿真必有的结束标记。 - **迁移动作**:回归成功条件改为业务完成标志、预期事务数、检查器排空和错误结果同时满足。需要阶段时间戳时可观察 `uvm_phase_cb::phase_state_change` 的 `UVM_PHASE_ENDED` 状态;READY_TO_END 可能多次发生,report 总结也可能出现在异常终止路径,均不能单独代替成功判定。同步移除 TEST_DONE 日志匹配依赖。 - **兼容说明**:兼容措施不恢复 TEST_DONE 消息;测试成功须由业务完成与检查结果共同判定。 #### 5. uvm_phase::max_ready_to_end_iter 公共字段删除,改为访问器;get_ready_to_end_count() 删除 - **内容类型**:用户接口与行为 - **验证方法**:编译所有调用并读回 iteration 设置;构造需要再次 ready_to_end 的受控流程,检查结束条件和上限符合预期。 - **适用条件**:直接访问 max_ready_to_end_iter 或 get_ready_to_end_count。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API + 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_phase.svh:539`(`int unsigned max_ready_to_end_iter = 20;` public 字段)、`:591`(`get_ready_to_end_count()`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase.svh:450-451`(`local` 字段 `m_default_max_ready_to_end_iters`/`max_ready_to_end_iters`)、`:159-168`(`set/get_max_ready_to_end_iterations()`、`set/get_default_max_ready_to_end_iterations()`,实现 `:1093-1115`) - **差异说明**:旧行为——可直接读写 `phase.max_ready_to_end_iter`;新行为——字段变 local,直接访问编译失败,须用访问器;且新增"默认值"静态访问器,可全局改默认(1.2 只能逐个 phase 改)。`get_ready_to_end_count()` 无替代、直接删除(1.2 中本就属 NODOCS 内部接口)。 - **迁移动作**:将 phase.max_ready_to_end_iter = n 改为 phase.set_max_ready_to_end_iterations(n),读字段改为 phase.get_max_ready_to_end_iterations()。旧 get_ready_to_end_count() 无等价公开替代;若它参与退出判断,改为明确的业务完成条件,若仅用于统计则在自己的回调中计数。 - **兼容说明**:旧字段和 get_ready_to_end_count 不再提供;迭代上限使用访问器,退出条件或统计自行维护。 - **标准依据**:IEEE 1800.2-2020 §9.3.1.3.5(源码注释明确初始值 20 出自该节) #### 6. uvm_phase::get_objection() 行为变化(惰性创建 + 仅 task phase 有效) - **页面标题**:通过 get_objection() 获取 task phase 的 objection - **内容类型**:用户接口与行为 - **验证方法**:检查实际 task phase 的 get_objection 非空;function phase 按接口限制处理,不使用未初始化 phase_done 判断运行阶段。 - **适用条件**:直接访问 phase_done,或对 function phase 请求 objection。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_phase.svh:357`(`get_objection(); return this.phase_done;`);`phase_done` 在 `add()` 时创建(`:885-892`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase.svh:567-580`(非 `UVM_PHASE_NODE` 或 imp 非 `uvm_task_phase` 时返回 `null`;否则惰性创建 `{name}_objection`) - **差异说明**:两侧对 function phase(build/connect 等)都返回 null 并在 raise/drop 时经 `m_report_null_objection` 报错,此点一致。差异在于:① 2.0 惰性创建,`get_objection()` 的副作用时点改变(`phase_done` 字段 1.2 在 add 后即非 null,2.0 首次调用前为 null);② run phase 返回值从 test_done 单例变为普通 objection(见条目 3)。依赖 `phase.phase_done` 字段直接判空/取名的代码行为改变。 - **迁移动作**:用 `get_objection()` 代替直接访问 `phase_done` 字段;不要假设其非空。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **标准依据**:IEEE 1800.2-2020 §9.3.1.7(仅 task-based phase 节点提供 objection 接口,其余类型调用 raise/drop/get_objection_count 应报错) ##### 修改前后 只做 raise/drop 的 task phase 代码直接使用传入的 `phase.raise_objection(this)` / `phase.drop_objection(this)`,无需手工访问对象。 确需读取 objection 句柄时,`obj` 声明为 `uvm_objection`: ```systemverilog // UVM 1.2 dependency on eager initialization obj = phase.phase_done; // UVM 2.0: use the accessor, which may create the objection obj = phase.get_objection(); ``` 两行是替换关系。返回 null 时先确认传入的是实际 task phase 节点;build/connect 等 function phase 不提供该对象,不要自行 new 一个 objection 冒充 phase 的控制对象。 #### 7. 新增 uvm_phase_hopper 类,phase 执行引擎从 uvm_phase 迁出 - **内容类型**:内部实现 - **验证方法**:记录自定义 domain 中各节点执行顺序和次数;验证所用 traverse/execute override 仍被调用,不能仅以基础 L2 顺序代替自定义调度。 - **适用条件**:定制 phase traverse/execute,或依赖旧 phase 内部执行入口。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:新增 API + 内部重构 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_phase.svh:613`(`static task m_run_phases()`,实现 `:2202`)、`execute_phase()` 实现 `:1303`(均为 local/internal) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase_hopper.svh:44`(新类,744 行整文件新增),单例访问 `get_global_hopper()` `:60`,调度主循环 `run_phases()` `:169`,`execute_phase()` `:197`(实现 `:413`),扩展钩子 `traverse_on()` `:237` / `execute_on()` `:251` - **差异说明**:原 `uvm_phase` 内部的调度/执行逻辑整体迁入 `uvm_phase_hopper`(经 `uvm_coreservice_t::get_phase_hopper()` 获取)。`uvm_task_phase`/`uvm_topdown_phase`/`uvm_bottomup_phase` 的 `traverse` 相应改调 `hopper.traverse_on/execute_on`(如 `uvm_task_phase.svh:86-114`)。默认行为不变:`traverse_on` 默认仍调 `imp.traverse()`,用户自定义 phase 的 `traverse/execute` 重写继续生效;高级用户可通过扩展 hopper 改变 phase 遍历/执行方式。普通用户无感知。 - **迁移动作**:无(仅当曾依赖 `uvm_phase::m_run_phases` 等 internal 接口时需改走 hopper)。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 8. uvm_phase::add() 新增 start_with_phase / end_with_phase 参数 - **页面标题**:自定义 phase 图:新增位置参数与诊断变化 - **内容类型**:用户接口与行为 - **验证方法**:对合法挂接检查前驱/后继及执行顺序;对互斥参数组合检查 PH_BAD_ADD,并同步回归解析规则。 - **适用条件**:自定义 phase 图,或用旧 PH_ADD_PHASE 文案判断配置错误。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:签名变更(向后兼容) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_phase.svh:261`(`add(phase, with_phase, after_phase, before_phase)`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase.svh:233-239`(追加 `start_with_phase=null, end_with_phase=null`) - **差异说明**:新参数支持"插入区间"语义(新 phase 从 start_with 的全部前驱之后开始、到 end_with 的全部后继之前结束),便于把自定义 phase 插入 phase 图。同时校验收紧:with/after/start_with 互斥、with/before/end_with 互斥,违反报 `PH_BAD_ADD`(1.2 同类错误的 ID 为 `PH_ADD_PHASE`,消息 ID 更名)。现有合法的 4 参数调用保持兼容。 - **迁移动作**:原有合法的四参数 add 调用可保留。调整 phase 图时保持 with/after/start_with 互斥、with/before/end_with 互斥,新增参数使用命名实参避免位置混淆。日志解析将 PH_ADD_PHASE 更新为 PH_BAD_ADD,并验证前驱/后继的实际执行顺序。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### 9. 新增 jump 状态查询 API;jump(null)/set_jump_phase(null) 语义变化 - **页面标题**:phase.jump(null) 与跳转状态查询 - **内容类型**:用户接口与行为 - **验证方法**:分别核对激活和未激活节点的状态;只在允许的未激活路径清除挂起状态,正常收尾使用明确目标和 objection,禁止把 jump(null) 当通用取消。 - **适用条件**:使用 jump/set_jump_phase,尤其向其传入 null。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:新增 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_phase.svh:2008`(`set_jump_phase`,phase 未激活时对 null 也报 `JMPPHIDL` error) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase.svh:1699-1716`(未激活且 `phase==null` 时静默清除挂起的 jump 状态后返回,不报错)、`:1762`/`:1767`/`:1781`(`is_jumping_forward()`/`is_jumping_backward()`/`is_ending_prematurely()`) - **差异说明**:新增三个查询函数。清除状态的分支仅适用于 **未激活** phase 的 `set_jump_phase(null)`;激活态仍进入前驱/后继查找,不能把 `jump(null)` 当作通用取消操作,且可能进入 null 解引用路径。 - **迁移动作**:原本用 jump(null) 取消或结束运行的代码需改写:正常结束按 M03-003 释放实际 phase 的 objection,需要跳转时传入明确且合法的前驱/后继 phase。仅未激活节点的 set_jump_phase(null) 路径用于清除挂起状态;不要将其推广至激活节点。查询方向使用 is_jumping_forward()/is_jumping_backward(),提前结束状态使用 is_ending_prematurely()。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### 10. 新增 phase 图查询 API:get_predecessors / get_successors / get_sync_relationships / get_objection_total - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:不存在(内部为 `protected bit m_predecessors[uvm_phase]` 等,`src/vcs-uvm-1.2/base/uvm_phase.svh` 无公开访问器) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_phase.svh:1383`/`:1388`/`:1393`(图查询,配合 `typedef bit edges_t[uvm_phase]` `:433`)、`:1562`(`get_objection_total(uvm_object obj=null)`) - **差异说明**:phase 图结构(前驱/后继/同步关系)与 objection 总数首次提供只读公开访问器,便于调试与结构化检查(如迁移期校验自定义 domain 的挂接)。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 11. uvm_event#(T) trigger 默认数据机制:新增 set/get_default_data,reset 清数据 - **内容类型**:用户接口与行为 - **验证方法**:设置 default data,trigger 后 reset 并读回;目标应回到 default。并发等待者的采样时点按实际 TB 调度另测。 - **适用条件**:reset 后继续读取 event trigger_data,或使用默认触发数据。 - **影响类型**:静默/数据风险 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:新增 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_event.svh:309`(`trigger(T data=null)`);`reset()` 不清 `trigger_data` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh:336`(`trigger(T data=get_default_data())`)、`:370`/`:375`(`get/set_default_data`)、`:297`(`reset()` 将 `trigger_data` 重置为 default 后调 `super.reset`) - **差异说明**:默认参数从硬编码 null 变为可配置的 default data。`reset()` 后 1.2 保留旧 trigger_data,2.0 清回 default,已由 semantic_probe 对跑验证。2.0 还把 on/trigger_time/trigger_data 赋值移到事件触发前;此处仅描述源码顺序,不承诺消除用户 TB 中所有零延迟竞争。 - **迁移动作**:需要在 reset 后使用上一次数据时,在 reset 前读取并保存到用户变量;后续消费该变量,不再向已 reset 的 event 取旧值。若业务需要默认数据,显式设置 set_default_data 并按默认值语义读取;两种意图不能混用。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **标准依据**:IEEE 1800.2-2020 §10.1.2.2.4(trigger) ##### 修改前后 以下代码位于顺序执行的 task 中,`ev` 为默认 `uvm_event#(uvm_object)`,`last_item` 为 `uvm_object` 句柄,且本次数据已触发、尚未被其他进程 reset。 旧代码在 reset 后取上一次数据: ```systemverilog ev.reset(); last_item = ev.get_trigger_data(); ``` 需要保留上一次数据时,在 reset 前保存: ```systemverilog last_item = ev.get_trigger_data(); ev.reset(); // Consume last_item instead of reading the reset event again. ``` 需要访问业务字段时,先 $cast 到自己的事务类型并检查结果。该变量保存的是对象句柄;需要保留不受后续写入影响的快照时,应另行 clone 并检查转换结果。存在并发 producer/consumer 时,先用现有握手确定“数据已消费后再 reset”的边界,不能只交换两行代码就认为竞争已消除。 若真正需要的是默认数据,可在目标版设置 `ev.set_default_data(default_item)`。此后无参 `trigger()` 和 reset 后的读回都按 default data 语义处理;这不会自动保存每次触发的历史数据。 #### 12. uvm_event 系 get_type_name() 返回值变化 - **内容类型**:用户接口与行为 - **验证方法**:打印实际 get_type_name,并运行匹配规则,确保目标参数化名称可识别;不应改变 barrier/pool/queue 的无关匹配。 - **适用条件**:代码或后处理按字符串 uvm_event 匹配类型。 - **影响类型**:日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_event.svh:342`(返回 `"uvm_event"`)、`:212`(`uvm_event_base::get_type_name` 返回 `"uvm_event_base"`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh:277`(返回 `"uvm_pkg::uvm_event#(T)"`);event_base 的 `get_type_name` 由 `:40` 的 abstract utils 宏生成,仍返回 `"uvm_event_base"`,不是 ``。 - **差异说明**:按 type name 字符串做匹配/过滤/打印归档的代码(如波形或日志脚本匹配 `uvm_event`)会失配。同理 `uvm_barrier`/`uvm_pool`/`uvm_queue` 因改用宏注册,`get_type_name` 值保持不变(`"uvm_barrier"`/`"uvm_pool"`/`"uvm_queue"`),仅 event 系变化。 - **迁移动作**:按 get_type_name() == "uvm_event" 分支的代码,若目的是判断类型,改为向实际 uvm_event#(T) 句柄 $cast 并检查返回值;若仅用于日志展示,则接受目标输出 uvm_pkg::uvm_event#(T),更新字符串匹配。不要靠该字符串区分不同的 T。 - **兼容说明**:兼容措施不恢复旧类型名文本;类型判断使用实际类型,日志匹配按目标文本调整。 #### 13. uvm_queue::wait_until_not_empty() 新增;uvm_pool/uvm_queue/uvm_barrier 加入工厂注册 - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_queue.svh:36`(无该方法,亦无工厂注册);`src/vcs-uvm-1.2/base/uvm_barrier.svh:170`(手写 `type_name`,无注册) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_queue.svh:195`(`wait_until_not_empty`)、`:44`(`` `uvm_object_param_utils(uvm_queue#(T))``);`src/vcs-uvm-ieee-2020-2.0/base/uvm_pool.svh:46`/`:256`(`uvm_pool`/`uvm_object_string_pool` 注册);`src/vcs-uvm-ieee-2020-2.0/base/uvm_barrier.svh:43`(`` `uvm_object_utils(uvm_barrier)``) - **差异说明**:三者获得 factory 注册(`type_id::create` 可用),API 面其余不变;`uvm_queue` 新增 `wait_until_not_empty()` 阻塞任务。`uvm_barrier_pool`/`uvm_event_pool` typedef 保留(`uvm_pool.svh` 尾部,标注 §10.4.2.1/§10.4.1.1)。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §11.3.2.12(wait_until_not_empty,源码标注) #### 14. objection trace(+UVM_OBJECTION_TRACE)消息格式变化 - **内容类型**:用户接口与行为 - **验证方法**:对一次 raise/drop 输出运行日志解析,核对对象、objection 名称和计数;新列不得被误识别为数量。 - **适用条件**:解析 UVM_OBJECTION_TRACE 的固定列数或位置。 - **影响类型**:日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(消息/日志) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_objection.svh:178`/`:195`(`"Object %0s %0s %0d objection(s)..."`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_objection.svh:184`/`:201`(插入 objection 名字段:`"Object %0s %0s %0d %0s objection(s)..."`) - **差异说明**:trace 消息多输出一个字段(objection 实例全名),列位与列数变化;解析 OBJECTION_TRACE 输出的脚本需同步。 - **迁移动作**:保留以 report ID 为入口的 trace 解析;旧依赖列位置的正则需加入位于操作数量之后、objection(s) 之前的 objection 名称字段,并避免将其当作对象路径。使用条目中的两版 trace 样本更新期望格式,核对 raise/drop 的对象、计数和 phase;统计不能依赖固定空格数。 - **兼容说明**:兼容措施不恢复旧 trace 列布局;更新解析并核对对象、objection 名称和计数。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | Phase / Objection Verdi trace 联动 | 目标在 m_phase_trace 与 trace_mode 的追踪条件中保留 is_verdi_trace_aware_used,受 UVM_VERDI_NO_VERDI_TRACE 控制 | 相对 Accellera 的附加追踪逻辑;影响调试可见性,不能作为所有日志等价的依据。目标文件为 `src/vcs-uvm-ieee-2020-2.0/src/base/uvm_phase.svh` 和 `src/vcs-uvm-ieee-2020-2.0/src/base/uvm_objection.svh`。 | | UVM_EVENT_CALLBACK_FIX | 1.2 私有条件分支在目标移除/重写,旧库无默认 define | Callback 参数类型和改法见 M03-001。 | | FGP 锁属性与 UVM_CREATE_OPT | 1.2 存在的实现分支在目标不再沿用 | FGP 条件见 M10-007,构造路径见 M09-003;不要求普通 phase/objection 调用单独改写。 | --- ## 第 4 章 报告与命令行(reporting / command line) ### 概览 优先核对依赖 catcher、NO_ACTION 消息和宽命令行配置的路径。报告核心接口多数保留,但过滤、路由和部分默认行为发生变化;已删除的旧全局 API 需改写。验证时观察消息分类、catcher 次数及实际配置值。 ### 建议阅读顺序 先核对删除接口和宽命令行配置,再检查 catcher、报告路由及脚本判定。新增或消失的消息需解释其原因。 M04-004 → M04-018 → M04-001 → M04-007 ### 差异条目 #### 消息宏重写:新增 UVM_NO_ACTION 短路检查 - **内容类型**:用户接口与行为 - **验证方法**:发出一条已知消息,分别设置正常 action 和 NO_ACTION,统计 catcher 次数及下游计数;替代入口要保留原检查意图。 - **影响类型**:静默/数据风险、日志/调试变化 - **一句话结论**:依赖 catcher 处理 NO_ACTION 消息时需调整入口或策略;消息宏会在进入 catcher 之前短路。 - **适用条件**:通过 catcher 计数、降级或处理已被 NO_ACTION 抑制的消息时受影响;宏调用和直调函数应分别测试。 自定义消息宏也需按相同入口条件核对。 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_message_defines.svh:112`(`uvm_info` 等宏仅检查 `uvm_report_enabled`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_message_defines.svh:118`(`uvm_report_begin`)、`:143`(`uvm_info`) ;补充:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_message_defines.svh:130` - **差异说明**:2.0 消息宏增加 `get_report_action(...) != UVM_NO_ACTION` 前置条件。旧版被 NO_ACTION 抑制的消息仍能进入 catcher,新版宏层即丢弃;NO_ACTION 自身不含 UVM_CALL_HOOK 位,不能声称旧版必然触发该 hook。直接调用 `uvm_report_warning()` 的对照路径两版仍能进入 catcher,`policy_probe` / `interface_probe` 分别验证了宏与函数路径。 目标宏经 uvm_get_report_object() 获取报告对象后检查 verbosity/action,并新增成对的 uvm_report_begin / uvm_report_end 供自定义消息宏使用。原消息宏名和实参保持;VCS 1.2 的 ZEMI4UVM zemi4_uvm_attribute 属性在目标宏中移除。 - **迁移动作**:需要 catcher 统计或修改的消息,入口 action 不应先设为 UVM_NO_ACTION;让消息进入 catcher,再由 catcher 按业务规则处理并决定继续 THROW 或停止 CAUGHT。不依赖 catcher 的禁用消息可保持 NO_ACTION;改写后检查每条消息的 catcher 次数及最终计数/路由,过滤发生在不同阶段时不可只对照屏幕文本。 自定义消息宏需要接入目标报告流程时,按 uvm_report_begin / uvm_report_end 的成对结构封装原消息生成逻辑,并保留 severity、ID、verbosity 与 action 意图;使用该包装不会恢复 NO_ACTION 消息进入 catcher 的旧路径。 - **兼容说明**:兼容措施不恢复 NO_ACTION 消息进入 catcher 的旧路径;需处理的消息必须先通过宏入口过滤。 - **标准依据**:IEEE 1800.2-2020 §B.1(消息宏)、§6.3.5(action 配置) #### uvm_report_warning/uvm_report_error 默认 verbosity 改为 UVM_NONE - **内容类型**:用户接口与行为 - **验证方法**:在多个 verbosity 设置下触发 warning/error,核对实际输出和错误计数;不要将默认值变化当成关闭报错的方法。 分别从 component/global 与 sequence/item 入口发出代表消息,不能只测一种接收者。 - **适用条件**:调用 warning/error 时省略 verbosity,或依赖旧默认等级过滤。 包括从 uvm_sequence_item 继承的 sequence/item 报告方法。 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:签名变更(默认参数)+ 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_object.svh:133`(`uvm_report` 默认 ERROR→UVM_LOW)、`:170`(warning 默认 UVM_MEDIUM)、`:184`(error 默认 UVM_LOW);全局函数版 `src/vcs-uvm-1.2/base/uvm_globals.svh:231` ;补充:`src/vcs-uvm-1.2/seq/uvm_sequence_item.svh:355`、`src/vcs-uvm-1.2/seq/uvm_sequence_item.svh:403`、`src/vcs-uvm-1.2/seq/uvm_sequence_item.svh:389` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_object.svh:148`(WARNING/ERROR/FATAL→UVM_NONE)、`:188`、`:203`;全局版 `src/vcs-uvm-ieee-2020-2.0/base/uvm_globals.svh:191` ;补充:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_item.svh:378`、`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_item.svh:430`、`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_item.svh:415` - **差异说明**:旧默认 warning=UVM_MEDIUM、error=UVM_LOW;新默认一律 UVM_NONE。对宏用户无感(宏始终显式传值),但**直接调用函数且省略 verbosity 实参**的代码在显式 verbosity 配置上行为不同。 uvm_sequence_item 的对应报告方法也改为 warning/error 默认 UVM_NONE,uvm_report 的非 INFO 默认等级同步变化;通过 sequence/item 直调报告时适用同一改法。非 INFO 即使显式传高 verbosity 也不再由入口预检过滤,具体机制与 severity override 边界见 M04-003。 - **迁移动作**:核对直调 warning/error 的消息策略。2.0 中显式传高 verbosity 也不会恢复旧过滤,需通过 report action 或经过验证的 catcher 控制输出。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **标准依据**:IEEE 1800.2-2020 §F.3.2.3(函数原型即新标准默认) #### 非 INFO 消息不再做 verbosity 过滤 - **内容类型**:用户接口与行为 - **验证方法**:分别发出 INFO/WARNING/ERROR 并改变 verbosity;若必须改变 action,按 severity/ID 明确设置并验证错误判定仍符合意图。 - **适用条件**:依赖 verbosity 隐藏非 INFO 报告。 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_object.svh:144`(`if (report_enabled_checked == 0)` 对全 severity 检查) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_object.svh:159`(`if ((severity == UVM_INFO) && ...)`) - **差异说明**:直调高 verbosity 的 WARNING 在 1.2 可能被滤掉,2.0 的预检只处理调用入口为 UVM_INFO 的情况。severity override 位于后续处理链路,降级成 INFO 不会重新执行此处过滤;`interface_probe` 中高 verbosity warning 降级后在 2.0 仍进入 catcher。最终输出还取决于 catcher、action 和自定义 server,不能表述为必发。 uvm_sequence_item::uvm_report 的入口预检同样只对 UVM_INFO 生效;省略 verbosity 的默认值变化见 M04-002。 - **迁移动作**:若有用 verbosity 压制 WARNING 的用法,改为明确的 action 或经过验证的 catcher 策略;仅 severity override 为 INFO 不会恢复入口处的过滤。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **标准依据**:IEEE 1800.2-2020 §6.3.3("Verbosity is ignored for warnings, errors, and fatals") #### 删除:全局 deprecated 函数与对象 - **页面标题**:旧全局配置、timeout 和 stop 函数需要改写 - **内容类型**:用户接口与行为 - **验证方法**:编译每种替代调用;配置检查 scope、set/get 的同一类型参数、完整宽值及对象身份,写入后修改原对象以验证克隆隔离。超时用受控测试验证,结束控制使用 M03-003 的完成标志验收。 - **适用条件**:调用已删的全局配置、timeout、test_done 或 stop 函数。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_globals.svh:63`(`uvm_test_done`)、`:71`(`global_stop_request`)、`:85`(`set_global_timeout`)、`:99`(`set_global_stop_timeout`)、`:341/364/388`(全局 `set_config_int/object/string`,均位于 `` `ifndef UVM_NO_DEPRECATED `` 内) - **2.0 位置**:全部删除(`src/vcs-uvm-ieee-2020-2.0/base/uvm_globals.svh` 中无对应符号) - **差异说明**:1.2 中已标记 DEPRECATED 的全局仿真控制/配置函数在 2.0 彻底移除,引用即编译错误。`set_global_timeout` → `uvm_root::get().set_timeout()`(或 `uvm_top.set_timeout`);`uvm_test_done`/stop 机制改为明确完成条件与 objection;全局 `set_config_*` 可转调 root 的同名组件方法,或按下面的类型、scope 与克隆契约迁移到 `uvm_config_db`。 - **迁移动作**:全局配置调用优先改为 `uvm_root::get().set_config_int/object/string(...)`,保留原实参与 object 的 clone 标志;这些组件方法在目标主库仍存在(M01-015),不需要 deprecated 开关。统一改用 config_db 时,必须同步类型、作用域和克隆契约,详见下面的映射。timeout 改 `uvm_root::get().set_timeout(...)`;stop 的收尾超时按 M03-002 单独设计。 - **兼容说明**:已删除的全局入口不恢复;主库组件 set_config_* 方法仍可承接配置,类型、scope 与克隆意图须保留。 ##### 修改前后 只迁移已删除的全局入口时,可保留组件配置方法的语义: ```systemverilog // Before: global functions in UVM 1.2. uvm_pkg::set_config_int("uvm_test_top.env.*", "limit", 64'h1234567801234567); uvm_pkg::set_config_object("uvm_test_top.env.*", "cfg", cfg, 1); // After: methods retained by the target library. uvm_root::get().set_config_int("uvm_test_top.env.*", "limit", 64'h1234567801234567); uvm_root::get().set_config_object("uvm_test_top.env.*", "cfg", cfg, 1); ``` 全局函数旧实现转调 root 的组件方法;目标保留相同配置入口。对象 setter 默认 `clone=1`,而 `config_db::set` 不自动克隆。 需要进一步统一到 config_db 时,按下表同步所有读写方: | 旧全局接口 | config_db 的类型参数 T | |---|---| | set_config_int | `uvm_bitstream_t` | | set_config_string | `string` | | set_config_object | `uvm_object` | 对应调用形式为: ```systemverilog uvm_config_db#(T)::set(null, inst_name, field_name, value); ``` `null` context 保留从 root 开始的完整路径。整数配置原本使用 `uvm_bitstream_t`;直接换 `#(int)` 既可能截断,也无法被旧类型 getter 找到。对象配置若改为具体类型,所有读写方必须同步使用同一类型参数。 对象还需明确共享句柄还是克隆。旧 setter 和 get_config_object 的 clone 参数、自动配置路径中的消费者克隆都要核对,不能只在 set 前 clone 一次就认定等价。 新增 `guidance_probe` 对跑确认:旧全局入口与目标 root 方法均保留 64 位值、写入克隆和消费者克隆;错误的 `#(int)` 查询返回未命中,直接 config_db 对象 set/get 共享原句柄。已有 component 的 set/get_config_* 无需因全局函数删除而批量改写。 #### 删除:reporting 类中的 deprecated 方法 - **内容类型**:用户接口与行为 - **验证方法**:编译派生 server,触发一条 INFO 和一条 ERROR;确认自定义处理仍被调用、消息路由和计数正确。 - **适用条件**:调用旧 report server 方法,或派生类覆盖已删除的 reporting 接口。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_object.svh:627`(`get_report_server`);`src/vcs-uvm-1.2/base/uvm_report_server.svh:919`(`process_report`)、`:954`(`compose_message`) - **2.0 位置**:均不存在(`uvm_report_object.svh`、`uvm_report_server.svh` 全文无此符号) - **差异说明**:`get_report_server()` 删除,改用 `uvm_report_server::get_server()`;`process_report()`/`compose_message()`(连同 `` `UVM_DEPRECATED_REPORTING `` 分支)删除,自定义 server 需重写 `execute_report_message`/`compose_report_message`。 - **迁移动作**:把对象 get_report_server() 调用改为 uvm_report_server::get_server()。自定义格式移到 compose_report_message,自定义 action 处理移到 execute_report_message;新参数为 uvm_report_message,不能只把旧方法改名后保留原形参。具体目标签名与默认行为保留方式见下方。 - **兼容说明**:旧 report server 方法不再提供;改用 uvm_report_message 接口并保留格式与 action 处理。 ##### 修改前后 调用端改用全局 server 访问器: ```systemverilog // UVM 1.2 server = reporter.get_report_server(); // UVM 2.0 server = uvm_report_server::get_server(); ``` 自定义输出格式时,下面是派生 `uvm_default_report_server` 中的方法示例: ```systemverilog virtual function string compose_report_message( uvm_report_message report_message, string report_object_name = ""); return {"[team] ", super.compose_report_message(report_message, report_object_name)}; endfunction ``` 新入口通过 `report_message.get_severity()`、`get_id()`、`get_message()` 等读取旧分散实参。若原 `process_report` 还定制了 action 处理,移到以下目标原型: ```systemverilog virtual function void execute_report_message( uvm_report_message report_message, string composed_message); // Add the intended custom handling here. super.execute_report_message(report_message, composed_message); endfunction ``` 此示例保留默认 action、计数与退出处理。不要在自定义方法和 super 中重复计数或写出同一消息;需要完全接管时须自行实现这些契约。仅定制格式无需同时重写 execute。构造新 server 后通过 `uvm_report_server::set_server(server)` 安装,并触发真实消息验证自定义钩子生效。 #### 删除:uvm_status_container 与 uvm_scope_stack 类 - **内容类型**:内部实现 - **阅读主题**:09 - **验证方法**:编译移除旧类型后的对象操作;通过 comparer/printer 等实际返回值检查结果,不再读取旧全局状态容器。 - **适用条件**:直接使用 uvm_status_container 或 uvm_scope_stack 类型。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_misc.svh:63`(`uvm_scope_stack`)、`:206`(`uvm_status_container`) - **2.0 位置**:全库无此类(`uvm_misc.svh:64` 起仅剩 typedef 前置声明) - **差异说明**:两者是老 field automation 的内部支撑类(`uvm_object::__m_uvm_status_container` 同步移除)。主流环境极少直接引用,但 custom field automation/printer 扩展可能触碰。 - **迁移动作**:命中引用即需随 field automation 重构一并改写(详见 field 自动化模块章节)。 - **兼容说明**:旧 status container 和 scope stack 类不再提供;随 automation 迁移到对应策略接口。 #### report_summarize 签名与文件路由行为变化 - **内容类型**:用户接口与行为 - **验证方法**:分别输出到 stdout 和目标文件,检查摘要位置;summary 后发一条消息,验证报告文件设置被正确恢复。 - **影响类型**:日志/调试变化、其他行为变化 - **一句话结论**:stdout 使用默认参数或 UVM_STDOUT;显式文件摘要后,按后续输出需求保存并恢复报告文件配置。 - **适用条件**:传入 report_summarize(0)、复用报告文件配置或依赖低 verbosity 下摘要路由的代码需核对。 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:签名变更 + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_server.svh:172`(声明 `file = 0`)、`:878`(实现忽略 file,恒以 `uvm_info`@UVM_LOW 打到标准输出) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_server.svh:180`、`:903`(`file = UVM_STDOUT`;实现拆为 `report_summarize`→`summarize`→`m_report_summarize` 递归保护结构,`:910`/`:915`) - **差异说明**:旧行为:传入的 file 参数被忽略,summary 始终走正常 UVM_INFO(UVM_LOW) 消息通道(可被该 id 的 action/file 配置影响);新行为:file==UVM_STDOUT 时以 UVM_INFO(UVM_NONE) 打出,否则临时切 UVM_LOG 写入指定文件。`uvm_report_catcher::summarize()` 同样新增 `file` 参数并按同策略路由(1.2 `src/vcs-uvm-1.2/base/uvm_report_catcher.svh:693` → 2.0 `src/vcs-uvm-ieee-2020-2.0/base/uvm_report_catcher.svh:645`)。另新增 `dump_server_state()`(`uvm_report_server.svh:236`)。 - **迁移动作**:推荐省略实参或显式用 UVM_STDOUT;旧 report_summarize(0) 在目标版走 UVM_LOG 到句柄 0,不再表达 stdout。传入有效文件时,目标只恢复 action,未恢复 UVM/REPORT/SERVER 的 ID 文件配置(`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_server.svh:959`);需要复用原配置时调用方保存/恢复文件句柄。report_probe 已验证路由位、低 verbosity 可见性及恢复写法,未以捕获消息替代实际落盘集成验收。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### UVM_FILE 相关常量值变化(UVM_STDOUT=1 → 32'h8000_0001) - **内容类型**:用户接口与行为 - **验证方法**:使用符号常量分别输出到 stdout、stderr 和文件;确认路由正确且没有把目标文件描述符误当 MCD 掩码。 - **适用条件**:比较 UVM_STDOUT 与数字 1,或硬编码 MCD/文件描述符。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化(常量值)+ 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_printer.svh:26`(`parameter UVM_STDOUT = 1`);`src/vcs-uvm-1.2/base/uvm_object_globals.svh:313`(`typedef int UVM_FILE`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object_globals.svh:609`(typedef)、`:611-613`(`UVM_STDIN=32'h8000_0000 / UVM_STDOUT=32'h8000_0001 / UVM_STDERR=32'h8000_0002`) - **差异说明**:UVM_STDOUT 由 MCD 形式 1 变为文件描述符形式 32'h8000_0001,新增 STDIN/STDERR。SV 中 MCD 1 仍可写 stdout,但不能再用 `handle==1` 判断是否等于目标 UVM_STDOUT。summary 的 file=0 特判已消失,应改用符号常量或省略参数,见 M04-007。 - **迁移动作**:表达 UVM 标准输出时用 UVM_STDOUT 替代硬编码 1,比较改为 handle == UVM_STDOUT;标准错误用 UVM_STDERR。保留 $fopen 返回的实际句柄,不要把目标文件描述符与旧 MCD 掩码按位拼接。report_summarize 的 stdout 调用按 M04-007 省略参数或显式传 UVM_STDOUT。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **标准依据**:IEEE 1800.2-2020 §F.2.9(常量值即标准规定) #### 消息时间戳默认由 $time 改为 $realtime - **内容类型**:用户接口与行为 - **验证方法**:发出含小数时间和附加元素的消息,检查精度、字段层次及日志解析,更新有解释的 golden。 - **适用条件**:使用时间戳/固定消息文本作为 golden 或解析结构化 report 元素。 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_server.svh:828`(`` `ifdef UVM_USE_REALTIME_IN_MSGS ``,默认 `$time`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_server.svh:854`(恒 `$realtime`) - **差异说明**:`compose_report_message` 的时间字段恒用 `$realtime`;`UVM_USE_REALTIME_IN_MSGS` 宏在 2.0 无任何效果。timescale 精度下日志时间戳格式可能变化,影响黄金日志 diff。另外 report_message.do_print 从打印附加元素容器改为逐个打印元素(`src/vcs-uvm-1.2/base/uvm_report_message.svh:579`;`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_message.svh:576`),自定义 printer 和结构化日志解析也需核对层次变化。 - **迁移动作**:日志时间戳解析由仅接受整数改为允许实际 $realtime 输出的小数形式;比较时按日志中的时间单位归一化,不截掉小数部分。时间解析与 severity、ID、消息内容分别处理,再更新回归基线;报告调用本身可保留。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### uvm_report_object 的 report handler 改为懒创建 - **内容类型**:内部实现 - **验证方法**:通过 get_report_handler 获取句柄并断言非空;设置 severity/action 后发出消息,确认新 handler 配置生效。 - **适用条件**:首次 reporting 调用前直接读写 m_rh。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无需启用 - **类型**:行为变化(内部实现外溢) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_object.svh:93`(构造函数内创建 `m_rh`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_object.svh:92`(`m_rh_set`)、`:93`(`m_rh_init`)、`:275` 起各方法首行调用 `m_rh_init()` - **差异说明**:2.0 构造函数不再创建 `m_rh`,首次使用任一 reporting 方法时才创建。直接读写 `m_rh` 成员(非标但大环境中存在)在首次 API 调用前会拿到 null。 - **迁移动作**:直接引用 `.m_rh` 的代码改走 `get_report_handler()`。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### get_arg_matches 重用统一匹配接口,/regex/ 仍保留正则语义 - **内容类型**:用户接口与行为 - **验证方法**:用匹配和不匹配参数各运行一次,比较命中数;关闭 DPI 的构建单独测试,不将默认 DPI 结果推广过去。 - **适用条件**:使用 get_arg_matches 的 /regex/,或自行关闭 DPI。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_cmdline_processor.svh:128`(DPI `uvm_dpi_regcomp/regexec` 真正则) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_cmdline_processor.svh:229`(改走 `uvm_is_match`,保留斜杠正则识别;`UVM_CMDLINE_NO_DPI` 分支移除) - **差异说明**:2.0 改走 `uvm_is_match()`,但 DPI 的 glob 转换会识别斜杠包围的表达式并保留正则语义,不能仅因调用了 deglob 接口就推断正则失效。`/^\\+REVIEW_ARG=(red|green)[0-9]+$/` 匹配 `+REVIEW_ARG=green123` 的双库实测均命中一次。非斜杠前缀匹配路径保留;无 DPI 条件需要单独验证。 - **迁移动作**:正常 `/regex/` 用法无需为此改写为 glob。自行编译且关闭 DPI 的环境单独核对匹配支持范围。 - **兼容说明**:原 /regex/ 调用无需兼容开关;关闭 DPI 的构建仍须核对匹配支持范围。 #### 版本宏体系与 uvm_revision_string 变化 - **内容类型**:用户接口与行为 - **阅读主题**:09 - **关联主条目**:M09-008 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M09-008。 #### uvm_object_globals 字段标志位重构 - **内容类型**:用户接口与行为 - **阅读主题**:09 - **验证方法**:用符号常量重建掩码,分别验证 copy/compare/print/pack/set;不要只比较枚举的数字是否相同。 - **适用条件**:硬编码 field FLAG 数值或跨语言传递这些掩码。 - **影响类型**:静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(常量值) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_object_globals.svh:180-182`(`UVM_DEFAULT/UVM_ALL_ON/UVM_FLAGS_ON` 位掩码字面值)、`:202-203`(`UVM_READONLY=(1<<15)`、`UVM_NODEFPRINT=(1<<16)`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object_globals.svh:215-216`(`UVM_READONLY=UVM_NOSET=(1<<12)`、`UVM_NODEFPRINT=(1<<15)`)、`:218-223`(标志改由 `uvm_field_flag_t` 组合,新增 `UVM_UNPACK/UVM_SET` 等位) - **差异说明**:COPY/COMPARE/PRINT/RECORD/PACK 的正负位保持;UNPACK/SET、READONLY、NODEFPRINT 与递归策略位改变,DEFAULT 也改为 ALL_ON。不能概括为所有位重排或所有符号写法透明。符号位运算本身合法,但只提供负向位仍有 M09-002 的 no-op 风险;硬编码旧位值必须改写。 - **迁移动作**:将硬编码 FLAG 数字改为对应的 UVM_COPY/COMPARE/PRINT/PACK/RECORD 及禁用位符号,不能按旧数字直接复制掩码。只禁用部分操作的声明按 M09-002 保留禁用位并显式启用其他所需操作;自动配置等自定义位另外核对目标编码。 - **兼容说明**:旧 FLAG 数字编码不恢复;legacy field 开关仅处理操作使能语义,不能替代符号掩码改写。 #### report hooks 与 1.1d-compat 方法在 2.0 保留且不再受 UVM_NO_DEPRECATED 控制 - **内容类型**:用户接口与行为 - **影响类型**:日志/调试变化 - **处理级别**:无需改动 - **兼容机制**:主库保留 - **类型**:行为变化(编译开关失效) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_object.svh:481`(整段 deprecated 块)、`:537`(`report_hook`);`src/vcs-uvm-1.2/base/uvm_report_handler.svh:642`(`run_hooks`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_object.svh:591`(`report_hook`,标注 `@uvm-compat 1.1d`);`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_handler.svh:777`(`run_hooks`);`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_server.svh:586`(UVM_CALL_HOOK 调用条件) - **差异说明**:`report_hook/report_*_hook`、`report_header/die/report_summarize/set_report_max_quit_count/dump_report_state` 在 2.0 全部保留并常驻(不再能用 `UVM_NO_DEPRECATED` 裁掉),UVM_CALL_HOOK → run_hooks 链路照常工作。hook 类代码无需为本条改动。 - **迁移动作**:无。 - **兼容说明**:主库保留上述 report 方法,无需 deprecated 开关或独立 compat 包。消息到达 report server 且 action 包含 UVM_CALL_HOOK 时才调用 hook 链路;这不恢复消息宏在 UVM_NO_ACTION 时被提前过滤的路径,相关变化见 M04-001。 #### 新增 API(uvm_globals / uvm_misc) - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_globals.svh:287`(`uvm_string_to_verbosity`)、`:343`(`get_core_state`)、`:369`(`uvm_init`)、`:530`(`uvm_string_split`)、`:703`(`uvm_shared#(T)`);`src/vcs-uvm-ieee-2020-2.0/base/uvm_object_globals.svh:640` 起(`uvm_core_state` 枚举,§F.2.10) - **差异说明**:新增库初始化/状态查询(`uvm_init`/`get_core_state`)、字符串转 verbosity、与 `uvm_split_string` 语义不同的 `uvm_string_split`(保留空字段,旧函数跳过空字段)。另 `uvm_re_match` 新增 `deglob` 默认参数(`src/vcs-uvm-ieee-2020-2.0/dpi/uvm_regex.svh:40`),`uvm_is_match` 改经 deglob=1 实现;不能把调用重构推导为所有开关下都等价,缓存模式问题见 M10-006。 - **迁移动作**:无(存量代码不受影响;注意 `uvm_string_split`≠`uvm_split_string`,勿混用)。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 删除:uvm_vector_to_string;uvm_cmdline_proc 由 const 变为可写 - **内容类型**:用户接口与行为 - **验证方法**:编译新字符串转换调用,比较零值、宽值及所用进制的输出;正常只读全局句柄不应被替换为任意新实例。 - **适用条件**:调用 uvm_vector_to_string 或依赖 uvm_cmdline_proc 的 const 属性。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_misc.svh:611`(`uvm_vector_to_string`);`src/vcs-uvm-1.2/base/uvm_cmdline_processor.svh:459`(`const uvm_cmdline_processor uvm_cmdline_proc`) - **2.0 位置**:`uvm_vector_to_string` 无;`src/vcs-uvm-ieee-2020-2.0/base/uvm_cmdline_processor.svh:125`(非 const 全局,在 `get_inst()` 内赋值) - **差异说明**:`uvm_vector_to_string` 删除,改用 `uvm_bitstream_to_string`;`uvm_cmdline_proc` 去 const 化(正常只读使用无影响)。 - **迁移动作**:uvm_vector_to_string(value, size, radix, radix_str) 改为 uvm_bitstream_to_string(value, size, radix, radix_str),原实参顺序与格式意图保持;例如 text = uvm_bitstream_to_string(value, 32, UVM_HEX, "h")。不要借此改用 int 截断宽值。uvm_cmdline_proc 的普通只读使用可保留。 - **兼容说明**:uvm_vector_to_string 不再提供;改用 uvm_bitstream_to_string,保持原位宽与格式。 #### 新增文件 uvm_cmdline_report.svh(+UVM_VERBOSITY / +uvm_set_* 解析抽离) - **内容类型**:内部实现 - **验证方法**:传入一组合法和一组未命中设置,直接读回目标组件的 verbosity/action/severity;多个 UVM_VERBOSITY 仍取首个,不能假设所有未命中设置都会告警。 - **适用条件**:依赖命令行 reporting 配置优先级、参数解析及未生效告警。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:内部重构(行为保持) - **1.2 位置**:逻辑在 `src/vcs-uvm-1.2/base/uvm_root.svh:1042` 起(`m_process_verbosity` 等) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_cmdline_report.svh:25-563`(`uvm_cmdline_verbosity/uvm_cmdline_set_verbosity/uvm_cmdline_set_action/uvm_cmdline_set_severity`,NODOCS 内部类) - **差异说明**:命令行 reporting 配置解析从 uvm_root 抽为独立类并增加"used 跟踪/dump/未生效告警"能力;+UVM_VERBOSITY 多个时仍取第一个(与 1.2 一致),非法值仍 ILLVERB/NSTVERB 告警。用户可见面基本不变。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### +uvm_set_config_int 宽值经 32 位字符串转换被截断 - **内容类型**:用户接口与行为 - **验证方法**:用 0x1234567801234567 对照 int 与 bitstream 参数,断言完整 64 位读回;Applying config 日志不能代替配置值检查。 - **影响类型**:静默/数据风险 - **一句话结论**:超过32位的命令行配置改用 bitstream 参数或明确类型的 config_db 设置,并断言完整读回值。 - **适用条件**:通过 +uvm_set_config_int 注入宽整数时受影响;配置位于脚本或 filelist 时需让扫描器包含这些文件。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(配置错误风险) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_root.svh:879`(默认 sscanf 到 uvm_bitstream_t,另有 UVM_DO_NOT_USE_SSCANF 分支) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_root.svh:985`(atoi/atohex 等)、`:997`(新增 bitstream 分支) - **差异说明**:目标 int 路径使用返回 int 的字符串转换,超过 32 位的配置会截断。`command_probe` 对相同 `0x1234567801234567` 实测低 64 位为 1234567801234567 / 0000000001234567。该结论针对默认 VCS 1.2 构建;旧库若启用 UVM_DO_NOT_USE_SSCANF,本来就有窄转换限制。 - **迁移动作**:目标版本的宽配置使用 `+uvm_set_config_bitstream=uvm_test_top,wide_value,0x1234567801234567`,该替代已保持完整 64 位;也可在测试中以明确类型调用 config_db::set。必须断言实际读回配置,不能只看 Applying config 日志。 - **兼容说明**:兼容措施不修复宽值截断;使用 bitstream 配置入口或明确类型的 config_db,并检查完整读回值。 #### +UVM_STACKTRACE 不再输出报告调用栈(S10) - **内容类型**:用户接口与行为 - **一句话结论**:目标库仍解析 +UVM_STACKTRACE,但不再调用 $stack;依赖它定位报告来源的流程需要单独处理。 - **影响类型**:日志/调试变化 - **适用条件**:脚本传入 +UVM_STACKTRACE 并依赖报告发生时的调用栈。普通 UVM 消息输出不因本条停止,缺少调用栈也不能用于判断测试通过。 - **验证方法**:选择能稳定触发一条已知 severity 消息的最小测试,在两库使用相同 +UVM_STACKTRACE 设置,分别检查消息和调用栈是否出现。升级构建后重复此检查;只有消息重新带出调用栈或经过验证的替代调试流程能定位同一调用点,才核销调试能力迁移。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(调试输出) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_report_server.svh:664`、`:738-742`(解析选项并在 DISPLAY 路径调用 $stack) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_report_server.svh:646`(仍解析选项);同文件无 $stack 调用 - **差异说明**:VCS 1.2 在 DISPLAY 时按选定 severity 输出调用栈。目标库仍设置 debug/info/warn/error/fatal 标志,但移除了消费这些标志的 $stack 调用。该结论来自两版源码,尚未独立对跑验证调用栈输出。 - **迁移动作**:将依赖 +UVM_STACKTRACE 的日志提取和排障步骤列为调试流程迁移项。提交最小触发测试、完整 VCS/Verdi 版本、编译/运行参数及缺少调用栈的日志片段,通过现有产品支持渠道确认目标构建可用的报告断点或调用栈方案。当前没有经过本项目验证、可直接替换此选项的通用命令;在方案确认前保留可复现问题的 1.2 调试构建。 - **兼容说明**:兼容措施不恢复报告调用栈;当前没有已验证的通用替代命令,保留可复现问题的调试路径。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | +UVM_STACKTRACE | 目标保留解析但删除原调用路径 | 调试输出变化、条件与证据见 M04-019。 | | UVM_DISABLE_ERROR_MSG_POST_QUIT_COUNT | 两版延续 | quit-count 到顶后抑制后续 error;report_object/globals 均有实现。 | | Verdi 交互及命令行钩子 | 两版延续 verdi_set_verbosity、verdi_uvm_mailbox、UVM_VERDI_TRACE、UVM_VCS_CLP_TF、m_convert_verb | 属调试集成,不据此声明所有 Verdi 启动配置等价。 | | UVM_DIRECTC_OPTS / UVM_SV_SEED | 两版保留种子实现扩展 | 具体激励仍按随机源与场景验收,不能只比较 seed。 | | ZEMI4UVM、FGP 属性与版本后缀 | 旧消息宏中的 ZeBu 属性、report_handler 的 FGP 锁属性及 .Synopsys 后缀移除 | 版本解析见 M09-008;FGP 见 M10-007,使用 ZeBu 流程时需单独验证。 | | Catcher/message/handler/version/message 宏文件 | 目标除所述历史属性外与 Accellera 一致 | 用户可见变化仍按本模块正式条目处理。 | --- ## 第 5 章 config_db 与 resource_db ### 概览 常规 `uvm_config_db#(T)::set/get/exists/wait_modified` 签名保持。直接使用 resource 自管理接口的代码需检查删除项;按名查询、override 和 precedence 需按实际资源集合验证。目标库增加 implementation 委托并拆分资源类文件,内部文件重组本身不要求修改常规 config_db 调用。 ### 建议阅读顺序 普通 config_db 用户先看适用范围;直接操作 resource/pool 的代码重点检查入池、单侧 override 和选择优先级。 M05-003 → M05-001 → M05-005 → M05-010 ### 差异条目 #### uvm_resource#(T) 自管理接口 set() / set_override() / get_by_name() / get_by_type() 被删除 - **内容类型**:用户接口与行为 - **验证方法**:按下方连续示例核对入池前不可查询、入池后对象身份和值、特殊 precedence 及 name/type 查询顺序;多 scope、多 type 和动态 type handle 按实际代码扩展检查。 - **影响类型**:编译断点 - **一句话结论**:将资源对象的自管理接口迁移到 resource_pool/resource_db,并保留 scope、查询类型与单侧 override 意图。 - **适用条件**:直接调用资源对象的 set/set_override 或静态查询时需要修改;常规 config_db 调用按 M05-003 核对。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:1496`(set)、`:1511`(set_override)、`:1527`(get_by_name)、`:1559`(get_by_type) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource.svh:42`(整个类已无这些方法,见 42–245 行);替代接口在 `src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_pool.svh:208`(set_scope)与 `src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_db.svh:70` 起 - **差异说明**:IEEE 1800.2-2020 中 `uvm_resource#(T)` 只保留 read/write 类型安全访问接口,资源的入池/置顶/按名按型查找职责全部上移到 `uvm_resource_pool` 和 `uvm_resource_db`。1.2 中的 `rsrc.set()`、`rsrc.set_override()`、`uvm_resource#(T)::get_by_name(scope,name,rpterr)`、`uvm_resource#(T)::get_by_type(scope,type_handle)` 在 2.0 中**编译即报错**。附带影响:1.2 供派生资源子类型使用的 `` `UVM_RESOURCE_GET_FCNS`` 宏在 2.0 仍有定义(`uvm_resource_specializations.svh:48`)但其展开体引用了已删除的静态方法,用户一旦使用该宏即编译失败;内置 `uvm_int_rsrc`/`uvm_string_rsrc` 等特化类 2.0 已不再使用它。 - **迁移动作**: - `rsrc.set()` → `uvm_resource_pool::get().set_scope(rsrc, scope)` - `rsrc.set_override(ovr)`:默认 name+type 双置顶用 `rp.set_override(rsrc, scope)`;仅 name/type 时分别用 `set_name_override` / `set_type_override`;ovr=0 用 `set_scope`。保留原掩码意图,不能无条件替换为双置顶。 - `uvm_resource#(T)::get_by_name(scope, name, rpterr)` → `uvm_resource_db#(T)::get_by_name(scope, name, rpterr)` - `uvm_resource#(T)::get_by_type(scope, type_handle)`:仅在 type_handle 就是 T 的类型句柄时改用 `uvm_resource_db#(T)::get_by_type(scope)`;动态类型句柄应保留 pool 查询和 cast/null 检查。 - 自定义资源子类型中使用了 `` `UVM_RESOURCE_GET_FCNS`` 的,删除该宏调用,改用 `uvm_resource_db`/`uvm_resource_pool` 查询。 - **兼容说明**:资源对象的 set/set_override 和旧静态查询不再提供;pool/DB 替代仍须保留 scope、类型和 override 意图。 - **标准依据**:IEEE 1800.2-2020 §C.2.5(uvm_resource#(T) 仅提供 store/read/write 访问方法)、§C.3.2(uvm_resource_db) ##### 修改前后 下面的普通 `uvm_resource#(int)` 在 `env.agent` 中发布 `limit=42`。旧版通过资源对象入池;目标改用 pool,构造函数的显式 scope 可以保留。声明和操作位于同一 initial 或 function 中,且先声明变量。 ```systemverilog // UVM 1.2 uvm_resource#(int) r; r = new("limit", "env.agent"); r.write(42); r.set(); r.precedence = 2000; ``` ```systemverilog // UVM 2.0 uvm_resource_pool rp = uvm_resource_pool::get(); uvm_resource#(int) r, selected; r = new("limit", "env.agent"); r.write(42); rp.set_scope(r, "env.agent"); rp.set_precedence(r, 2000); // 特殊优先级在入池后设置 selected = uvm_resource_db#(int)::get_by_name("env.agent", "limit"); if (selected == null) `uvm_fatal("RESOURCE", "Missing resource") if (selected.read() != 42) `uvm_fatal("RESOURCE", "Unexpected value") selected = uvm_resource_db#(int)::get_by_type("env.agent"); if (selected != r) `uvm_fatal("RESOURCE", "Unexpected resource") ``` 此处 scope 内只有一个 int 资源;`get_by_type` 不按名字筛选。同名同类型出现不同 precedence 的竞争资源后,直接 `get_by_name` 的目标实现风险见 M05-010,可按其边界使用下面的显式选择;此块是独立代码片段,拼接到前例时复用已有 rp/selected 声明: ```systemverilog uvm_resource_types::rsrc_q_t candidates; uvm_resource_base winner; uvm_resource#(int) selected; uvm_resource_pool rp = uvm_resource_pool::get(); candidates = rp.lookup_name("env.agent", "limit", uvm_resource#(int)::get_type()); winner = rp.get_highest_precedence(candidates); if (winner == null) `uvm_fatal("RESOURCE", "Empty selection") if (!$cast(selected, winner)) `uvm_fatal("RESOURCE", "Unexpected resource type") ``` Override 在资源入池时选择,一次注册使用一种入口;不要先 `set_scope` 再对同一资源重复入池。`replacement` 为尚未入池且已写好值的资源,原 name-only 意图对应: ```systemverilog // UVM 1.2 replacement.set_override(uvm_resource_types::NAME_OVERRIDE); // UVM 2.0 rp.set_name_override(replacement, "override_case"); ``` 上面两行是两版替换关系,不同时执行。Type-only 对应 `set_type_override`,name+type 对应 `set_override`。单侧 override 控制相同 precedence 时的索引顺序;需要特殊 precedence 时,在选定的入池调用之后设置。动态 type handle 或返回子类型的情况仍按上方映射处理。 ##### 已有实测结果 `resource_migration_probe` 在两库均确认:入池前显式 scope 可匹配、数据库查不到该普通资源;入池后按名读回 42、按 type 得到同一对象,precedence 保持 2000。加入值 99、precedence 1000 的竞争项后,显式选最高项仍读回 42;相同 precedence 的 name-only override 按名得到 22,按 type 仍得到原值 11。实验不覆盖动态类型句柄、任意审计副作用或定制 coreservice。 #### 资源构造 scope 仍有效;对象 set() 删除后改由 pool 入池 - **内容类型**:用户接口与行为 - **验证方法**:构造带显式 scope 的资源,分别在入池前后检查 match_scope 和查询;不要解析 get_scope 的内部正则格式。 - **一句话结论**:普通 uvm_resource 的显式构造 scope 仍有效,两版都需入池;需替换的是资源对象的 set(),并核对 get_scope 表现形式。 - **适用条件**:普通 uvm_resource#(T) 构造后依赖 scope、入池状态或 get_scope 字符串的代码;便利特化类构造入池另见 M05-011。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:主库保留 - **类型**:签名变更 + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:231`(`uvm_resource_base::new(string name="", string s="*")`,构造即 `uvm_glob_to_re` 转换并存入 scope)、`:1423`(`uvm_resource#(T)::new(string name="", scope="")`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_base.svh:348`(`new(string name="", string s="")`,注释明示"string argument added for compatibility")、`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource.svh:68`(`uvm_resource#(T)::new(string name="", string scope="")`) - **差异说明**:两版都需要入池才能由数据库查询。2.0 构造函数仍保存并转换显式 scope,`match_scope()` 在入池前也有效;不能解释为构造参数失效。删除的是资源对象的 `set()`,主库保留的 `rp.set(rsrc)` 会委托新入池接口,亦可显式调用 `rp.set_scope(rsrc, scope)`。两版 DPI 都支持 glob 和 `/regex/`;2.0 改用 `uvm_is_match`,并允许资源池保存原始 scope。`get_scope()` 形式取决于构造转换或显式入池路径,不再保证返回旧版无斜杠的正则串,不宜解析该内部表现形式。 - **迁移动作**:显式 `new(name, "scope")` 可保留;将资源对象的 `rsrc.set()` 改为 `rp.set_scope(rsrc, "scope")`,或使用主库保留的 `rp.set(rsrc)`。普通资源两版都必须入池才能由数据库查询;无需仅为迁移删除构造 scope。连续示例见 M05-001,未直接操作 scope 的普通 config_db 用户无需为本条改写。 - **兼容说明**:主库保留 set_scope/get_scope/match_scope 和 pool.set 兼容成员;仅在构造函数中传 scope 不会自动入池,仍须完成显式注册。 相关实现:`uvm_resource_base.svh:521-537`、`uvm_resource_pool.svh:195`。 - **标准依据**:IEEE 1800.2-2020 §C.2.3.2.1、§C.2.4.3.1 #### uvm_config_db#(T)::set 改进非空 context 下 /regex/ 拼接,优先级来源改为 coreservice - **内容类型**:用户接口与行为 - **验证方法**:在非空 context 下分别设置 /regex/ 和 glob 作用域,核对命中/不命中实例的读回值;绕过 config_db 的按 type 查询单独检查选中资源与优先级。 - **影响类型**:其他行为变化 - **一句话结论**:常规 config_db 外观调用可保留;非空 context 的正则拼接与绕过数据库的资源查询按实际用法核对。 - **适用条件**:普通 set/get 与 glob 配置不需要批量改写;自定义 coreservice、正则作用域和按 type 查询需另查条件。 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_config_db.svh:152`(set) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_config_db.svh:111`(set,委托)→ `src/vcs-uvm-ieee-2020-2.0/base/uvm_config_db_implementation.svh:267`(默认实现) - **差异说明**:① 1.2 已支持根 context 下的 `/regex/`;2.0 新增的是非空 context 全名与斜杠正则的正确分组拼接(`uvm_config_db_implementation.svh:298-308`)。② build 期优先级改从 coreservice 获取,默认实现仍读旧静态字段(M05-004)。③ 1.2 首次 set 走 `r.set_override()`(name+type 双置顶,`uvm_config_db.svh:214-218`),2.0 用 `set_scope` + `set_priority_name(PRI_HIGH)`(`uvm_config_db_implementation.svh:319,334`);绕过 config_db 按 type 查询时需核对队列顺序。④ wait_modified 的匹配入口改为 `uvm_is_match`,标准 glob 用法保留。 - **迁移动作**:常规 `uvm_config_db#(T)::set(cntxt, "env.*", ...)` 用法无需改动;`uvm_resource_base::default_precedence` 在默认 coreservice 下仍有效,新代码推荐 `uvm_resource_pool::set_default_precedence()`。 - **兼容说明**:常规 config_db 调用可保留,无需兼容开关;非空 context 的正则拼接及资源查询顺序仍按目标行为核对。 - **标准依据**:IEEE 1800.2-2020 §C.4.2.2.1 #### uvm_resource_base::default_precedence / precedence 仍有效,推荐通过访问器配置 - **页面标题**:resource precedence 的设置时机与保留写法 - **内容类型**:用户接口与行为 - **验证方法**:创建竞争资源,入池后设置特殊 precedence 并读回;检查最终选中值,避免入池重置覆盖调用方的优先级。 - **影响类型**:静默/数据风险 - **一句话结论**:默认 coreservice 下旧静态 precedence 字段仍有效;特殊实例优先级应在入池之后设置。 - **适用条件**:普通静态默认值没有强制改写要求;入池前设置实例 precedence 或自定义 coreservice 的代码需单独核对。 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:行为变化(废弃性质的兼容保留) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:214`(precedence)、`:223`(static default_precedence = 1000) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_base.svh:343-345`(两者均标注 `//@uvm-compat provided for compatibility with 1.2`);真实默认优先级在 `src/vcs-uvm-ieee-2020-2.0/base/uvm_coreservice.svh:144-146,345-349` - **差异说明**:2.0 将默认值访问委托给 coreservice,但默认 `uvm_default_coreservice_t::set/get_resource_pool_default_precedence()` **仍直接读写 `uvm_resource_base::default_precedence`**(`uvm_coreservice.svh:345-350`)。旧静态字段赋值仍有效(S5 为兼容性提示)。实例 `rsrc.precedence` 也仍用于比较(`uvm_resource_pool.svh:559-587`),并由 `set/get_precedence` 直接读写。真正的边界是首次 `set_scope()` 入池时会以默认值覆写该实例字段(`:264`);需要特殊优先级时应在入池后设置。已有自定义 coreservice 的环境需核对其实现。 - **迁移动作**:旧字段写法无强制迁移;新代码推荐 `uvm_resource_pool::set_default_precedence(...)` 或 `uvm_coreservice_t::get().set_resource_pool_default_precedence(...)`,以及 `rp.set_precedence(r, p)` / `rp.get_precedence(r)`。后一组实例级操作在资源入池后执行。 - **兼容说明**:默认 coreservice 下,主库保留的 default_precedence 静态字段仍有效;自定义 coreservice 的优先级来源和资源入池后的 precedence 仍需分别核对。 - **标准依据**:IEEE 1800.2-2020 §C.2.4.5.4 #### uvm_resource_pool 重构:set 系列改名 set_scope/set_override,新增 get_scope/delete 等 API - **内容类型**:用户接口与行为 - **验证方法**:同一资源分别用 name/type 查询,确认仅预期的索引优先级改变;显式 set_name_override/set_type_override 保留单侧意图。 - **影响类型**:静默/数据风险 - **一句话结论**:普通入池与默认双置顶可保留;旧 name-only/type-only override 掩码必须改为对应的显式单侧接口。 - **适用条件**:直接调用 resource_pool::set/set_override 并传入特殊 override 掩码时需修改;同时核对 scope 与查询侧。 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:签名变更 + 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:657`(class)、`:666`(`local function new()`)、`:714`(set)、`:768`(set_override 仅 1 参)、`:779`(set_name_override)、`:789`(set_type_override)、`:1356`(dump 仅 audit 参) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_pool.svh:122`(class)、`:144`(`function new()` 公开)、`:195`(set 保留为 `@uvm-compat`)、`:208`(set_scope)、`:277/298/319`(set_override/set_name_override/set_type_override,均新增 `string scope=""` 参数)、`:333`(get_scope,新增)、`:387`(delete,新增)、`:982`(set_default_precedence,新增)、`:1214`(dump 新增 `uvm_printer printer = null` 参数)、`:617`(sort_by_precedence_q,新增)、`:559`(get_highest_precedence 改为 static,1.2 在 `:933` 为实例方法) - **差异说明**:1.2 的 `set(rsrc, override)` 在 2.0 保留但标注 `@uvm-compat`,内部委托给 `set_scope`/`set_override`;三个 override 方法新增可选 scope 参数(向后兼容)。新增 `get_scope(rsrc, output scope)` 与 `delete(rsrc)`(1.2 无删除资源手段)。`new()` 从 local 变为 public,且 `uvm_resource_pool::get()` 改为返回 coreservice 持有的 pool(2.0 `:153-158`),用户可通过 `uvm_coreservice_t::set_resource_pool()` 整体替换资源池(1.2 的 `uvm_coreservice.svh` 无任何 resource 接口)。 - **迁移动作**:`rp.set(rsrc)` / 默认双置顶 `rp.set_override(rsrc)` 可继续使用。注意 2.0 `rp.set(rsrc, override)` 只检查 override 是否非零,旧 name-only/type-only 掩码会变为双置顶,须显式改用对应的单侧 override API。需要删除资源时使用新 `delete()`。 - **兼容说明**:主库保留 pool.set 和默认双置顶的 set_override 用法;旧单侧 override 掩码不能据此视为等价,须改用 set_name_override/set_type_override。 - **标准依据**:IEEE 1800.2-2020 §C.2.4.3.1–C.2.4.3.6、§C.2.4.5.4–C.2.4.5.6 #### 新增 config_db / resource_db implementation 类,DB 行为可工厂级替换 - **内容类型**:新增功能 - **验证方法**:对 set/get/exists/wait_modified 分别运行受控用例,检查选中值和通知次数;默认实现结果不能证明定制实现等价。 - **适用条件**:派生 config_db/resource_db implementation 或替换资源池。 - **影响类型**:其他行为变化 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无(1.2 逻辑内联于 `src/vcs-uvm-1.2/base/uvm_config_db.svh:89-298`、`src/vcs-uvm-1.2/base/uvm_resource_db.svh:54-329`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_config_db_implementation.svh:44`(uvm_config_db_implementation_t)、`:152`(uvm_config_db_default_implementation_t);`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_db_implementation.svh:30`(uvm_resource_db_implementation_t)、`:194`(uvm_resource_db_default_implementation_t) - **差异说明**:config_db 的 get/set/exists/wait_modified 等外观接口委托 implementation 实例,可经 `set_imp()` 或 factory override 定制(`@uvm-contrib`)。`trigger_modified(inst_name, field_name)` 是 implementation 类的方法,不能直接写为 `uvm_config_db#(T)::trigger_modified(...)`。接口保留不代表所有资源查询行为等价,优先级、入池和单侧 override 变化见 M05-003/004/005/010。 - **迁移动作**:常规 config_db 外观调用可保留;定制实现需覆盖既有 get/set/wait_modified 契约,并回归资源查找路径。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 审计记录下沉至 uvm_resource_debug;uvm_resource#(T) 新增 do_read/do_write 钩子 - **页面标题**:resource 审计表搬迁与读写实现 - **内容类型**:内部实现 - **验证方法**:执行一次读写,检查审计记录、访问者和回调次数;确认调试服务记录与实际资源值一致。 - **适用条件**:调试代码直接读取 rsrc.access 内部审计表。普通 read/write、record_read_access、print_accessors 调用可保留;新增 do_read/do_write 扩展按需采用。 - **影响类型**:编译断点、日志/调试变化、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:新增 API + 内部重构(有轻微行为影响) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:205`(公开成员 `access[string]`)、`:480`(record_read_access)、`:545`(print_accessors)、`:1601/1619`(read/write 内联审计) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_base.svh:200`(新类 uvm_resource_debug)、`:338`(`uvm_resource_debug dbg`)、`:483/496/510`(record_*_access/print_accessors 委托 dbg);`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource.svh:150/183`(do_read/do_write,`@uvm-contrib`) - **差异说明**:审计数据从 `rsrc.access` 移至 `rsrc.dbg.access`,直接访问 `access` 成员的调试代码编译失败;`record_read_access` 等公开方法保留、行为等价(仍受 `uvm_resource_options::is_auditing()` 控制)。read/write 主体逻辑下沉为可重写的 `do_read/do_write` 钩子,供用户定制资源读写行为。`uvm_resource_options`(turn_on/off_auditing、is_auditing)两版 API 不变。 - **迁移动作**:`rsrc.access[...]` → `rsrc.dbg.access[...]`;需要定制读写副作用时重写 `do_read/do_write` 而非修改库。 - **兼容说明**:旧 rsrc.access 成员不再提供;审计方法保留,直接数据访问改走 rsrc.dbg.access。 #### uvm_resource_converter 机制整体删除 - **页面标题**:自定义 resource_converter 已删除 - **内容类型**:用户接口与行为 - **验证方法**:将格式化逻辑迁入派生资源后打印代表值,核对输出和审计使用方;仅删除宏不能保留转换效果。 - **适用条件**:注册自定义 resource_converter 并依赖其打印格式。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API(1.2 中即为 deprecated) - **1.2 位置**:`src/vcs-uvm-1.2/deprecated/uvm_resource_converter.svh:31`(m_uvm_resource_converter 及 default/convert2string/sprint 转换器);`src/vcs-uvm-1.2/base/uvm_resource.svh:1395-1419`(`m_get_converter/m_set_converter`,`ifdef UVM_USE_RESOURCE_CONVERTER`);`src/vcs-uvm-1.2/uvm_macros.svh:49-51`(默认关闭,注释说明该机制从未被 Accellera 正式认可) ;补充:`src/vcs-uvm-1.2/deprecated/uvm_resource_converter.svh` - **2.0 位置**:无(全库 grep 无 `UVM_USE_RESOURCE_CONVERTER` / `uvm_resource_converter`) - **差异说明**:资源值转字符串的 policy 机制连同编译宏一起移除。2.0 的 `convert2string` 由 `uvm_resource_base` 经纯虚 `m_value_type_name()/m_value_as_string()` 实现(`uvm_resource_base.svh:431-437`、`uvm_resource.svh:72-78`)。仅当 1.2 环境显式 `+define+UVM_USE_RESOURCE_CONVERTER` 并注册过自定义转换器时受影响。 旧开关默认关闭;仅使用仿真器原生 %p 打印而未注册 converter 的代码无需改写。 - **迁移动作**:改用派生资源类重写 `m_value_as_string()`/`convert2string()`;未启用过该宏则无需改动。 - **兼容说明**:旧 converter 类与开关不再提供;需要原打印效果时,将格式逻辑移入派生资源。 #### uvm_resource_pool 内部表结构改用 uvm_shared 队列,rtab/ttab 类型变化 - **内容类型**:内部实现 - **验证方法**:编译改用共享包装或公开查询接口的代码,检查同名/同类型资源集合与顺序;优先级选择按 M05-010 单独验证。 - **适用条件**:直接遍历 resource_pool 的 rtab/ttab 内部队列。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:内部重构(仅影响直接访问内部成员的代码) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:661-662`(`uvm_resource_types::rsrc_q_t rtab[string]` / `ttab[uvm_resource_base]`,即 uvm_queue) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_pool.svh:124-139`(默认 `uvm_shared#(uvm_resource_base[$])`,可 `+define+UVM_DISABLE_RESOURCE_POOL_SHARED_QUEUE` 退回 uvm_queue);`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_base.svh:116-117`(uvm_resource_types 新增 `rsrc_sv_q_t`/`rsrc_shared_q_t` typedef) - **差异说明**:公开查找接口(lookup_name/lookup_type/lookup_scope 等)返回类型 `uvm_resource_types::rsrc_q_t` 不变;但 `rtab`/`ttab` 为 public 成员,直接遍历它们的调试/统计代码需按新容器类型改写(`q.value[i]` 替代 `q.get(i)`)。 - **迁移动作**:仅直接访问 `rp.rtab/ttab` 的代码需要调整;正常使用查找接口者无改动。 - **兼容说明**:正常查找接口可保留;兼容主库成员、deprecated/legacy field 开关和 compat 包不恢复旧内部表类型,直接访问须按容器配置核对。 #### resource_db::get_by_name 在 2.0 可能选中较低优先级资源(S11) - **内容类型**:用户接口与行为 - **验证方法**:构造低/高优先级竞争资源,检查选中值;显式 lookup_name 后 get_highest_precedence 应选择预期最高项,并检查 null、cast 和审计副作用。 - **影响类型**:静默/数据风险 - **一句话结论**:直接按名查询 resource 时核对实际胜出的资源;依赖优先级的路径可采用已验证的显式查找与选择方案。 - **适用条件**:同名同类型有多个资源,且代码使用 resource_db/resource_pool 按名查询时受影响;不能据此推断普通 config_db::get 同样有问题。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库优先级选择问题已复现;查询替代在限定场景通过。 - **类型**:行为变化(本实现风险) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource.svh:1010`(get_by_name 经 get_highest_precedence 取最高优先级) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_pool.svh:617`(sort_by_precedence_q)、`:681`(get_by_name 调排序后取首个 scope 命中);`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_db_implementation.svh:245`(委托) - **差异说明**:对同名同类型、scope 均命中的两资源,优先级为 9999 与 4321 时,VCS 1.2 的 `uvm_resource_db#(int)::get_by_name()` 返回 9999 对应对象,VCS 2.0 返回 4321 对应对象。源码中 `sort_by_precedence_q()` 按关联数组索引升序重建队列,而调用者取首个命中。`lookup_name()` 后显式调用 `get_highest_precedence()` 的同一组实测仍选中 9999。 - **迁移动作**:审计直接使用 resource_db / resource_pool 按名查询并依赖优先级的代码;可使用 `lookup_name(scope, name, type_handle)` 后 `get_highest_precedence()` 并检查 null、转换类型。该替代不复刻 DB 的全部审计记录,应在封装边界采用。不要仅因 config_db 内部使用资源池就推断普通 config_db::get 同样受影响。 - **兼容说明**:兼容措施不修复按名查询的优先级选择;显式查找与选最高项仅覆盖所述查询边界,审计副作用另验。 - **验证状态**:已对跑复现,见 `tests/uvm_review/policy_probe.sv`;证据摘要和观察值已归档于 `docs/review/evidence.md`。 #### 资源特化类删除返回子类型的静态 get_by_name/get_by_type - **内容类型**:用户接口与行为 - **验证方法**:编译 DB 查询替代,分别测试空结果、同值类型不同子类和预期子类;先判空再检查 cast 结果。 - **适用条件**:调用资源特化子类的静态 get_by_name/get_by_type,或假设返回的都是该子类。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API(编译断点) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource_specializations.svh:72`(uvm_int_rsrc 等通过 UVM_RESOURCE_GET_FCNS 定义静态查询) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_resource_specializations.svh:72`(特化类保留,但查询宏调用删除) - **差异说明**:uvm_int_rsrc/uvm_string_rsrc/uvm_obj_rsrc/uvm_bit_rsrc/uvm_byte_rsrc 类并未删除,其返回特化子类型的静态查询消失。构造函数现在调用 pool.set_scope,因此这组便利类型的构造还会入池,不应套用普通 uvm_resource 构造不入池的结论。 - **迁移动作**:按值类型使用 resource_db#(T)::get_by_name/get_by_type;结果为 uvm_resource#(T)。需要原特化子类型时显式检查 null 与 cast,不要假设池中同型资源都是该子类。 - **兼容说明**:特化资源类保留,旧静态查询不恢复;DB 返回基类型资源,所需子类型必须判空并 cast。 - **证据**:`tests/uvm_review/compile_extended.sv` C16。 #### VCS Resource DB 不再随 Verdi trace-aware 自动开启访问追踪 - **页面标题**:Resource DB 追踪需显式开启 - **内容类型**:用户接口与行为 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:配置变化(Synopsys 定制) - **适用条件**:旧环境依赖 Verdi trace-aware 联动开启 Resource DB 访问日志,未显式传 `+UVM_RESOURCE_DB_TRACE` 或调用追踪 API。 - **一句话结论**:目标 Resource DB 不再沿用 Verdi 自动追踪钩子;需要访问日志时显式加 +UVM_RESOURCE_DB_TRACE。 - **差异说明**:VCS 1.2 的 `uvm_resource_db_options::init()` 在未定义 `UVM_VERDI_NO_VERDI_TRACE` 时,将 `is_verdi_trace_aware_used()` 与显式 plusarg 作或运算;2.0 的独立 options 文件与 Accellera 2.0 相同,只检查 plusarg。Config DB 的 Verdi 联动仍保留,不能由 CONFIG_DB 日志存在推断 RSRCDB 也已开启。本条改变追踪开启条件,不表示资源读写数据本身发生变化。 - **迁移动作**:需要 Resource DB 访问日志时,在仿真命令加入 `+UVM_RESOURCE_DB_TRACE`;代码控制可在相关访问前调用 `uvm_resource_db_options::turn_on_tracing()`。已有显式开启配置可保留;不需要该日志的环境无需增加开关。 - **兼容说明**:显式 plusarg 和 turn_on_tracing 在两版主库可用,无需 deprecated、legacy field 开关或 compat 包。 - **验证方法**:在实际 Verdi 启动配置下做一次已知 Resource DB set/read,检查 is_tracing 和所需 RSRCDB 日志;分别核对 Config DB 与 Resource DB,避免把其中一类日志当作另一类证据。 - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_resource_db.svh:362-365`、`src/vcs-uvm-1.2/base/uvm_resource_db.svh:385-401` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_resource_db_options.svh:65-68`、`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_resource_db_options.svh:95-107` - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 追踪初始化不再包含 Verdi 联动 | 显式 plusarg 或 trace-aware:`src/vcs-uvm-1.2/base/uvm_resource_db.svh:385-401`。 | 仅显式 plusarg:`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_resource_db_options.svh:95-107`。 | - **标准依据**:Verdi 联动为 VCS 定制;Accellera 1.2/2.0 无该联动,不能用原版代替旧 VCS 行为。 ##### 已有实测结果 `vendor_migration_probe` 两库显式加 `+UVM_RESOURCE_DB_TRACE` 后,`is_tracing()` 均返回 1。联动差异由双侧源码确认;该最小实验不启动 Verdi GUI,不代表完整 trace-aware 工作流已验收。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | Config DB Verdi trace-aware | 两版延续 | config_db_options 追踪条件包含 is_verdi_trace_aware_used;不代表 Resource DB 同样自动开启。 | | Resource DB Verdi trace-aware | 1.2 有,2.0 未移植 | 显式开启访问日志见 M05-012。 | | lookup_name precedence 剪枝 | 1.2 在未定义 UVM_NO_RESOURCE_PRECEDENCE_OPT 时剪枝;2.0 不沿用 | 后接 get_highest_precedence 的路径与 get_by_name 排序路径不同;已复现风险见 M05-010,显式选择最高项见 M05-001。源码为 `src/vcs-uvm-1.2/base/uvm_resource.svh:876-919`、`src/vcs-uvm-ieee-2020-2.0/src/base/uvm_resource_pool.svh:505`。 | --- ## 第 6 章 sequence 机制(seq/) ### 概览 优先检查旧字符串式 default_sequence、响应溢出与 push 请求。目标库新增部分基类的抽象限制,删除旧式 sequence library 机制,并将多种 `uvm_do_*` 宏移入 deprecated。已有 phase default sequence 需按配置形式核对,避免把所有默认激励都视为失效。 ### 建议阅读顺序 先验证默认 sequence 确实启动,再检查两笔以上请求的交付、响应消费和异常清理。已有 phase default sequence 写法按原配置核对。 M06-001 → M06-019 → M06-008 → M06-013 Sequence/item 的报告方法与 component/global 入口共用迁移说明:默认 verbosity 见 M04-002,非 INFO 过滤见 M04-003。 ### 差异条目 #### 1. 内置 sequence 库整体删除(uvm_random_sequence / uvm_exhaustive_sequence / uvm_simple_sequence) - **内容类型**:用户接口与行为 - **验证方法**:直接类型引用先通过编译改写;字符串配置另外统计启动、完成及 driver 事务数,确保没有零激励通过。 - **适用条件**:直接引用旧内置 sequence 类型,或以旧字符串配置它们。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_builtin.svh:49`(uvm_random_sequence)、`:162`(uvm_exhaustive_sequence)、`:268`(uvm_simple_sequence),由 `src/vcs-uvm-1.2/seq/uvm_seq.svh:34` include - **2.0 位置**:文件不存在;`src/vcs-uvm-ieee-2020-2.0/seq/uvm_seq.svh` 不再 include - **差异说明**:1.2 预装进每个 sequencer 的三个内置 sequence 类连同整个 `uvm_sequence_builtin.svh` 在 2.0 中删除(1.2 中已属 deprecated 体系)。直接引用这些类型会编译失败;通过字符串配置 `default_sequence = "uvm_random_sequence"` 则仍可编译,但旧自动启动路径已移除,激励不会发出(M06-002)。 - **迁移动作**:将旧内置类型改为自己的具体 sequence;需要候选集随机选择时用 uvm_sequence_library,显式登记候选类型并检查选中次数。字符串 default_sequence 改为 phase 路径下的 wrapper/instance 配置,完整代码见 M06-002;普通显式启动可写 seq = my_seq::type_id::create("seq"); seq.start(target_seqr)。 - **兼容说明**:旧内置 sequence 类型不再提供;deprecated 开关不能恢复它们,需具体业务 sequence 或显式候选库。 - **标准依据**:IEEE 1800.2-2020 §14 无内置 sequence 定义 #### 2. uvm_sequencer_base 旧式 sequence library / 默认 sequence 机制全部删除 - **页面标题**:字符串 default_sequence 不再启动激励 - **内容类型**:用户接口与行为 - **验证方法**:迁移后检查 phase 配置路径和 wrapper/instance 类型;记录 sequence 启动次数和 driver 接收数,已有 phase 式配置保持原行为。 - **影响类型**:编译断点、静默/数据风险 - **一句话结论**:旧字符串式默认 sequence 与旧库管理接口需要迁移;已经使用 phase wrapper/instance 配置的代码可保留。 - **适用条件**:使用裸 default_sequence 字符串配置、count/max_random_count 或 add_sequence 等旧成员时需要修改。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh:443-479`(`count`、`max_random_count`、`max_random_depth`、`default_sequence`、`sequences[$]`、`add_sequence()`、`remove_sequence()`、`set_sequences_queue()`、`start_default_sequence()`、`get_seq_kind()`、`get_sequence()`、`num_sequences()`、`m_add_builtin_seqs()`),实现 `:1549-1755`(含自动启动默认 sequence 的 `run_phase` `:1751`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh` 全部不存在(该类仅 1454 行,无 run_phase) - **差异说明**:旧行为——`uvm_config_string::set(..., "default_sequence", ...)` 字符串配置 + run_phase 自动 `start_default_sequence()`;新行为——机制整体移除,旧配置**静默失效**且无 deprecated 警告,test 可能编译通过但不产生激励。 - **实测观察(VCS W-2024.09-SP2-8)**:静默失效的**只有字符串式**(`uvm_config_db#(string)`/`uvm_config_string` + 裸 `default_sequence` 字段;`uvm_config_string` typedef 在 2.0 仍保留——`base/uvm_config_db.svh:189`,deprecated 附录 C.4.2.3.2):1.2 启动(3 条 `UVM_DEPRECATED` 警告)→ 2.0 下 0 编译错、0 警告、0 报错、sequence 不跑。**实测中的两种 phase 配置均有效**:wrapper 式与 instance 式(1.2 即支持 instance,`uvm_sequencer_base.svh:1451`)两版均启动——`start_phase_sequence` 两侧逐行相同(1.2 `:1432` / 2.0 `:1335`),调用点同为 `uvm_task_phase.svh`(1.2 `:110` / 2.0 `:108`)。已有 phase 式配置无需为字符串式机制的删除改写;路径与 objection 仍按实际配置验证。 - **迁移动作**:全局扫描 `default_sequence` 字符串 config、`count`/`max_random_count` 等字段及 `add_sequence` 等调用,迁移到 phase default sequence(`uvm_config_db#(uvm_object_wrapper)::set(this, "._phase", "default_sequence", ...)`)。已是 phase 式写法的**不用动**。 - **兼容说明**:旧字符串 default_sequence 和库管理流程无兼容恢复;已使用 phase wrapper/instance 的配置可保留。 ##### 修改前后 在 test 的 `build_phase` 中,旧写法只给 sequencer 配置一个类型名字符串: ```systemverilog uvm_config_db#(string)::set(this, "env.agent.seqr", "default_sequence", "traffic_seq"); ``` 改为按运行阶段配置工厂类型;`traffic_seq` 是已用 `uvm_object_utils` 注册的业务 sequence: ```systemverilog uvm_config_db#(uvm_object_wrapper)::set( this, "env.agent.seqr.run_phase", "default_sequence", traffic_seq::type_id::get()); ``` 把层级路径换成实际 sequencer 路径。`run_phase` 后缀和 `uvm_object_wrapper` 类型都不能省略。test 仍需用实际 phase 的 objection 等待激励和检查器完成,配置默认 sequence 本身不保证仿真持续运行。 | 配置方式 | 1.2 | 2.0 | |---|---|---| | sequencer 路径 + 类型名字符串 | 可自动启动 | 不再自动启动 | | sequencer 的 phase 路径 + 类型描述对象或实例 | 可启动 | 可启动 | #### 3. uvm_sequence_base 废弃的 sequence-library 方法删除 - **内容类型**:用户接口与行为 - **验证方法**:编译显式创建或 sequence_library 改写,核对被选择的具体类型、启动次数和 parent/sequencer。 - **适用条件**:调用 sequence_base 旧库管理/按名称创建方法。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:1241-1363`(`seq_kind`、`num_sequences()`、`get_seq_kind()`、`get_sequence()`、`do_sequence_kind()`、`get_sequence_by_name()`、`create_and_start_sequence_by_name()`,`ifndef UVM_NO_DEPRECATED` 保护) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh` 全部不存在 - **差异说明**:1.2 中这些方法已打 `UVM_DEPRECATED` 警告,2.0 彻底删除,用户代码直接编译错误。 - **迁移动作**:旧库管理不再放在 uvm_sequence_base 上:把候选类型登记移到具体 uvm_sequence_library,通过 add_typewide_sequence 登记类型,用 get_sequence(idx) 查询并检查索引。若只启动固定 sequence,直接 type_id::create 后 start(target_seqr),避免仅为保留旧方法名再造序列库。 - **兼容说明**:旧 sequence_base 库管理方法不再提供;具体 sequence_library 与显式 start 须按原选择意图使用。 #### 4. uvm_sequence_base / uvm_sequencer_base / uvm_sequencer_param_base 变为抽象类 - **页面标题**:不要直接 new sequence/sequencer 抽象基类 - **内容类型**:用户接口与行为 - **验证方法**:编译具体派生类或 compat proxy;运行至少一笔请求并检查 item 类型、parent 和 sequencer 关联。 - **适用条件**:直接 new sequence_base/sequencer_base/sequencer_param_base。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:compat 包 - **类型**:行为变化(类语义) - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:134`、`src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh:41`、`src/vcs-uvm-1.2/seq/uvm_sequencer_param_base.svh:31` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:143`(`virtual class` + `` `uvm_object_abstract_utils``)、`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:50`、`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_param_base.svh:37` - **差异说明**:1.2 的 sequence_base 可直接 new;2.0 直接构造抽象类会编译失败。通过新 abstract registry 的 create 调用可编译,但无具体 override 时运行报告抽象创建错误;两条路径必须区分。声明抽象类型句柄不受影响。`uvm_sequence#(REQ,RSP)` 在 1.2 已为 virtual。库内 execute_item 改用具体 m_uvm_sqr_seq_base。 - **迁移动作**:直接构造 `uvm_sequence_base` 的代码改用具体业务 sequence,或在确需通用具体 sequence 时使用 `uvm_compat_proxy_sequence#(REQ,RSP)`。直接构造 `uvm_sequencer_base` / `uvm_sequencer_param_base` 的代码需改成匹配 REQ/RSP 的 `uvm_sequencer#(REQ,RSP)` 或业务派生 sequencer;声明基类句柄不要求改写。 - **兼容说明**:显式使用兼容包提供的类或宏后生效。`uvm_compat_proxy_sequence` 只承接 sequence 的构造,不是 sequencer 的替代类(`src/vcs-uvm-ieee-2020-2.0/compat/uvm_compat_proxy_sequence.svh:35`)。 - **标准依据**:IEEE 1800.2-2020 §14.2.1(`virtual class uvm_sequence_base extends uvm_sequence_item`) ##### 修改前后 如果原来直接构造 sequencer 基类: ```systemverilog uvm_sequencer_base seqr = new("seqr", this); ``` 改用与 driver 请求类型一致的具体 sequencer,例如 `bus_item`: ```systemverilog uvm_sequencer#(bus_item) seqr = new("seqr", this); ``` 仅声明 `uvm_sequencer_base seqr;` 句柄不受影响。sequence 一侧优先创建已有的具体业务 sequence;`uvm_compat_proxy_sequence` 只用于确需通用 sequence 对象的场景,不能替代 sequencer。 #### 5. `uvm_do_*` 宏族收缩:带 _pri/_with/_on 后缀的宏移入 deprecated - **内容类型**:用户接口与行为 - **阅读主题**:06 - **关联主条目**:M09-004 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M09-004。 #### 6. uvm_sequencer 的仲裁状态位 public → protected - **内容类型**:内部实现 - **验证方法**:编译改为合法 pull 流程后的代码;连续两笔请求核对 get_next_item/item_done 配对和 FIFO 消费。 - **适用条件**:driver 或外部组件直接写 sequencer 的仲裁状态位。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(可见性收紧) - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequencer.svh:35-36`(`bit sequence_item_requested; bit get_next_item_called;` public 成员) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_param_base.svh:47-48`(`protected bit`,上移到 param_base) - **差异说明**:slave/被动 agent 驱动中常见的技巧——直接改写 `sequence_item_requested`/`get_next_item_called` 绕过 get_next_item/item_done 配对检查——在 2.0 编译失败(protected 访问)。 - **迁移动作**:扫描驱动中对这两个字段的直接赋值;改用正规 pull 流程或派生类内操作。 - **兼容说明**:兼容措施不恢复外部访问仲裁状态位的权限;改用合法 pull 流程或派生类内操作。 #### 7. user_priority_arbitration 签名 integer → int - **页面标题**:自定义 sequence 仲裁函数改用 int 签名 - **内容类型**:用户接口与行为 - **验证方法**:两库各编译对应签名;构造两个不同优先级请求,检查实际授权对象以及返回索引确实属于候选集合。 - **适用条件**:重写 user_priority_arbitration 或直接传递候选队列。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh:100`、实现 `:649`(`function integer user_priority_arbitration(integer avail_sequences[$])`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:121`、实现 `:554`(`function int ...(int avail_sequences[$])`) - **差异说明**:`integer` 与 `int` 都是 32 位有符号四态整数,不能将此变化解释为二态化。但 VCS W-2024.09-SP2-8 对旧 `integer` 返回值及 `integer avail_sequences[$]` override 在 2.0 报 `SV-IRT` / `SV-ATDNMD`,直接传入 integer 队列还报 `ICTTFC`。因此本机表现为编译断点。 - **迁移动作**:2.0 派生 sequencer 的返回类型和形参改为 `int` / `int avail_sequences[$]`;直接调用时也同步队列元素类型。若同一源码必须支持两版,以库版本宏选择签名。 - **兼容说明**:兼容开关不恢复旧仲裁签名;override 和直接调用的队列类型均须匹配目标。 - **标准依据**:IEEE 1800.2-2020 §15.3.2.3(`virtual function int user_priority_arbitration(int avail_sequences[$])`) ##### 修改前后 在原派生 sequencer 内保留仲裁算法,只调整返回类型和候选队列类型。例如,原来选择最后一个候选项: ```systemverilog // UVM 1.2 virtual function integer user_priority_arbitration(integer avail_sequences[$]); return avail_sequences[$]; endfunction ``` ```systemverilog // UVM 2.0 virtual function int user_priority_arbitration(int avail_sequences[$]); return avail_sequences[$]; endfunction ``` 示例来自 C14 编译探针,假定库传入非空候选集合;它不表示业务应统一选择末项。返回候选集合中的值,不能把自己计算的队列位置误当成该值。自行调用此方法时,实参队列也改为 `int candidates[$]`。`integer` 和 `int` 都是 32 位四态,此处是在匹配目标 VCS 的方法签名。 #### 8. 响应队列溢出错误报告 API 极性反转 - **页面标题**:响应队列溢出默认不报错,需要显式开启 - **内容类型**:用户接口与行为 - **验证方法**:显式开启报告,受控填满队列后检查溢出诊断;正常消费场景验证每个 response 都被取走且深度合理。 - **影响类型**:静默/数据风险 - **一句话结论**:显式开启响应队列溢出报告,并核对响应消费与队列深度,避免只依赖默认错误计数。 - **适用条件**:sequence 使用响应队列并依赖默认溢出报错时需核对;旧 disabled 接口仍可调用,但默认行为已变化。 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:新增 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:150`(`response_queue_error_report_disabled`)、`:1142`/`:1153`(`set/get_response_queue_error_report_disabled`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:164`(`response_queue_error_report_enabled`)、`:1122`/`:1138`(新增 `set/get_response_queue_error_report_enabled`)、`:1127`/`:1143`(旧 disabled 版以 `@uvm-compat` 内联保留,实现取反) - **差异说明**:旧 API 仍正确取反映射,但新 enabled 位没有初始化为 1,默认值为 0。因此默认溢出从 1.2 的报错变为 2.0 的静默丢弃响应。`lifecycle_probe` 设置深度为 0 后投递响应,两库默认报错次数为 1 / 0;显式恢复报错后均为 1。 - **迁移动作**:需要检测响应丢失的 sequence 显式调用 `set_response_queue_error_report_disabled(0)`(双库可用),或目标版 `set_response_queue_error_report_enabled(1)`;同时检查消费速度和队列深度。不能仅靠默认 UVM_ERROR 计数验收。 - **兼容说明**:主库保留旧 disabled 接口;它不恢复默认溢出报告行为,应显式开启报告并验证响应消费和队列深度。 - **标准依据**:IEEE 1800.2-2020 §14.2.7.4/§14.2.7.5 ##### 修改前后 旧代码可能不设置开关,依靠默认行为报告溢出。在业务 sequence 中显式开启,两版均可使用: ```systemverilog set_response_queue_error_report_disabled(0); ``` 仅面向目标版的新代码也可写 `set_response_queue_error_report_enabled(1)`,不要把参数值一并照搬。 | 队列已满时继续投递 response | 1.2 | 2.0 | |---|---|---| | 不设置报告开关 | 报错 | 默认不报错 | | 显式 disabled(0) | 报错 | 报错 | 这只恢复报错,不会防止响应丢失。还需让 sequence 正常 `get_response()` 消费响应,并确认峰值积压不超过队列深度。 #### 9. UVM_SEQ_ARB_TYPE typedef 默认不可用 - **内容类型**:用户接口与行为 - **验证方法**:编译改为 uvm_sequencer_arb_mode 的声明,读回设定模式;若暂用 deprecated,再在关闭开关后复编译。 - **适用条件**:使用 UVM_SEQ_ARB_TYPE 类型名。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:deprecated 开关 - **类型**:废弃(deprecated) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_object_globals.svh:370`(无条件 typedef) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_object_globals.svh:382`(`` `ifdef UVM_ENABLE_DEPRECATED_API`` 内) - **差异说明**:`set_arbitration`/`get_arbitration` 形参类型在两版都是 `uvm_sequencer_arb_mode`(1.2 用别名写法),行为无差;但用户代码若声明了 `UVM_SEQ_ARB_TYPE` 类型的变量,2.0 默认编译失败。 - **迁移动作**:改用 `uvm_sequencer_arb_mode`,或加 `+define+UVM_ENABLE_DEPRECATED_API`。 - **兼容说明**:UVM_ENABLE_DEPRECATED_API 开放 UVM_SEQ_ARB_TYPE 旧 typedef;改用 uvm_sequencer_arb_mode 后可移除此项依赖,仲裁行为另行验证。 #### 10. uvm_sequence_item 报告方法的默认 verbosity 收紧 - **内容类型**:用户接口与行为 - **阅读主题**:04 - **关联主条目**:M04-002 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M04-002。 #### 11. grant_queued_locks:lock 授予从"批处理"改为"单发" - **页面标题**:多个 sequence 同时 lock 时授权顺序改变 - **内容类型**:用户接口与行为 - **验证方法**:并发申请后记录授予顺序和每个请求完成,验证无饥饿和锁残留;允许差异需由仲裁契约解释。 - **适用条件**:多个 sequence 同时申请 lock,或依赖同 seed 下的旧授权顺序。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh:660`(对队首连续的 lock 请求,把所有未阻塞者一次性移入 lock_list) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:565`(只授予第一个未阻塞的 lock 请求) - **差异说明**:1.2 只处理队首连续 lock,先统一判阻塞再批量授予;2.0 在整个仲裁队列找第一个未阻塞 lock,每轮授予一个。因此不仅批量变单发,排在普通请求后面的 lock 也可能提前获授。不要将其简单解释为更严格的同一算法;锁竞争与普通请求混排必须比对调度。 - **迁移动作**:保留 lock/unlock 的配对流程;回归不再假定一次调度同时授权所有排队 lock。对并发 sequence 按实际授权与完成顺序判定;若业务必须固定先后,用显式握手表达依赖,并验证每个请求最终获准、锁最终释放。 - **兼容说明**:lock/unlock 接口可保留,兼容措施不恢复旧批量授权;依赖顺序须由明确握手表达。 #### 12. try_next_item / get_next_item 仲裁增强(被杀 sequence 重新仲裁 + wait_for_sequences_count) - **页面标题**:driver 等待请求时 kill sequence:核对后续仲裁 - **内容类型**:用户接口与行为 - **验证方法**:kill 等待者后再发新请求,检查重新仲裁、完成计数及等待上限;堆叠时按实际层数检查 wait_for_sequences_count。 - **适用条件**:堆叠 sequencer,或在 get_next_item/try_next_item 等待时 kill sequence。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化 + 新增配置 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequencer.svh:230`(try_next_item 一次 `wait_for_sequences` 后未取到 item 即报 `TRY_NEXT_BLOCKED` 返回 null) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer.svh:225`、`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_param_base.svh:474-506`(新增 `m_safe_select_item`)、`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:76`/`:442-447`(`wait_for_sequences_count` config_db 配置,默认 1) - **差异说明**:旧行为——赢得仲裁的 sequence 若在 send_request 前被 kill,driver 的 get_next_item/peek 可能挂死,try_next_item 报 null item;新行为——检测 `process_id.status` 为 KILLED/FINISHED 时自动重新仲裁。堆叠 sequencer(sequencer 套 sequencer)需对底层 sequencer 设置 `uvm_config_db#(int)::set(..., "wait_for_sequences_count", N)`,否则 try_next_item 可能取不到 item。 - **迁移动作**:普通请求等待流程可保留。存在多级 sequencer 堆叠时,在目标 sequencer 的 build_phase 读取配置之前,通过 uvm_config_db#(int)::set 配置其 wait_for_sequences_count,逐级验证计数满足传播需要;kill 等待中的 sequence 后,检查下一笔请求仍能被 driver 消费。具体配置读取位置见源码依据,不把固定延迟当通用补偿。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### 13. kill() 路径增加 sequencer 队列清理(clean_exit_sequence) - **页面标题**:sequence.kill() 清理仲裁请求、锁与路由,保留已排队响应 - **内容类型**:用户接口与行为 - **验证方法**:分别在持锁、有仲裁请求和有 response 时 kill;重新 start 之前检查响应队列,再验证其他 sequence 可继续服务。需要清空响应时,显式 clear_response_queue 后检查队列为空。 - **适用条件**:运行中 kill sequence,特别是跨 sequencer 路由,或需要清理已排队响应。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化 + 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:880`(kill 经默认 sequencer 清理)、`:914`(m_kill 不遍历其他 sequencer)、`:286`(start 清响应队列)、`:1184`(显式 clear_response_queue) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:884`(m_kill 内 `:896` 调用 clean_exit_sequence)、`:420`(遍历所有路由过的 sequencer)、`:310`(start 清响应队列)、`:1176`(显式 clear_response_queue);`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:1159`(移除仲裁请求)、`:1185`(移除锁)、`:1204`(注销响应路由) - **差异说明**:1.2 的 kill 会清理默认 sequencer,非默认 sequencer 上的仲裁请求或锁可能残留;2.0 增加遍历所有已路由 sequencer 的清理,删除关联仲裁请求、锁和路由注册。注销路由使晚到响应无法再经该路由送达,但**不会清空 sequence 已有的 response_queue**,也不能据此认定 driver 在途事务已取消。目标 sequence/sequencer 文件与 Accellera 2.0 相同。两版重新 start 都会清空 response_queue,因此重启后为空不能证明 kill 时已清空。 - **迁移动作**:保留 sequence.kill();确认跨 sequencer 仲裁请求和锁已清理后,才移除针对这些残留的旧补偿。若业务要求即时丢弃已排队响应,继续显式调用 clear_response_queue;需要检查或消费响应的流程先完成对应处理。driver/scoreboard 在途事务仍按业务协议收尾,再验证后续请求与响应链路。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 ##### 修改前后 对需要丢弃已排队响应的退出流程,两版均保留以下操作;迁移时不能简化成仅调用 kill: ```systemverilog seq.kill(); seq.clear_response_queue(); ``` `doc_fact_probe` 在活动 sequence 中预先放入一个响应。两版 kill 后均为 UVM_STOPPED,响应数仍为 **1**;显式 clear_response_queue 后均为 **0**,观察发生在再次 start 之前。该实验只核对已排队响应,跨 sequencer 锁修复另见 lifecycle 实验,不覆盖全部并发和晚到响应协议。 #### 14. starting_phase 字段去 deprecated 化(行为微调) - **页面标题**:starting_phase 的直接赋值与锁定限制 - **内容类型**:用户接口与行为 - **验证方法**:在 start 前设置并读回 phase;受控测试锁定后的冲突设置,检查返回状态/报错和保留值。 - **适用条件**:直接写 starting_phase,或在其锁定后再次设置。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:530-536`(`starting_phase` 直接赋值触发 `UVM_DEPRECATED` 警告,`:552`/`:590` 存取器内含兼容检查) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:554`(`@uvm-compat` 普通字段)、`:587`(`get_starting_phase` 锁定后值不一致报 `UVM/SEQ/SP/GET` error)、`:609`(`set_starting_phase` 锁定后报 `UVM/SEQ/SP/SET` error) - **差异说明**:直接赋值本身不会执行检查,读取时才同步/检查字段与 DAP。1.2 锁定后的冲突也有 `UVM/SEQ/LOCK_DEPR` 或 DAP error,并非只告警或静默接受。2.0 改为 `UVM/SEQ/SP/GET` / `SET`;冲突值不替换锁定的 DAP 值。两库 get 后 set 的实测均保持旧 phase 并报错,故迁移重点是访问器与诊断 ID。 - **迁移动作**:把 seq.starting_phase = phase 改为 seq.set_starting_phase(phase),读取改为 seq.get_starting_phase()。在 sequence 启动及相关 DAP 锁定前完成设置;锁定后的诊断应修正设置时机,不只修改消息过滤。 - **兼容说明**:主库保留 starting_phase 兼容字段;setter 与锁定检查可能改变赋值效果,应在 sequence 启动前设置,并核对被锁定时的诊断。 #### 15. 新增 get_randomize_enabled / set_randomize_enabled - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:主库保留 - **类型**:新增 API - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:158`(仅有 `bit do_not_randomize`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:194`/`:199`(新方法),`do_not_randomize` 保留为 `@uvm-compat`(`:173`);默认 sequence 启动流程改用 `get_randomize_enabled()` 判断(`uvm_sequencer_base.svh:1402`) - **差异说明**:标准新增的随机化使能存取器;旧字段继续可用。 - **迁移动作**:无。 - **兼容说明**:主库保留 do_not_randomize 字段,无需编译 compat 包;采用 set_randomize_enabled 时注意语义取反,检查实际是否执行随机化。 - **标准依据**:IEEE 1800.2-2020 §14.2.2.2/§14.2.2.3 #### 16. 新增 uvm_sequencer_base::get_arbitration_sequence / start() 重入检测改 mutex - **内容类型**:新增功能 - **验证方法**:并发重复 start 应被诊断;正常重复启动前确认前次结束,仲裁索引限制在当前队列范围。 - **适用条件**:重入 start 同一 sequence,或采用仲裁队列观察接口。 - **影响类型**:其他行为变化 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API / 内部重构 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:282` 附近(start 用状态枚举做重入检查) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:312`/`:1292`(`get_arbitration_sequence(int index)` 返回仲裁队列中第 index 个 sequence);`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:149`/`:290`(`m_sequence_state_mutex.try_get` 做重入检查) - **差异说明**:新增只读仲裁观察 API;start() 重入检测行为等价(重复 start 仍 `SEQ_NOT_DONE` fatal)。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 17. uvm_sequence_library 更新(新增 get_sequence(idx),类型名机制变化) - **页面标题**:sequence_library 的选择边界与类型名 - **内容类型**:用户接口与行为 - **验证方法**:先积累选择计数,再缩小 max,检查每次索引都在新范围内;候选为空的处理按实际调用契约另测。 - **影响类型**:静默/数据风险 - **一句话结论**:USER sequence library 动态缩减候选集时,应在选择前检查边界;固定候选集用法无需因此改写。 - **适用条件**:USER 模式自定义选择或运行中缩减候选数量时核对本条,观察实际返回索引。 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:新增 API / 内部重构 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_library.svh:243`(`local int unsigned m_counter`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_library.svh:289`/`:455`(新增 `get_sequence(int unsigned idx)` 返回 `uvm_object_wrapper`)、`:71`(类型名改用 `` `uvm_type_name_decl``)、`:188`(`select_sequence` 计数器改为 `protected counter`,子类可访问) - **差异说明**:`uvm_sequence_library` 本体保留(属 Accellera 扩展而非标准正文)。`get_type_name()` 返回值不变;`UVM_SEQ_LIB_USER` 模式下子类现在可读写 `counter`。默认 select_sequence 还删除了返回前的越界回绕:连续选择后缩小 max,1.2 先归零再返回,2.0 可能先返回旧的越界 counter 再归零。`library_probe` 的 max 从 3 降到 0,返回值为 0 / 3。 - **迁移动作**:动态缩减候选集的 USER 模式须检查索引范围;`tests/uvm_review/library_migrated.sv` 派生带选择前边界检查的 select_sequence,在相同场景两库均返回 0。固定候选集的普通用法无需因此改写。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### 18. get_tr_handle 返回类型 integer → int - **内容类型**:内部实现 - **影响类型**:无行为变化 - **处理级别**:无需改动 - **兼容机制**:无需启用 - **类型**:签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_sequence_base.svh:223`(`function integer get_tr_handle()`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh:246`(`function int get_tr_handle()`) - **差异说明**:两者均为 32 位有符号四态整数;此处仅统一类型拼写,不改变 X/Z 表达能力。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### uvm_push_sequencer 未消费被 peek 的请求,第二笔激励失败 - **内容类型**:用户接口与行为 - **验证方法**:至少发送值不同的两笔请求,逐笔核对 sink 数据与完成次数;局部替代还要回归 kill、response 和背压,禁止只屏蔽 SQRSNDREQGNI。 - **影响类型**:静默/数据风险 - **一句话结论**:至少验证两笔 push 请求;优先评估 pull 流程,保留 push 时需验证显式消费 FIFO 的局部替代。 - **适用条件**:使用 uvm_push_sequencer 且出现第二笔请求失败、重复发送或 SQRSNDREQGNI 时核对本条。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库第二笔 push 请求失败已复现;局部替代在限定场景通过。 - **类型**:行为变化(激励错误风险) - **1.2 位置**:`src/vcs-uvm-1.2/seq/uvm_push_sequencer.svh:69`(m_select_sequence 后 m_req_fifo.get) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/seq/uvm_push_sequencer.svh:78`;`src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_param_base.svh:506`(m_safe_select_item 只 peek) - **差异说明**:目标 push run_phase 调用 m_safe_select_item 后没有移除 FIFO 请求。两笔 item 对跑中,第二笔 send_request 触发 SQRSNDREQGNI,原始流程在第一笔之后退出;探针拦截该 fatal 继续观测时又向 sink 发送第一笔,sequence 虽完成但实际数据为 1、1,而非 1、2。该错误文本提到 get_next_item 并不意味着用户存在并发 pull driver。 - **迁移动作**:优先评估改用常规 pull sequencer/driver。保留 push 流程时,`push_probe.sv` 的派生类在安全选择之后显式消费 FIFO,再 put 与通知完成;这是绑定目标库内部接口的局部修复,需固定版本并回归 kill、响应及背压场景,不能仅屏蔽 fatal。 - **兼容说明**:兼容措施不修复 push 请求消费;局部派生替代依赖目标内部接口,kill、响应和背压仍需验证。 - **证据**:`tests/uvm_review/push_probe.sv` 的原始和 MIGRATED 对照。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | Sequence library counter | VCS 1.2 已为每实例 local;Accellera 1.2 为 static;目标为每实例 protected | VCS 两侧实例隔离延续,但动态 max 回绕有差异,见 M06-017。 | | UVM_CREATE_OPT | 1.2 对内置 sequence create 有条件保护;2.0 删除该内置文件 | 内置 sequence 替代见 M06-001;创建签名见 M09-003。 | | sequencer_param_base | 目标相对 Accellera 仅注释字符差异 | 无厂商附加行为;版本间 sequencer 变化仍见正式条目。 | --- ## 第 7 章 寄存器模型(reg/) ### 概览 常规寄存器访问入口通过 `uvm_door_e/uvm_path_e` 别名保持兼容,访问实现已有变化。优先核对大端窄总线、字段 byte-enable、失败预测和 backdoor codec;访问 status 成功仍可能伴随错误数据。另检查 caller 参数、基类构造和内建 sequence。 ### 建议阅读顺序 先验收实际总线或硬件数据,再核对镜像。普通类型别名可保留;大端窄总线、byte enable、codec 和失败访问按拓扑逐项核销。 M07-020 → M07-021 → M07-023 → M07-024 → M07-022 → M07-001
逻辑值与访问意图map / adapter 或 backdoor实际硬件值与返回状态
镜像由配置的预测路径更新,应另行对照完整访问结果。读写 status、硬件值和镜像是三个检查面;codec、端序或失败聚合的差异可能只出现在其中一个面。 ### 差异条目 #### uvm_path_e 更名为 uvm_door_e(全部 reg 访问 API 的 path 参数类型与默认值变化) - **页面标题**:寄存器 path 类型更名,旧别名仍可使用 - **内容类型**:用户接口与行为 - **验证方法**:编译两库下的路径声明;分别运行实际 frontdoor/backdoor/default 访问并核对路径选择,名称别名不代表所有访问实现等价。 - **影响类型**:新增/接口调整 - **一句话结论**:普通 uvm_path_e / UVM_DEFAULT_PATH 调用通过主库别名保持兼容,无强制改名要求。 - **适用条件**:仅改用目标库且使用常规 read/write/mirror 等调用时,可保留旧名称。依赖 $typename、反射或其他类型敏感操作时另行核对。 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_model.svh:169`(`uvm_path_e` 枚举,含 `UVM_DEFAULT_PATH`);`src/vcs-uvm-1.2/reg/uvm_reg_item.svh:119`(`uvm_path_e path`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_model.svh:180`(`uvm_door_e` 枚举,含 `UVM_DEFAULT_DOOR`)、`:183`(`parameter uvm_door_e UVM_DEFAULT_PATH = UVM_DEFAULT_DOOR`)、`:186`(`typedef uvm_door_e uvm_path_e`);`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_item.svh:145`(`uvm_door_e path`) - **差异说明**:`uvm_path_e`/`UVM_DEFAULT_PATH` 更名为 `uvm_door_e`/`UVM_DEFAULT_DOOR`,波及所有 read/write/mirror/update/peek/poke 及 `uvm_reg_sequence::read_reg` 等的 `path` 参数(1.2 `src/vcs-uvm-1.2/reg/uvm_reg_sequence.svh:225` → 2.0 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_sequence.svh:204`)。2.0 用 `typedef` + `parameter` 别名(源码标注 `@uvm-compat`)保持旧名字可用,故普通用户代码无需改动;仅当代码对 `uvm_path_e` 做枚举类型强转/反射(`$typename`)等类型敏感操作时才有风险。`uvm_reg_block::default_path` 公有字段类型同步变更(1.2 `src/vcs-uvm-1.2/reg/uvm_reg_block.svh:54` → 2.0 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh:57`)。 - **迁移动作**:uvm_path_e / UVM_DEFAULT_PATH 等旧名称在主库保留,可继续使用。采用新命名时将类型改为 uvm_door_e、默认值改为 UVM_DEFAULT_DOOR;无需仅为改名重写所有 read/write/mirror 调用,访问语义仍按具体 RAL 风险验证。 - **兼容说明**:主库以 typedef 与 parameter 保留 uvm_path_e / UVM_DEFAULT_PATH 等旧名称,无需 deprecated 开关或 compat 包,也不要求仅为改名而替换;实际访问数据与镜像仍按 RAL 条目验证。 - **标准依据**:IEEE 1800.2-2020 §17.2.2.2 #### get_local_map/get_default_map 移除 caller 调试形参(含 Xcheck_accessX) - **内容类型**:用户接口与行为 - **验证方法**:删除多余实参并同步 override,编译后在多 map 模型检查返回 map 身份和地址。 - **适用条件**:传入 get_local_map/get_default_map 的 caller 参数或重写相关接口。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg.svh:208`、`:210`;`src/vcs-uvm-1.2/reg/uvm_mem.svh:195`、`:198`;`src/vcs-uvm-1.2/reg/uvm_reg_indirect.svh:131`;`Xcheck_accessX(rw, map_info, caller)`:`src/vcs-uvm-1.2/reg/uvm_mem.svh:535` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh:225`、`:237`;`src/vcs-uvm-ieee-2020-2.0/reg/uvm_mem.svh:162`、`:164`;`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_indirect.svh:118`;`Xcheck_accessX(rw, map_info)`:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_mem.svh:343` - **差异说明**:最后一个 `string caller = ""` 形参删除。不传 caller 的既有调用兼容;显式传 caller 的调用和保留该形参的 override 都需修改。C9 已用 `get_default_map("caller")` 复现目标版参数过多错误。 - **迁移动作**:删除调用点的 caller 实参,并同步派生类的方法原型。 - **兼容说明**:已删除的 caller 形参不恢复;调用与派生 override 同步修改。 ##### 修改前后 `rg` 为已有寄存器,`requested_map` 为实际选定的 map,`selected_map` 为接收结果的 `uvm_reg_map` 句柄: ```systemverilog // UVM 1.2 selected_map = rg.get_default_map("my_seq"); selected_map = rg.get_local_map(requested_map, "my_seq"); // UVM 2.0 selected_map = rg.get_default_map(); selected_map = rg.get_local_map(requested_map); ``` 只删除最后一个 caller 字符串,不要删掉决定访问路径的 map 实参。重写相应方法时同步移除 `string caller=""` 形参;mem/indirect reg 的同类入口同样处理。直接依赖内部 `Xcheck_accessX(rw, map_info, caller)` 时,改为两参数并继续核对输出的 map_info。原本未传 caller 的公开调用可保留。 #### uvm_reg_backdoor 变为抽象类;wait_for_change 由 local 变 public - **内容类型**:用户接口与行为 - **验证方法**:具体 backdoor 挂载到寄存器后,经 RAL 后门写入并检查硬件,再改变硬件值并核对读回及镜像;检查回调次数和访问失败 status。通过 factory 创建时另验具体 override 与实际类型。 - **适用条件**:直接构造 uvm_reg_backdoor 基类或扩展 wait_for_change。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(类语义) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_backdoor.svh:37`(`class uvm_reg_backdoor`)、`:170`(`extern virtual local task wait_for_change`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_backdoor.svh:41`(`virtual class uvm_reg_backdoor`)、`:118`(`extern virtual task wait_for_change`) - **差异说明**:2.0 中直接 new 抽象基类会编译失败;经 abstract registry create 则可编译,但无具体 override 时报告运行错误,见 M01-006。wait_for_change 去掉 local 限定,目标实现允许派生类覆盖该钩子;这是保留的实现能力,不应据此当成新增 IEEE 标准 API。 - **迁移动作**:基类句柄可保留,new 的对象改为具体派生 backdoor。派生类实现 write(uvm_reg_item rw) 以及 read_func(rw) 或 read(rw),执行真实硬件访问并设置 status;不能只声明空子类绕过抽象类错误,基类默认 write/read_func 会报 fatal。将实例通过 rg.set_backdoor(bd) 挂到寄存器,使用 factory 时注册具体类型并检查 override 后的实际对象。需要 codec/callback 的访问按 M07-023 保留回调链。 - **兼容说明**:兼容措施不允许直接构造抽象 backdoor;使用完成实际读写的具体类,并保留所需回调链。 - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 继承 read 时只需在 read_func 中读数据并设 status,前后回调由 read 调用 | `src/vcs-uvm-1.2/reg/uvm_reg_backdoor.svh:353-357` 依次执行 do_pre_read、read_func、do_post_read。 | `src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg_backdoor.svh:278-282` 保持该调用顺序;本例不在 read_func 中重复调用回调。 | - **证据**:`tests/uvm_review/backdoor_binding_probe.sv` 的 RAL 挂载与读写;`tests/uvm_review/construction_compile_probe.sv` 的 REVIEW_BACKDOOR 构造断点。 - **标准依据**:IEEE 1800.2-2020 Annex H.2.2/H.2.3 ##### 修改前后 旧代码直接构造基类: ```systemverilog uvm_reg_backdoor bd = new("bd"); ``` 该声明在 1.2 可编译,但基类没有可用的默认读写实现;目标构造时即失败。将实例换成执行实际访问的具体类,基类句柄可以保留。下面用 interface 中的 32 位存储变量演示读写;类和 interface 声明放在模块外,先 include `uvm_macros.svh` 并 import `uvm_pkg::*`。 ```systemverilog interface storage_if; bit [31:0] value; endinterface class storage_backdoor extends uvm_reg_backdoor; virtual storage_if vif; function new(string name = "storage_backdoor"); super.new(name); endfunction virtual task write(uvm_reg_item rw); do_pre_write(rw); if (vif == null) rw.status = UVM_NOT_OK; else begin vif.value = rw.value[0]; rw.status = UVM_IS_OK; end do_post_write(rw); endtask virtual function void read_func(uvm_reg_item rw); if (vif == null) rw.status = UVM_NOT_OK; else begin rw.value[0] = vif.value; rw.status = UVM_IS_OK; end endfunction endclass ``` `write` 显式调用前后回调;继承的 `read` 已调用 `do_pre_read → read_func → do_post_read`,因此此处 `read_func` 只读数据并设置 status,避免重复回调。若改为 override 整个 `read` task,则自行保留这条调用链。Codec 的迁移仍按 M07-023 处理。 在模块中实例化 `storage_if hw();`。`model` 为已 build/lock 的寄存器模型,`model.rg` 是对应的 32 位普通 RW 寄存器;挂载与访问位于同一 initial/task 中,先声明变量: ```systemverilog storage_backdoor bd = new(); uvm_status_e status; uvm_reg_data_t value; bd.vif = hw; model.rg.set_backdoor(bd); model.rg.write(status, 'h12345678, UVM_BACKDOOR); if (status != UVM_IS_OK) `uvm_fatal("BACKDOOR", "Write failed") if (hw.value != 'h12345678) `uvm_fatal("BACKDOOR", "Hardware mismatch") hw.value = 'h89abcdef; model.rg.read(status, value, UVM_BACKDOOR); if (status != UVM_IS_OK || value != 'h89abcdef) `uvm_fatal("BACKDOOR", "Read failed") ``` 完整模型、调用方与回调计数在 `backdoor_binding_probe` 中。实际硬件访问替换 `vif.value` 的读写,并根据访问结果设置 status;此例不模拟 HDL DPI 访问失败或 W1C/RC 等副作用。 ##### 已有实测结果 直接构造 backdoor 基类在 1.2 编译通过,在目标报 `SV-ACCNBI`。具体派生类在两库均通过寄存器的后门路径写入硬件 `0x12345678`,外部更新后读回及镜像均为 `0x89abcdef`;写回调和显式读回调各执行一轮,未绑定 interface 的读访问返回 `UVM_NOT_OK`。实验限单个 32 位 RW 寄存器、interface 存储、无 codec;不覆盖 factory override、多 codec 或实际 Verdi/DPI 集成。 #### uvm_reg_hw_reset_seq 重构:无 reset 字段的跳过机制由 resource 改为 has_reset() 判断 - **页面标题**:内置复位测试按 has_reset() 跳过字段 - **内容类型**:用户接口与行为 - **验证方法**:同时包含有/无 reset 字段和三层 block,检查每个目标的访问次数、check 开关及结束后恢复值。 - **适用条件**:自研复位测试依赖自动 NO_REG_HW_RESET_TEST 资源或多层 block 遍历。 - **影响类型**:静默/数据风险 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:829`(`configure` 中 `has_reset==0` 时自动 `uvm_resource_db::set({...}, "NO_REG_HW_RESET_TEST", 1)`);`src/vcs-uvm-1.2/reg/sequences/uvm_reg_hw_reset_seq.svh:94`/`:129`/`:139`(seq 查询该 resource 跳过) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_field.svh:433`(`configure` 不再写 resource);`src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_reg_hw_reset_seq.svh:113`/`:129`(改用 `regs[ridx].has_reset()==0`、`fields[fidx].has_reset()==0` 直接判断);寄存器遍历也改为直接 `blk.get_registers(regs)` - **差异说明**:不能声称覆盖等价。2.0 对无 reset 字段临时设置 UVM_NO_CHECK,并在 mirror 后恢复;1.2 默认代码并不消费 configure 自动写入的普通字段级资源,旧条件扩展还使用不同的字段名拼接。遍历也从 map 和递归全后代改为本地 reg + 直接子块递归。三层 block 探针的叶寄存器 mirror 次数为 2 / 1,无 reset 字段在 mirror 中关闭比较的标记为 0 / 1,结束后均恢复 UVM_CHECK。用户显式的 block/reg 排除保留,但字段级排除应逐项核对名称与开关。 - **迁移动作**:自研复位测试用 field.has_reset() 判断是否存在 reset 值;镜像比较前保存原 get_compare(),对无 reset 字段临时 set_compare(UVM_NO_CHECK),比较后恢复原值。保留用户明确登记的 block/reg 排除,字段级排除单独核对实际名称。递归遍历采用每层本地寄存器加直接子块递归,避免叶寄存器重复 mirror。 - **兼容说明**:兼容措施不恢复旧复位测试遍历与字段比较规则;原 block/reg 排除保留,字段跳过和访问次数须核对。 #### uvm_reg_access_seq:backdoor 镜像验证的 map 实参由 backdoor() 伪映射改为 null - **页面标题**:后门访问告警:not contained within map 'Backdoor' - **内容类型**:用户接口与行为 - **适用条件**:升级后出现 Register '…' is not contained within map 'Backdoor',尤其是 field.read/write(..., UVM_BACKDOOR)、reg 读写显式传 backdoor(),或寄存器未加入实际 map。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/reg/sequences/uvm_reg_access_seq.svh:165`(mirror 传 backdoor()) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_reg_access_seq.svh:171`(mirror 改传 null) - **差异说明**:字段后门 read/write 在两版都支持。2.0 的 field 路径仍把 map 设为 Backdoor 伪 map,但父寄存器新增的权限查询按普通 map 查找归属,因而报 UVM_WARNING。这是目标实现的处理不一致,不表示字段接口被删除或调用必然错误;告警后访问仍可能成功。 - **迁移动作**:字段调用不要求改成手工位操作。需要寄存器访问语义时保留 field.read/write,确认实际数据与副作用;若已定位为本库问题且必须消除告警,使用该最小实验核对工具修复。仅需直接取值或赋值时可选 peek/poke。reg 读写显式传伪 map 的情况按下方改为 null。 - **兼容说明**:deprecated、legacy field 开关及 compat 包不修复这条 map 调用链;也不需要靠这些开关恢复 field.read/write。peek/poke 不模拟 read/write 的硬件访问副作用,不能无条件替换。 - **源码对照**: | 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 找不到 map 的诊断本来就存在;新增调用路径使后门访问触发它 | `src/vcs-uvm-1.2/reg/uvm_reg.svh:1665-1685` 查本地 map 和父 map,失败时 warning。 | `src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:1183-1201` 保留归属检查;`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:1248-1260` 中 get_rights 在查询失败后返回 RW。 | | 寄存器后门读写开始使用所选 map 查询权限 | `src/vcs-uvm-1.2/reg/uvm_reg.svh:2498-2520` 后门读直接调用 backdoor,字段使用伪 map 获取权限;`src/vcs-uvm-1.2/reg/uvm_reg.svh:2299-2307` 后门写直接执行并预测。 | `src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:2043-2065` 将 rw.map 作为 local_map,再调用 get_rights;`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:1794-1803` 选择写入 local_map,`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:1832-1844` 检查写权限。 | | field 入口内部仍设置伪 map,再降为整寄存器访问 | `src/vcs-uvm-1.2/reg/uvm_reg_field.svh:1393-1403` 后门分支写 rw.map;`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:1641-1647` 调用父寄存器 do_read。 | `src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg_field.svh:1044-1053` 覆盖 map,即使调用方传 null/实际 map;`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg_field.svh:1304-1312` 调用父寄存器 do_read,`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg_field.svh:1191-1198` 写入也降为父寄存器 do_write。 | | reg 的 null map 与 mirror 的重选逻辑有明确条件 | `src/vcs-uvm-1.2/reg/uvm_reg.svh:2668-2681` 有后门时直接设置伪 map;`src/vcs-uvm-1.2/reg/uvm_reg.svh:2999-3005` mirror 同样使用伪 map。 | `src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:2248-2266` reg 后门且 map 为 null 时先取默认 map,无可用 map 才回退到伪 map;`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:2609-2618` mirror 有后门时重选默认 map。 | | 字段接口保留;read/write 与 peek/poke 的语义不同 | `src/vcs-uvm-1.2/reg/uvm_reg_field.svh:455-479`、`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:497-512` 说明后门 write/read 模拟访问策略;`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:534-577` 说明 poke 原样写、peek 采样。 | `src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg_field.svh:1496-1561` 保留 field.poke/peek,并由父寄存器完成位操作;`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg.svh:2415-2525` 直接调用后门,不经 do_read/do_write 的权限与硬件副作用处理。 | - **证据**:`tests/uvm_review/backdoor_map_probe.sv`;两版 8 种调用场景,逐项断言该告警次数、访问 status、返回值、硬件值和镜像。对应调用逻辑在 Accellera 2.0 参照源码中也存在,不是仅由 VCS 定制造成。 ##### 适用条件 ```text UVM_WARNING .../uvm_reg.svh(1198) ... [RegModel] Register 'top_rgm.bbbb_rgm.CCCC' is not contained within map 'Backdoor' ``` `Backdoor` 通常是 `uvm_reg_map::backdoor()` 返回的特殊对象,不需要把寄存器 `add_reg` 到它。field 内部会设置它,因此只给 field 调用传 `map=null` 或实际 map 不能消除告警。 ##### 修改前后 **字段访问先按语义选接口,UVM-1.2 和 2.0 都有这些方法:** | 目的 | 调用 | 语义 | |---|---|---| | 模拟寄存器读写 | `fld.read(status, data, UVM_BACKDOOR)` / `fld.write(status, data, UVM_BACKDOOR)` | 遵守字段访问策略,例如 RC 读清零、W1C 写一清零。 | | 直接读取或设置原值 | `fld.peek(status, data)` / `fld.poke(status, data)` | 采样或原样赋值,不由 RAL 模拟上述硬件副作用;仍执行镜像预测。 | 字段截取及合成由库完成,无需自己实现 read-modify-write。`peek/poke` 不传 `UVM_BACKDOOR`,其第三个参数是 HDL 路径种类 `kind`。自定义后门仍执行自己的访问与回调逻辑。 **整寄存器 read/write 显式传了伪 map**,且寄存器已关联合适的实际 map 时: ```systemverilog // 修改前 rg.read(status, data, UVM_BACKDOOR, uvm_reg_map::backdoor()); // 修改后;write 同理 rg.read(status, data, UVM_BACKDOOR); ``` 若 `rg.get_n_maps()==0`,null 仍会回退到伪 map,先核对模型是否漏建实际映射。`mirror` 有有效后门时会重选默认 map,不能仅凭它传了 backdoor() 就认定告警来自该调用。复制旧 `reg_access_seq` 时,可同步目标写法 `rg.mirror(status, UVM_CHECK, UVM_BACKDOOR, null, this)`。 ##### 如何验证 定位告警处的 reg/field 调用,核对 status、硬件值和镜像;有 RC/W1C 等字段时检查实际副作用。仅凭告警不能判断访问失败,status 成功也不证明数据正确。S38 只覆盖显式伪 map/sequence 线索,field 和默认后门封装需另查。 ##### 实现细节 目标调用链:field 的 `Xcheck_accessX` 设置伪 map → 父寄存器 `do_read/do_write` → `get_rights` → `get_local_map` 发出告警。Accellera 2.0 参照也有该分支;归属查询失败后 `get_rights` 返回 RW,所以访问仍可能继续成功。 原条目的 sequence 遍历变化仍适用:`get_blocks(..., UVM_NO_HIER)` 加逐层递归避免重复访问;bit_bash 有同类调整,复制旧实现时核对访问次数。 #### uvm_mem_access_seq / uvm_reg_mem_shared_access_seq 随机源由 $random 改为 uvm_reg_randval - **页面标题**:内置 reg/mem sequence 的随机数据序列变化 - **内容类型**:用户接口与行为 - **验证方法**:固定 seed 记录访问地址和数据;区分随机源改变与协议错误,验收覆盖率和数据约束而非要求无依据的逐笔相同。 - **适用条件**:要求内建 reg/mem sequence 在相同 seed 下生成旧随机值序列。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 + 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/reg/sequences/uvm_mem_access_seq.svh:112`(`$random` 生成测试值) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_mem_access_seq.svh:61`/`:119`;新文件 `src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_reg_randval.svh:35`(`class uvm_reg_randval`,含 `rand uvm_reg_data_t randval`) - **差异说明**:测试值从返回 32 位的 $random 改为随机化 uvm_reg_data_t 字段,随机算法、状态对象及宽度均可能变化;不能将旧 $random 一概描述为全局共享流,也不能承诺跨库相同 seed 产生相同向量。回归应比较功能约束和覆盖,固定向量需求须显式传入数据。 - **迁移动作**:保留内置 sequence 调用;回归允许因 uvm_reg_randval 随机源变化而出现同 seed 的数据序列变化,使用访问约束、合法地址及 scoreboard 判定结果。外部 golden 若要求固定激励,应显式提供并保存激励数据,不能只凭同 seed 假定两库逐拍相同。 - **兼容说明**:兼容措施不恢复旧随机数据轨迹;固定向量需求须显式保存与提供数据。 #### uvm_reg_field::get_access 访问权限映射表重写 - **页面标题**:get_access() 返回的访问权限字符串变化 - **内容类型**:用户接口与行为 - **验证方法**:对实际字段 access policy 与 map 权限组合读回返回值,并检查自研分支、允许访问及副作用。 - **适用条件**:按 get_access 返回字符串选择自研访问/预测策略。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:918` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_field.svh:545` - **差异说明**:RO 分支两版一致,不是新增折算。变化在 WO 分支:1.2 仅 `RW/WO` 返回 WO,其余返回 NOACCESS;2.0 的 `WRC/WRS→WO`、`W1SRC→W1S`、`W0SRC→W0S`、`W1CRS→W1C`、`W0CRS→W0C`、`WCRS→WC`、`WSRC→WS`,并保留 W1C 等其他写属性。`interface_probe` 对代表性模式逐项对跑确认。依赖旧 NOACCESS 结果跳过测试的自研 sequence 将覆盖更多字段,须检查预期。 - **迁移动作**:若自研 sequence 根据 get_access(map) 决定跳过或预测,按目标 WO map 的返回值更新分支:WRC/WRS→WO、W1SRC→W1S、W0SRC→W0S、W1CRS→W1C、W0CRS→W0C、WCRS→WC、WSRC→WS。按折算后的写副作用执行和预测,不能统一当普通 WO;RO 分支原有处理可保留。 - **兼容说明**:兼容措施不恢复旧权限字符串映射;自研分支和预测须遵守折算后的访问副作用。 #### uvm_reg_item 新增全套 set/get 访问器(34 个方法) - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_item.svh:41`(字段均为公有成员,无访问器) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_item.svh:46`、`:275`-`:360`(`set_element_kind/get_element_kind`、`set_value/get_value(idx)`、`set_value_array/get_value_array`、`set_door/get_door`、`set_map/get_map`、`set_status/get_status` 等) - **差异说明**:1800.2 为 `uvm_reg_item` 的属性定义标准访问器;字段本身仍保留公有(兼容直接读写 `rw.value[0]`、`rw.kind` 的旧代码)。parent 对应的方法名是 set_parent_sequence/get_parent_sequence,不能照搬字段注释中的 set_parent/get_parent。get_value_array 拷贝数组,不返回可直接修改原数组的别名;修改副本后必须 set_value_array 写回。do_copy 由 super.copy 改为 super.do_copy(目标 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_item.svh:256`)。 - **迁移动作**:无强制;建议新代码用访问器。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §19.1.1.2.1–19.1.1.2.15(访问器分组;以源码逐方法标注为索引) #### uvm_reg_block 新增 unlock_model/wait_for_lock/set_lock/unregister/get_block_by_full_name,lock_model 行为增强 - **内容类型**:新增功能 - **影响类型**:其他行为变化 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_block.svh:1118`(`lock_model` 实现,无对应新 API) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh:241`(`unlock_model`)、`:261`(`wait_for_lock`)、`:1064`(`set_lock`)、`:1073`(`unregister`)、`:470`(`get_block_by_full_name`);`lock_model` 实现 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh:1285`(新增全名注册表缓存、`m_do_cmdline_settings()`、`m_uvm_lock_model_complete` 事件触发、根 map `Xinit_address_mapX`) - **差异说明**:新增解锁/锁定和全名查找接口。wait_for_lock 的实现是等待事件,并非检查 is_locked 后立即返回;若在锁定事件之后才调用,会等待下一次事件。set_lock 只是递归设置锁位,不等价于 lock_model 构建地址缓存或 unlock_model 清理缓存,动态修改模型须使用完整流程。 - **迁移动作**:无(纯新增)。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §18.1.2.6–18.1.2.9 #### uvm_reg_err_service:寄存器检查错误处理钩子 - **内容类型**:新增功能 - **验证方法**:注入一个可预期的寄存器不匹配,检查错误服务调用、ID/severity 及原始失败状态。 - **适用条件**:定制寄存器检查错误消息或使用错误服务钩子。 - **影响类型**:日志/调试变化 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API + 行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg.svh:2932`(`do_check` 内部直接拼 `uvm_error` 消息) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh:41`(`class uvm_reg_err_service`,含 `get()/set()/do_check_error()`)、`:2544`(`do_check` 改为委托 `err_service.do_check_error(this, expected, actual, map, valid_bits_mask)`) - **差异说明**:检查不通过时的错误消息生成改为经由可替换的单例服务类,用户可 `uvm_reg_err_service::set(自定义子类)` 定制错误输出。1.2 中直接 override `do_check` 的做法仍可用(`do_check` 仍是 virtual)。源码标注 `@uvm-accellera`——该 API 属 Accellera 实现扩展,不在 IEEE 标准正文。 - **迁移动作**:无强制;有定制错误消息需求时可改用该钩子。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### uvm_mem::get_addresses 增加越界检查 - **内容类型**:用户接口与行为 - **验证方法**:测试边界内最后一项与越界项,检查诊断及是否阻止错误总线访问。 - **适用条件**:向 memory get_addresses 传入越界索引,或依赖异常地址返回。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_mem.svh:1303` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_mem.svh:897`(`:905` 起新增 `offset >= m_size` 检查) - **差异说明**:旧行为:offset 越界时继续走 map 查询,结果未定义;新行为:发出 `uvm_warning` 并返回 `-1`。 - **迁移动作**:正常范围内的 get_addresses 调用可保留;调用前检查 offset < mem.get_size(),超出模型范围时在用户逻辑中报告并停止该访问。删除依赖越界地址返回值的后续总线操作,分别验证最后一个合法 offset 与第一个越界 offset。 - **兼容说明**:合法 offset 的调用可保留;兼容措施不恢复越界访问,调用方须阻止无效地址进入总线。 #### uvm_reg_predictor:type_name 由静态变量改为静态函数;新增 flush() - **内容类型**:用户接口与行为 - **验证方法**:编译静态名称调用;发送未完成多拍事务后按业务重置点清理,再检查新事务不会拼接旧数据。 - **适用条件**:写 predictor.type_name,或显式清理多拍预测状态。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:签名变更 + 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_predictor.svh:116`(`static string type_name = ""`)、`:117`(`virtual function string get_type_name()`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_predictor.svh:128`(`static function string type_name()`)、`:137`(`get_type_name` 改为转调 `type_name()`)、`:285`(新增 `virtual function void flush()`) - **差异说明**:type_name 从变量改为无参函数。SV 允许无参函数调用省略括号,普通读取不因省略括号而必然报错;向旧可写变量赋值或将其用于要求变量的上下文才需修改。`flush()` 新增,用于清空预测器内部状态。 - **迁移动作**:新代码显式调用 `type_name()`;移除对原可写 type_name 字段的赋值。 - **兼容说明**:兼容措施不恢复可写 type_name;自有变量用于缓存或改写,预测器清理按实际事务边界执行。 #### 类抽象性调整(uvm_reg/uvm_reg_block/uvm_reg_file/uvm_reg_cbs 去 virtual;uvm_vreg_cbs/uvm_vreg_field_cbs 加 virtual) - **内容类型**:用户接口与行为 - **验证方法**:编译具体派生 callback,注册后触发一次访问,确认需要的回调运行;不对已可构造的其他类强制改写。 - **适用条件**:直接 new uvm_vreg_cbs 或 uvm_vreg_field_cbs。 - **影响类型**:编译断点、其他行为变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(类语义) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg.svh:37`、`uvm_reg_block.svh:38`、`uvm_reg_file.svh:34`、`uvm_reg_cbs.svh:44`(均为 `virtual class`);`uvm_vreg.svh:617`、`uvm_vreg_field.svh:378`(普通 class) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh:90`、`uvm_reg_block.svh:33`、`uvm_reg_file.svh:30`、`uvm_reg_cbs.svh:48`(均为普通 class);`uvm_vreg.svh:342`、`uvm_vreg_field.svh:237`(`virtual class`,并加 `uvm_object_abstract_utils`) - **差异说明**:前四个类在 2.0 可直接实例化(正向放宽,无破坏);后两个回调基类变为抽象类,直接实例化 `uvm_vreg_cbs` 的代码会报错(正常用法均为 extend)。`uvm_reg_frontdoor` 同步补挂 `uvm_object_abstract_utils`(1.2 `src/vcs-uvm-1.2/reg/uvm_reg_sequence.svh:517` → 2.0 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_sequence.svh:395`)。 - **迁移动作**:将直接构造的 uvm_vreg_cbs / uvm_vreg_field_cbs 换成自己的具体派生类:构造函数接收 string name 并调用 super.new(name),原回调方法体迁入对应 override。uvm_callbacks 注册的对象仍指向原 vreg/field,传入新派生实例;原本已经使用具体回调类的代码可保留。uvm_reg/uvm_reg_block/uvm_reg_file/uvm_reg_cbs 的抽象限制放宽不要求反向修改已有派生类。 - **兼容说明**:兼容措施不恢复直接构造抽象 vreg callback;原有具体回调类可保留并验证挂载。 #### 静态按名查找函数去 m_ 前缀(m_get_reg_by_full_name / m_get_field_by_full_name) - **内容类型**:用户接口与行为 - **验证方法**:编译新名称,分别查询存在和不存在的全名,检查返回对象身份和空结果处理。 - **适用条件**:直接调用旧 m_get_reg_by_full_name/m_get_field_by_full_name。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:签名变更(重命名) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg.svh:342`(`m_get_reg_by_full_name`);`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:302`(`m_get_field_by_full_name`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh:304`(`get_reg_by_full_name`);`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_field.svh:215`(`get_field_by_full_name`) - **差异说明**:内部静态查找表(1.2 的 `m_field_registry` 同步更名 `m_reg_field_registry`)入口转正。调用过 `m_` 前缀版本的代码需改名。 - **迁移动作**:uvm_reg::m_get_reg_by_full_name(name) 改为 uvm_reg::get_reg_by_full_name(name);uvm_reg_field::m_get_field_by_full_name(name) 改为 uvm_reg_field::get_field_by_full_name(name)。保留原完整层级名,并在解引用查询结果前检查 null。 - **兼容说明**:旧 m_get_* 名称不再提供;使用新名称,保留完整层级名及空结果检查。 #### uvm_reg_map 新增 API 组(uvm_reg_seq_base / get_physical_addresses_to_map / perform_accesses / do_bus_access / unregister / clone_and_update) - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无(`uvm_reg_seq_base` 在 1.2 全库不存在) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh:271`(`uvm_reg_seq_base`,因 1800.2 中 `uvm_sequence_base` 抽象化而提供的可构造基类)、`:763`(`get_physical_addresses_to_map`)、`:773`(`perform_accesses`)、`:779`(`do_bus_access`)、`:788`(`unregister`)、`:818`(`clone_and_update`) - **差异说明**:总线访问循环重构为 `perform_accesses`/`do_bus_access`;旧 `get_physical_addresses` 签名保留。L2 和扩展矩阵覆盖 64 位寄存器拆分、32 位 memory burst、独立响应、并发访问及失败返回。实测并非全面等价:大端数据、字段访问粒度、失败后镜像行为见 M07-020 至 M07-022。复杂层级 map、自定义访问顺序和特殊总线协议仍需环境级验证。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### uvm_mem_mam:地址类型 bit [63:0] 统一为 uvm_reg_addr_t - **内容类型**:内部实现 - **影响类型**:无行为变化 - **处理级别**:无需改动 - **兼容机制**:无需启用 - **类型**:签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_mem_mam.svh:170`(`reserve_region(bit [63:0] ...)`)、`:304`(`get_start_offset` 返回 `bit [63:0]`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_mem_mam.svh:175`、`:311`(均为 `uvm_reg_addr_t`) - **差异说明**:`uvm_reg_addr_t` 默认即 `bit [63:0]`(受 `UVM_REG_ADDR_WIDTH` 控制),默认配置下完全等价;仅在改动地址宽度宏的工程中有类型一致性收益。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### uvm_reg_field 新增 set_rand_mode/get_rand_mode - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_field.svh:160`(`set_rand_mode(bit)`,控制字段期望值的 randomize 使能;`configure` 内部由 `value.rand_mode(0)` 改为 `set_rand_mode(0)`) - **差异说明**:纯新增。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### uvm_reg_array / uvm_reg_array_md 文件删除(UVM_SPARSE_ARRAY 扩展终止) - **内容类型**:用户接口与行为 - **验证方法**:去掉旧库 include 依赖并编译普通 reg 数组模型;检查地址映射、元素访问和实际资源消耗,不能只删 define 后省略原模型。 - **适用条件**:构建定义 UVM_SPARSE_ARRAY 或引用旧 reg_array 类型/成员。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_array.svh:35`、`src/vcs-uvm-1.2/reg/uvm_reg_array_md.svh:35`;由 `src/vcs-uvm-1.2/reg/uvm_reg_model.svh:436` 的 `` `ifdef UVM_SPARSE_ARRAY `` 包入 - **2.0 位置**:文件已删除;`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_model.svh:449`-`:451` 仍残留 `` `ifdef UVM_SPARSE_ARRAY `` 的 include(悬空引用) - **差异说明**:该稀疏数组寄存器是 VCS/Synopsys 私有扩展(Accellera 1.2/2.0 均无),默认不开启。1.2 下定义 `+define+UVM_SPARSE_ARRAY` 可用;2.0 下定义该宏会因找不到文件而编译失败。随动的 `uvm_reg_file::get_size/get_default_reg/Xlock_modelX`(1.2 `uvm_reg_file.svh:120`/`:127`/`:134`,为 reg_array 服务)一并移除。 - **迁移动作**:若环境定义了 `UVM_SPARSE_ARRAY`,需移除该 define 并改用普通 `uvm_reg` 数组建模。 - **兼容说明**:兼容措施不恢复稀疏 reg 数组扩展;移除开关后仍须完整迁移模型与地址映射。 #### uvm_reg_address_config 与 get_registers_filtered_by_address 移除(UVM_REG_ENABLE_ADDRESS_EXCLUSION 扩展终止) - **内容类型**:用户接口与行为 - **验证方法**:把原区间转换为明确的寄存器排除集合,记录内建 sequence 实际访问地址;应排除项不访问,其他项仍被覆盖。 - **适用条件**:启用地址排除扩展,或内建寄存器测试依赖地址区间过滤。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_block.svh:346`(ifdef 声明)、`:1242`(`class uvm_reg_address_config`,含 `add_address_include_range/add_address_exclude_range/clear_address_range`)、`:1317`(`get_registers_filtered_by_address` 实现) - **2.0 位置**:无(整特性含 `` `ifdef `` 全部移除,内建 seq 中的对应 ifdef 分支同步删除) - **差异说明**:同为 VCS 1.2 私有扩展(Accellera 无),默认关闭;用于按地址区间在内建 seq 中排除寄存器。2.0 无任何替代,需改用 `NO_REG_TESTS` 等标准 resource 机制。 - **迁移动作**:若定义了 `UVM_REG_ENABLE_ADDRESS_EXCLUSION`,改用 resource 排除机制。 - **兼容说明**:兼容措施不恢复地址区间排除扩展;用实际寄存器集合配置对应测试资源。 ##### 修改前后 先按原模型所选 map 的地址区间,得到明确的排除寄存器集合。resource 机制按对象全名生效,没有地址范围配置类的一对一替换;多 map、别名地址与跨区间寄存器必须保留原筛选意图。 在内建测试启动前,对确定要排除的 `rg` 设置资源: ```systemverilog uvm_resource_db#(bit)::set( {"REG::", rg.get_full_name()}, "NO_REG_TESTS", 1, this); ``` 仅排除硬件复位测试时,将资源名改为 `NO_REG_HW_RESET_TEST`;其他专用测试按其读取的资源名设置,避免过度排除。这里的 `this` 位于 sequence/component 中,不能将地址字符串当作资源 scope。 完成映射后,移除 `UVM_REG_ENABLE_ADDRESS_EXCLUSION`、`uvm_reg_address_config` 及其范围管理调用。记录内建 sequence 实际访问的寄存器集合,同时检查应排除项与应保留项。 #### 大端 map 的整宽反转可能破坏数据,单拍也受影响(S13) - **内容类型**:用户接口与行为 - **验证方法**:对每个 beat 检查地址、adapter 输入/输出、总线数据、status、硬件值和镜像;补偿只在已核对的宽度、映射和响应契约下使用。 - **影响类型**:静默/数据风险 - **一句话结论**:大端访问在有效总线宽度小于 uvm_reg_data_t 整宽时可能传错数据;32 位寄存器接 32 位总线的单拍也需检查,补偿仅适用于已验证的映射与响应契约。 - **适用条件**:使用 UVM_BIG_ENDIAN 的访问都需核对;关键是有效总线数据宽度与 `uvm_reg_data_t` 整宽的关系,不要求寄存器大于总线。默认 64 位 reg_data 下,32 位寄存器接 32 位总线同样受影响;多级 map、桥接与不同响应契约需单独验证。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库大端数据问题已复现,包含 32 位寄存器接 32 位总线的单拍;固定映射的 adapter 补偿已验证。 - **类型**:行为变化(结果错误风险) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_map.svh:2940`(do_bus_write,以拆分访问数据调用 adapter) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh:2835-2837`(写前反转)、`:2873-2875`(读后反转) - **差异说明**:目标实现对 UVM_BIG_ENDIAN 访问的整个 `uvm_reg_data_t` 做 byte streaming 反转,而非只处理有效总线宽度。64 位 reg_data / 32 位总线下,原低 32 位数据被移到高位,常规 adapter 截取低 32 位后写出零;读回也被移位后掩掉。`reg_access_probe` 在有无独立响应时均复现,status 仍为 UVM_IS_OK,普通小端场景无此现象。补充 `reg_width_probe` 使用 32 位寄存器和 32 位总线,写入及读回 `0x12345678` 在两版分别为原值 / 零,证明单拍等宽访问也需核对。 - **迁移动作**:大端环境迁移前必须检查 adapter 两侧数据和总线 beat。示例 `+BE_ADAPTER_COMPENSATION` 在目标版本的 adapter 写入口反转回原数据,读出口预反转,以抵消目标库操作;它仅为本机固定宽度、地址映射和 response 契约验证过的处理方案,不能直接套用到任意桥接/层级 map。部署前与总线端序契约、有效位宽一并验证,也可采用经过验证的用户 frontdoor。 - **兼容说明**:兼容措施不修复大端整宽反转;adapter 补偿仅适用于已验证的宽度、映射和响应契约。 - **证据**:`tests/uvm_review/reg_access_probe.sv`、`tools/run_reg_review.py`;`tests/uvm_review/reg_width_probe.sv` 的默认与 +MIGRATED 对照验证等宽单拍及限定补偿,两版补偿后均保留 `0x12345678`。 #### 支持 byte enable 的相邻字段访问仍可能退化为整寄存器访问(S14) - **内容类型**:用户接口与行为 - **验证方法**:预置与镜像不同的相邻硬件值,执行目标字段写并记录每拍 byte strobe;只允许目标字段变化,不能靠 RegModel warning 被屏蔽来核销。 - **影响类型**:静默/数据风险、日志/调试变化 - **一句话结论**:字段访问需验证真实 byte strobe 与相邻硬件值;必要时使用显式总线或 frontdoor 访问并只预测目标字段。 - **适用条件**:存在 byte-enable、W1C/RC 或硬件自主更新的相邻字段时,不能把整寄存器访问视为等价。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库字段写粒度问题已复现;显式字段访问在固定映射场景通过。 - **类型**:行为变化(相邻字段副作用风险) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_field.svh:1745-1748`(支持 byte enable 即允许独立访问) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_field.svh:1409-1489`(还要求字段在总线宽度内独占) - **差异说明**:8 位字段与其他字段共用 32 位总线 word 时,即使 individually_accessible 和 supports_byte_enable 都为 1,2.0 仍发 RegModel warning 并走整寄存器访问。示例的 64 位寄存器字段写从单笔 byte_en=1 变为两笔全字节写;若其他字段的硬件值已偏离镜像,整寄存器写可能覆盖该值。 - **迁移动作**:有 W1C、RC 或硬件自主更新字段的寄存器必须核对真实访问粒度。可使用显式 bus sequence 或经过验证的用户 frontdoor 实现 byte strobe,访问成功后只预测目标字段;`+DIRECT_FIELD_WRITE` 演示该固定映射场景。禁止仅屏蔽 warning 后将整寄存器访问视为等价。 - **兼容说明**:兼容措施不恢复字段访问粒度;替代路径仍须核对 byte strobe、相邻字段副作用与预测。 - **证据**:`tests/uvm_review/reg_access_probe.sv`,矩阵同时检查字段写 beat 数和相邻硬件值。 #### 失败访问不再更新寄存器镜像,新增 PREDICT_NOK 提示 - **内容类型**:用户接口与行为 - **验证方法**:先成功写入,再注入总线失败;检查 status 为 NOT_OK、镜像保持上次可靠值,恢复策略必须依据成功访问或可信观测。 - **适用条件**:访问失败后依赖 mirror 更新,或遇到 PREDICT_NOK。 - **影响类型**:日志/调试变化、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化(缺陷修正) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg.svh:2008`(do_predict) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh:1525-1553` - **差异说明**:2.0 do_predict 仅在 rw.status 为 UVM_IS_OK 时更新字段,否则提示 PREDICT_NOK。自动预测开启且总线拒绝写操作的实测中,1.2 镜像仍更新为请求的全 1,2.0 保留上次成功值,两版 API 都返回 UVM_NOT_OK。 - **迁移动作**:失败处理和 scoreboard 必须检查 status;不要继续依赖 1.2 失败后被更新的镜像。该提示不是要求无条件重新 predict,恢复值应由成功重试或可靠观测确定。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **证据**:`tests/uvm_review/reg_access_probe.sv` 的 failed_write_status / failed_write_mirror。 #### backdoor encode/decode 修改的数组副本未写回(S22) - **页面标题**:后门编解码可能失效:同时检查硬件值与读回值 - **内容类型**:用户接口与行为 - **影响类型**:静默/数据风险 - **一句话结论**:使用 backdoor encode/decode 时必须同时核对硬件值与逻辑值;单 codec 可用已验证的 pre_write/post_read 替代。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库 backdoor 编解码未写回问题已复现;单 codec 替代已验证。 - **类型**:行为变化(数据错误风险) - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_backdoor.svh:75,93` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_backdoor.svh:68,84`;数组访问器 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_item.svh:435` - **差异说明**:1.2 将 rw.value 直接作为 ref 实参;目标先 get_value_array,再调用 codec,但未 set_value_array。backdoor_probe 用 XOR 0x55 编码,写入逻辑值 1 后硬件值为 54 / 1;读取硬件 54 后逻辑值为 1 / 54。编译和访问 status 均不能发现错误。 - **迁移动作**:单 codec、受控回调链可在 pre_write/post_read 直接更新 rw.value,停用旧 encode/decode;相同探针两版均恢复硬件 54、读值 1。多 codec 的 decode 原为逆序调用,post_read 为正序,不能机械迁移,需在自定义 backdoor 中显式维持编码顺序、逆序解码与写回,并另行验证。 - **兼容说明**:主库与 compat 包均未提供此数据路径的自动恢复。单 codec 替代不能直接推广到多 codec。 - **证据**:`tests/uvm_review/backdoor_probe.sv`,默认及 +MIGRATED 两组。 ##### 适用条件 使用注册在 `uvm_reg_backdoor` 实例上的 `uvm_reg_cbs::encode/decode` 修改数据时核对本条。下面的替代限定**单 codec、受控 backdoor 回调链**。普通无 codec 的 backdoor 访问不需要套用此补偿;本例未验证 frontdoor 回调、寄存器镜像及失败读取。 ##### 修改前后 旧回调通过数组引用执行 XOR 编解码;目标库调用它时操作的是未写回的副本: ```systemverilog virtual function void encode(ref uvm_reg_data_t data[]); foreach (data[i]) data[i] ^= 'h55; endfunction virtual function void decode(ref uvm_reg_data_t data[]); foreach (data[i]) data[i] ^= 'h55; endfunction ``` 单 codec 方案直接操作寄存器事务中的值,同时移除或停用上面的旧 encode/decode 实现,避免两次转换: ```systemverilog virtual task pre_write(uvm_reg_item rw); foreach (rw.value[i]) rw.value[i] ^= 'h55; endtask virtual task post_read(uvm_reg_item rw); foreach (rw.value[i]) rw.value[i] ^= 'h55; endtask ``` 回调应挂到 backdoor 实例,完整示例中的注册语句为: ```systemverilog uvm_callbacks#(uvm_reg_backdoor, uvm_reg_cbs)::add(bd, codec); ``` `bd` 是实际 backdoor,`codec` 是上述派生回调。不要将替代直接挂到 reg/field 的共享回调链,否则可能在 frontdoor 访问时也转换数据。自定义 backdoor 的 write/read 必须按契约调用相应 do_pre/do_post 方法;失败读取是否允许解码也须明确。多 codec 原本按逆序 decode,而 post_read 按正序执行,不能逐个机械搬移。示例用本地变量模拟硬件,只覆盖成功访问的数据与回调路径。 ##### 如何验证 访问 status 成功不足以核销本条;环境级断言应同时检查总线或硬件值与逻辑读回值,并覆盖实际使用的全部 codec 组合。 ##### 已有实测结果 所有数据值均为十六进制。先写逻辑值 `0x1`,再从硬件值 `0x54` 读取: | 观察量 | 1.2 旧写法 | 2.0 旧写法 | 修改后,两版 | |---|---|---|---| | `encoded_hardware`:实际写入值 | 0x54 | 0x1 | 0x54 | | `decoded_value`:逻辑读回值 | 0x1 | 0x54 | 0x1 | #### predictor 仅继承首拍 status,后续拍失败仍可能更新镜像(S24) - **内容类型**:用户接口与行为 - **验证方法**:分别注入首拍失败、后续拍失败和全成功;任意拍失败均不得错误更新,复杂字段副作用及乱序另按协议验证。 - **影响类型**:静默/数据风险 - **一句话结论**:多拍 predictor 必须聚合完整事务状态;任何一拍失败时,不能仅凭首拍成功更新镜像。 - **适用条件**:多拍访问且后续拍可能失败时需核对;已验证的显式预测替代限定普通 RW、串行、小端、全字节访问。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库后续拍失败仍预测的问题已复现;普通 RW 串行替代已验证。 - **类型**:行为变化与保留的检查缺口 - **1.2 位置**:`src/vcs-uvm-1.2/reg/uvm_reg_predictor.svh:164,211` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_predictor.svh:184,225`;预测入口 `src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh:1525` - **差异说明**:目标创建 pending item 时复制首拍 status,后续拍不聚合 status。64 位寄存器经两笔 32 位总线写:首拍失败,1.2 仍更新镜像,目标保留旧值;第二拍失败,两版均更新为请求值,目标 reg_item.status 仍是 UVM_IS_OK。因此 M07-022 的失败保护不能替代总线完整事务检查。 - **迁移动作**:monitor/scoreboard 必须聚合完整事务的失败状态。示例在两拍全部成功时才通过公开 predict 更新镜像,两版均在任一拍失败时保留原值;该例限定普通 RW、串行、小端、全字节访问,复杂副作用字段、乱序、多 master 需按总线协议建模,不能把它视作完整 predictor 的通用替换。 - **兼容说明**:兼容措施不修复多拍失败聚合;显式聚合预测仅覆盖所述普通 RW、串行、小端、全字节场景。 - **证据**:`tests/uvm_review/predictor_probe.sv`,默认及 +MIGRATED 两组。 #### Synopsys reg-bank 的 add_coverage 删除及保留接口 - **页面标题**:私有 reg-bank 覆盖率改为构造时声明 - **内容类型**:用户接口与行为 - **影响类型**:编译断点、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:删除 API(Synopsys 定制) - **适用条件**:使用 `snps_uvm_reg_bank_group` 等私有 reg-bank 类型,尤其构造后调用 `add_coverage()` 或依赖私有 predictor/访问签名。 - **一句话结论**:group.add_coverage 已删除;可预先确定的覆盖率能力移到构造函数第三参,set_coverage 仍只负责启用已声明能力。 - **差异说明**:两版 VCS 都包含 `snps_uvm_reg_bank.svh`,Accellera 两版均无。1.2 `add_coverage(uvm_reg_cvr_t models)` 对 local m_has_cover 作或运算,2.0 删除;两版构造参数 has_coverage 都设置该能力集,set_coverage 只在能力集内启用。私有 predictor 的 get_type_name 在目标改用函数内 static 字符串缓存,并非新增静态 type_name() API;访问 path 随主库改为 uvm_door_e,保留别名范围见 M07-001。 - **迁移动作**:对初始化时可确定的能力,把原构造能力与各次 add_coverage 参数合并为位掩码,通过 `new(name, parent, has_coverage)` 第三参传入;再用 set_coverage 选择当前启用项。不能用 set_coverage 冒充扩充能力。若运行中才增加能力,需调整模型生命周期或维护自己的模型实现;没有给存量对象追加能力的已验证通用替代。只使用其他保留接口时无需因此整体替换 reg-bank。 - **兼容说明**:兼容措施不恢复 group.add_coverage。构造时声明能力适用于能力可预先确定的对象;path 旧别名在主库保留,按 M07-001 核对具体调用。 - **验证方法**:编译原调用与改写;检查 has_coverage、启用/关闭后的 get_coverage,并在实际 bank 模型确认覆盖采样。若更改对象构造时机,还需检查已有引用、mode 切换及 predictor 连接;本条实验不覆盖实际 bank 切换或 RAL 总线访问。 - **1.2 位置**:`src/vcs-uvm-1.2/reg/snps_uvm_reg_bank.svh:50-106`、`src/vcs-uvm-1.2/reg/uvm_reg_model.svh:450-450` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/src/reg/snps_uvm_reg_bank.svh:50-101`、`src/vcs-uvm-ieee-2020-2.0/src/reg/snps_uvm_reg_bank.svh:584-596`、`src/vcs-uvm-ieee-2020-2.0/src/reg/uvm_reg_model.svh:464-464` - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 能力可在构造时设定,追加接口删除 | 构造和 add_coverage 设置 m_has_cover:`src/vcs-uvm-1.2/reg/snps_uvm_reg_bank.svh:50-106`。 | 构造仍设置 m_has_cover;set_coverage 与能力取交集:`src/vcs-uvm-ieee-2020-2.0/src/reg/snps_uvm_reg_bank.svh:50-101`。删除另经全类核对和编译断点确认。 | - **标准依据**:Synopsys 私有扩展,不属于 IEEE 1800.2 的通用 reg-bank API。 ##### 修改前后 下例限构造完成前即可确定支持能力的 group;`null` 保留 parent 参数的位置。 ```systemverilog // UVM 1.2 snps_uvm_reg_bank_group bank = new("bank", null, UVM_CVR_REG_BITS); bank.add_coverage(UVM_CVR_FIELD_VALS); void'(bank.set_coverage(UVM_CVR_FIELD_VALS)); ``` ```systemverilog // Both VCS libraries uvm_reg_cvr_t supported = UVM_CVR_REG_BITS | UVM_CVR_FIELD_VALS; snps_uvm_reg_bank_group bank = new("bank", null, supported); void'(bank.set_coverage(UVM_CVR_FIELD_VALS)); ``` 通过 factory 构造派生 group 时,把已确定的能力传给派生类中的 `super.new`,不能把额外参数直接塞进不支持该签名的 `type_id::create`。运行中调整启用项可继续用 set_coverage,但只限已声明能力。 ##### 已有实测结果 `vendor_compile_probe` 的 add_coverage 调用在 1.2 编译通过、2.0 报 `Error-[MFNF]`。`vendor_migration_probe` 两库构造后 has_coverage 返回 1;仅开启 FIELD_VALS 后,该项 get_coverage 为 1,REG_BITS 为 0。未验证 covergroup 实际采样、bank mode 切换、私有 predictor 或总线访问。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | snps_uvm_reg_bank 与 create_snps_bank_map | 两版 VCS 均有;Accellera 无 | group 覆盖率接口、predictor 与 path 变化见 M07-025;扫描 D6 指向该条。 | | UVM_VCS_EXT_PREDICT_SYNC | 目标保留,默认关闭 | 为 uvm_reg 增加全局 predict_done 事件;启用时需按集成验证同步点。 | | UVM_VCS_INDEX_BY_ID / UVM_VCS_FOREACH_OPT | 目标保留,默认关闭 | reg_map 的范围与 id 索引优化;实际性能和访问结果需按启用配置验证。 | | UVM_FUNC_GET_MASK | 目标保留,默认关闭 | uvm_reg::GET_MASK 虚函数钩子;直接依赖时核对目标签名。 | | UVM_SPARSE_ARRAY、地址排除 | 旧文件/接口删除,目标仍有部分悬空 ifdef 钩子 | 编译条件、改法见 M07-018、M07-019。不能仅因钩子仍在就启用宏。 | | VCS 与 Accellera 的目标 reg 文件差异 | reg/block/map/model/backdoor 及 access/bit_bash sequence 有差异 | 全文件清单见文件差异附录;两侧 virtual class 声明不是 Synopsys 私有定制。 | --- ## 第 8 章 TLM(tlm1 / tlm2) ### 概览 常规 port/export/imp 连接 API 保持,基础传输已有双库实测。优先检查 FIFO 清空、GP extension 比较与打包格式:目标 VCS 上已复现 FIFO 残留和 GP 漏检。socket 基类、查询容器及 `uvm_tlm_time` 别名按实际用法核对。 ### 建议阅读顺序 先检查 FIFO 清场、GP extension 比较和跨边界位流,再处理端口查询签名;不要以正常完成一次传输替代这些检查。 M08-001 → M08-002 → M08-003 → M08-011 ### 差异条目 #### uvm_tlm_fifo::flush() 不再向 get_ap 广播,VCS 两项队列实测存在残留(S9) - **内容类型**:用户接口与行为 - **验证方法**:停止 producer/consumer 后放入至少两项,清场后断言 used=0;另检查广播次数符合下游契约。 - **影响类型**:静默/数据风险 - **一句话结论**:无并发的清场边界可用 try_get 循环排空并断言 used=0;同时保留并检查 get_ap 广播契约。 - **适用条件**:依赖 uvm_tlm_fifo::flush 清除残留事务时,至少填入两项对照;并发 producer/consumer 必须先停止。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库 FIFO 清场残留已复现;无并发边界的显式排空已验证。 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/tlm1/uvm_tlm_fifos.svh:172` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifos.svh:200` - **差异说明**:旧行为(1.2):先 `while(r) r = try_get(t)` 循环排空(走 `uvm_tlm_fifo::try_get`,**每条都会触发 `get_ap.write(t)` 分析广播**),之后才检查"仍有残留且存在阻塞 get"并报 `flush failed` 错误。新行为(2.0):先 `m_clear_zombie_gets()` 清理已被 kill 的 get 进程;若 `m.num() > 0 && m_pending_blocked_gets.size() != 0` 则**直接报错并 return,不做任何清空**;否则用 `m.try_get(t)`(直接操作内部 mailbox,**不触发 get_ap 分析广播**)排空。净效果:① flush 时序对分析端口的副作用被移除;② 存在阻塞 get 时 FIFO 内容保持不动(1.2 会尽量排空)。 - **实测观察**:VCS W-2024.09-SP2-8、同一无并发用例放入两个 int 后,1.2 flush 广播 2 次且 used=0;2.0 广播 0 次但 **used=1**。本机 mailbox::try_get 在原有两项时返回整数 2,而 2.0 源码 `bit r; ... r = m.try_get(t)` 将其截为 0,与循环提前退出的现象一致。该观察限定于本机 VCS 与测试条件,不据此声称所有仿真器都有同样结果。 - **迁移动作**:在已确保没有并发 producer / 阻塞 consumer 的复位或清场边界,使用 `while (fifo.try_get(item))` 排空并断言 `fifo.used()==0`;该公开方法将 mailbox 返回值归一成 bit,且保留 get_ap 广播。若刻意不需要广播,应在用户派生类中实现明确的排空策略并单独验证。并发场景须先停止参与方,不可仅将 flush 换成循环后宣称等价。 - **兼容说明**:兼容措施不修复 flush 残留;try_get 排空仅用于收发已停止的边界,并保留 get_ap 广播。 - **标准依据**:IEEE 1800.2-2020 §12.2.8.2.6(2.0 源码标注) ##### 修改前后 对 `uvm_tlm_fifo#(packet)` 清场,旧调用为: ```systemverilog fifo.flush(); ``` 目标库中先停止生产者,再显式取空。`packet` 换成 FIFO 的实际数据类型: ```systemverilog packet discarded; while (fifo.try_get(discarded)) begin end if (fifo.used() != 0) `uvm_error("FIFO_DRAIN", "FIFO still contains pending items") ``` `try_get` 会向 `get_ap` 广播取出的项;先确认下游把这类清场当作丢弃还是正常消费。并发生产或仍有阻塞消费者时,应先完成停机握手,再执行此片段。 | FIFO 中原有两项 | 1.2 | 2.0 | |---|---|---| | flush 后广播次数 | 2 | 0 | | flush 后剩余项数(归档 VCS 构建) | 0 | 1 | | 继续显式取空后的剩余项数 | 0 | 0 | #### uvm_tlm_generic_payload::do_compare() 全面重写 - **内容类型**:用户接口与行为 - **验证方法**:分别制造 lhs/rhs 独有 extension、缺失后一个 extension 和内容不匹配;每种不等都应检出,全部匹配才返回相等。 - **影响类型**:静默/数据风险 - **一句话结论**:GP 比较必须同时检查 extension 键集合与各项内容;只依赖 GP compare 或安静的日志可能漏检。 - **适用条件**:scoreboard 比较 uvm_tlm_generic_payload,且事务携带 extension 时重点核对。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库 GP extension 漏检已复现;显式集合比较在限定场景通过。 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/tlm2/uvm_tlm2_generic_payload.svh:444` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_generic_payload.svh:471` - **差异说明**:1.2 对字段作短路比较,extension 集合双向检查,byte_enable 数组内容本身不参与比较。2.0 改为逐字段 comparer 操作,新增 byte_enable 内容比较;`threshold` 控制比较停止门槛,与控制消息条数的 `show_max` 是不同属性。消息经 `comparer.print_msg()` 发出,仍使用 comparer 的 severity。顶层 `obj.compare()` 自动 flush;只有直接调用 `do_compare()` 等自行管理上下文的路径才需额外防范累计 result。 - **实测风险**:① 2.0 只遍历 lhs 的 extension,rhs 独有项漏检;② 遍历中 `if (!threshold || result < threshold) break` 在尚未达到阈值时退出,两个相同 extension 只调用一次比较,删除后一个 extension 仍返回相等。双库 `semantic_probe` 在相同条件下分别观察到比较次数 2 / 1、缺失后返回值 0 / 1。该缺陷存在于目标实现,不能仅靠双向调用 GP compare 消除。 - **迁移动作**:使用 extension 的 scoreboard 显式检查两侧键集合,并逐项比较每个 extension,结果与 GP 基本字段比较共同决定匹配。`semantic_probe.sv` 的 `extensions_equal()` 演示了派生 GP 访问受保护集合的方案;实际环境也可对已知 extension 类型逐项检查。依赖日志的断言同步核对消息 ID、数量和 severity;不能仅凭 compare 输出安静就判断相等。 - **兼容说明**:兼容措施不修复 GP extension 漏检;键集合与各项内容须显式比较,并保留基本字段检查。 - **标准依据**:无(2.0 标注 @uvm-contrib,待贡献至 1800.2) #### uvm_tlm_generic_payload do_pack/do_unpack 无条件打包 m_dmi,打包流布局变化 - **内容类型**:用户接口与行为 - **验证方法**:检查 DMI 状态、总位数、数据/byte-enable 数组和逐位 golden;compat packer 不会取消 GP 自身增加的 DMI 位。 - **影响类型**:静默/数据风险 - **一句话结论**:GP 新增 DMI 打包位会改变跨版本协议;compat packer 不能撤销这项变化,应明确两端格式。 - **适用条件**:跨版本传输或保存 GP 位流的路径需比较 golden;同版闭环也需验证实际数组和缓冲区条件。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/tlm2/uvm_tlm2_generic_payload.svh:509`(do_pack)、`:548`(do_unpack) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_generic_payload.svh:557`(do_pack,m_dmi 在 :570)、`:602`(do_unpack,m_dmi 在 :607) - **差异说明**:1.2 中 `m_dmi`(1 bit)仅在定义 `VCS_TLI_GP_PACKING` 时打包,位置在 m_response_status 之后;2.0 改为**无条件**打包,位置在 m_length 之后、m_data 之前。依赖原布局的跨版本交换(TLI、DPI 桥接、落盘回放)需重新定义或适配契约。同版 pack/unpack 也要核对数组分配、长度和实际对象内容,不能仅凭使用同一库免测。另注意:2.0 下若再定义 `VCS_TLI_GP_PACKING`,m_dmi 会被打包**两次**(:570 无条件 + :578 ifdef 内),布局与 1.2+该 define 也不同。 - **迁移动作**:跨版本交换时升级两端契约或显式保留旧格式;更换 compat packer 不会撤销 GP 自身新增的 m_dmi。`serialization_probe` 中相同 GP 在 compat packer 下仍由 240 位变为 241 位,1.2 默认流不携带 DMI 状态。两版已有的预分配 data 数组解包风险也应核对 `UVM_TLM_GP_BUF_OVERFLOW_FIX`,不要仅凭同版闭环就免测。 - **兼容说明**:compat packer 不能撤销 GP 新增的 m_dmi 位;跨版本协议须明确格式并逐位验收。 - **标准依据**:IEEE 1800.2-2020 §12.3.4.2.4 / §12.3.4.2.5(2.0 源码标注,打包字段顺序含 m_dmi) #### uvm_tlm_fifo_base 改用 use_automatic_config(),派生 FIFO 默认停止字段自动配置 - **页面标题**:派生 TLM FIFO 的字段自动配置默认停止 - **内容类型**:用户接口与行为 - **验证方法**:设置已注册字段的非默认配置值,比较 build 后的实际值与 apply_config_settings 调用次数;恢复自动配置后重验字段赋值,并核对业务 FIFO 传输。 - **适用条件**:派生 uvm_tlm_fifo_base、uvm_tlm_fifo 或 uvm_tlm_analysis_fifo,并依赖注册字段的自动配置;无需覆盖 build_phase 也可能受影响。 - **影响类型**:静默/数据风险、其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化(字段自动配置默认值改变) - **1.2 位置**:`src/vcs-uvm-1.2/tlm1/uvm_tlm_fifo_base.svh:166`(调用 build);`src/vcs-uvm-1.2/base/uvm_component.svh:2447`(默认调用 apply_config_settings) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifo_base.svh:174`(use_automatic_config 返回 0);`src/vcs-uvm-ieee-2020-2.0/base/uvm_component.svh:3928`(仅钩子返回 1 时调用 apply_config_settings);`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifo_base.svh:53`(同时新增 `` `uvm_component_abstract_param_utils ``) - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | FIFO 自身的 build 路径改为自动配置钩子 | fifo_base 的 build_phase 仍调用继承的 build:`src/vcs-uvm-1.2/tlm1/uvm_tlm_fifo_base.svh:165-169`。注释中的关闭意图需结合下一项核对。 | fifo_base 的 use_automatic_config 默认返回 0:`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifo_base.svh:173-176`。 | | component::build 决定字段是否实际得到自动配置 | build 在未全局禁用时调用 apply_config_settings:`src/vcs-uvm-1.2/base/uvm_component.svh:2447-2457`。与上一项的 build 调用相接,默认会执行自动配置。 | build 仅在 use_automatic_config 返回 1 时调用:`src/vcs-uvm-ieee-2020-2.0/base/uvm_component.svh:3927-3932`。FIFO 默认返回 0,因而跳过;派生类返回 1 后的恢复效果见实测。 | - **差异说明**:1.2 的 fifo_base override `build_phase()` 后仍调用继承的 `build()`,默认会执行字段自动配置;源码中的关闭意图注释不能代替实际调用链。VCS 1.2 另有全局禁用条件,见 M01-007。2.0 删除该 override,新增默认返回 0 的 `use_automatic_config()`,因此依赖自动配置的派生字段会保留初始值。两侧 fifo_base 均与各自 Accellera 参照一致;原版 1.2 的 build 也调用自动配置(`src/uvm-1.2/src/base/uvm_component.svh:2319`),原版 2.0 同样按钩子门控(`src/1800.2-2020-2.0/src/base/uvm_component.svh:3450`)。 - **迁移动作**:需要维持派生字段自动赋值时,在派生 FIFO 中 override `virtual function bit use_automatic_config()` 并返回 1;已有 build_phase 仍须保留业务逻辑和所需的 super 调用。未依赖派生字段自动配置的普通 FIFO 传输无需为本条改写。字段 FLAG 的使能方式另按 M09-002 核对。 - **兼容说明**:deprecated / legacy field 开关和 compat 包不会自动改变 FIFO 的 use_automatic_config 返回值;恢复所需赋值须显式重写该主库钩子。返回 1 只重新启用自动配置调用,不保证配置类型、路径和字段 FLAG 已正确。 ##### 修改前后 旧派生 FIFO 可只注册字段,并在父组件 build 时设置配置: ```systemverilog // 派生 FIFO 内注册:`uvm_field_int(configured_value, UVM_DEFAULT) // 父组件 build 中设置,fifo 是该派生实例的名字: uvm_config_db#(uvm_bitstream_t)::set(this, "fifo", "configured_value", 42); ``` 目标版若继续依赖自动赋值,在派生 FIFO 内增加: ```systemverilog virtual function bit use_automatic_config(); return 1; endfunction ``` ##### 已有实测结果 `doc_fact_probe` 的字段初始值为 0,父组件配置为 42。1.2 / 2.0 默认的自动配置调用次数为 **1 / 0**,build 后字段值为 **42 / 0**;目标派生类返回 1 后恢复为调用 **1** 次、字段值 **42**。该探针核对注册整数字段的配置,不代替任意对象配置、定制 build 链或并发 FIFO 传输验证。 #### uvm_tlm_fifo 阻塞 get 跟踪机制重构:can_get() 修复僵尸计数 - **页面标题**:kill 阻塞 get 进程后,FIFO 的 can_get() 恢复 - **内容类型**:用户接口与行为 - **验证方法**:kill 阻塞 get 后 put 新事务,检查 can_get 及后续 get 可完成;仅在此实际场景验证通过后移除旧补偿。 - **适用条件**:阻塞 get 的进程可能被 kill,或保留旧僵尸计数补偿。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化(缺陷修复) - **1.2 位置**:`src/vcs-uvm-1.2/tlm1/uvm_tlm_fifos.svh:52`(int 计数器)、`:158`(can_get) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifos.svh:57`(按 process 的关联数组)、`:168`(m_clear_zombie_gets)、`:185`(can_get) - **差异说明**:1.2 用 `int m_pending_blocked_gets` 计数,阻塞在 `get()` 的进程若被 kill,计数永久泄漏 → `can_get()` 恒返回 0、`flush()` 误报。2.0 改为 `bit m_pending_blocked_gets[process]`(或 `process_container_c`,受 `UVM_USE_PROCESS_CONTAINER` 控制),`can_get()`/`flush()` 先调用 `m_clear_zombie_gets()` 剔除已 KILLED 进程。净效果:杀死阻塞 get 进程后 FIFO 恢复正常——属修复,但依赖旧(错误)行为的测试需调整。 - **迁移动作**:先在实际阻塞 get 被 kill 的流程验证后续 can_get/get 能恢复,再移除针对旧计数泄漏的补偿;FIFO 清场另按 M08-001 验证,不能由本条推断 flush 已无风险。 - **兼容说明**:阻塞 get 恢复使用目标原生实现,无需兼容开关;旧补偿仅在实际流程通过后移除,flush 风险另验。 #### TLM2 socket 基类全部改为 virtual class - **内容类型**:用户接口与行为 - **验证方法**:构造具体 socket 并连接匹配接口,核对目标 IMP 收到的调用次数与响应;至少一笔成功和一笔错误返回。非阻塞或透传路径按实际方向与 phase 契约另验。 - **适用条件**:直接构造 TLM2 socket_base。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:签名变更(类型收紧) - **1.2 位置**:`src/vcs-uvm-1.2/tlm2/uvm_tlm2_sockets_base.svh:47`(b_target)、`:65`(b_initiator)、`:78`、`:100`、`:123`、`:148`、`:173`、`:187` 共 8 个基类 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_sockets_base.svh:49`、`:67`、`:80`、`:102`、`:125`、`:150`、`:175`、`:189` - **差异说明**:`uvm_tlm_{b,nb}_{target,initiator}_socket_base` 及 4 个 passthrough 基类由 `class` 改为 `virtual class`。直接 `new()` 这些基类(而非用 `uvm_tlm_b_initiator_socket` 等派生类)的代码在 2.0 下编译报错。正常 socket 用法不受影响。 - **迁移动作**:基类句柄可保留,构造对象改为对应具体 socket。阻塞发起端用 uvm_tlm_b_initiator_socket#(T),阻塞目标端用 uvm_tlm_b_target_socket#(IMP,T) 并提供实现 b_transport 的 IMP;非阻塞端使用 uvm_tlm_nb_initiator_socket / uvm_tlm_nb_target_socket 并实现相应方向的 nb_transport。透传端改用对应的 uvm_tlm_{b,nb}_passthrough_{initiator,target}_socket。保留原 payload/phase 类型参数和连接方向,不要只删除 _base 后忽略新增的 IMP 参数。 - **兼容说明**:兼容措施不恢复 socket 基类的可构造性;使用匹配 IMP、payload/phase 类型和方向的具体 socket。 - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 具体阻塞 target socket 用 IMP 提供 b_transport,构造时可显式传实现对象 | `src/vcs-uvm-1.2/tlm2/uvm_tlm2_sockets.svh:104-130` 声明 IMP/T 参数并在构造时绑定实现对象。 | `src/vcs-uvm-ieee-2020-2.0/src/tlm2/uvm_tlm2_sockets.svh:107-128` 保留相同 IMP 绑定方式;基类抽象化不要求重写正常具体 socket 流程。 | - **证据**:`tests/uvm_review/socket_migration_probe.sv` 的阻塞传输;`tests/uvm_review/construction_compile_probe.sv` 的 REVIEW_SOCKET 构造断点。 - **标准依据**:IEEE 1800.2-2020 §12.3.5(socket 类族) ##### 修改前后 旧代码可能直接构造阻塞发起端基类: ```systemverilog uvm_tlm_b_initiator_socket_base#() socket = new("socket", null); ``` 目标基类抽象化后,构造具体 `uvm_tlm_b_initiator_socket`。下面给出一组可运行的阻塞 initiator/target:默认 payload 为 `uvm_tlm_generic_payload`;目标 socket 的首个参数 `payload_target` 是提供 `b_transport` 的实现类 `IMP`。 ```systemverilog class payload_target extends uvm_component; uvm_tlm_b_target_socket#(payload_target) socket; int calls; function new(string name, uvm_component parent); super.new(name, parent); socket = new("socket", this, this); endfunction virtual task b_transport(uvm_tlm_generic_payload tx, uvm_tlm_time delay); calls++; if (tx.get_command() == UVM_TLM_WRITE_COMMAND && tx.get_address() == 'h20) tx.set_response_status(UVM_TLM_OK_RESPONSE); else tx.set_response_status(UVM_TLM_ADDRESS_ERROR_RESPONSE); endtask endclass ``` 构造目标 socket 时,第二个 `this` 表示父组件,第三个 `this` 是执行 `b_transport` 的对象。连接方向为 initiator → target。对应的 test: ```systemverilog class socket_test extends uvm_test; `uvm_component_utils(socket_test) uvm_tlm_b_initiator_socket#() socket; payload_target target; function new(string name, uvm_component parent); super.new(name, parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); socket = new("socket", this); target = new("target", this); endfunction function void connect_phase(uvm_phase phase); socket.connect(target.socket); endfunction task run_phase(uvm_phase phase); uvm_tlm_generic_payload tx = new("tx"); uvm_tlm_time delay = new("delay"); phase.raise_objection(this); tx.set_command(UVM_TLM_WRITE_COMMAND); tx.set_address('h20); socket.b_transport(tx, delay); $display("REVIEW|response_ok|%0d", tx.get_response_status() == UVM_TLM_OK_RESPONSE); tx.set_address('h24); socket.b_transport(tx, delay); $display("REVIEW|bad_address_rejected|%0d", tx.get_response_status() == UVM_TLM_ADDRESS_ERROR_RESPONSE); $display("REVIEW|target_calls|%0d", target.calls); $display("REVIEW|done|1"); phase.drop_objection(this); endtask endclass ``` 两类定义放在 include `uvm_macros.svh`、import `uvm_pkg::*` 之后,再由顶层 `initial run_test("socket_test");` 启动。正常地址 `'h20` 返回成功,地址 `'h24` 返回地址错误;`delay` 使用两库都支持的 `uvm_tlm_time` 名称,本例没有延迟注记。非阻塞和 passthrough 仍按各自前向/后向接口实现,不能由这个阻塞示例推断其完整行为等价。 ##### 已有实测结果 直接构造阻塞 initiator 基类在 1.2 编译通过,目标报 `SV-ACCNBI`。`socket_migration_probe` 的具体 socket 在两库均完成连接;目标收到两次调用,合法地址返回 `UVM_TLM_OK_RESPONSE`,非法地址返回 `UVM_TLM_ADDRESS_ERROR_RESPONSE`。实验验证 IMP 派发、连接方向和响应返回,不覆盖 payload 数据搬运、时间注记、非阻塞 phase 或背压。 #### uvm_tlm_time 更名 uvm_time,文件同步更名,库内保留 typedef - **内容类型**:用户接口与行为 - **验证方法**:编译更新后的文件组织及旧别名声明,检查时间设置/读取;正常别名使用不要求改名。 - **适用条件**:直接 include 旧 uvm_tlm_time 文件,或使用保留类型别名。 - **影响类型**:编译断点 - **处理级别**:按条件核对 - **兼容机制**:主库保留 - **类型**:删除 API(原名)+ 新增 API(等价类),自带兼容别名 - **1.2 位置**:`src/vcs-uvm-1.2/tlm2/uvm_tlm2_time.svh:31`(`class uvm_tlm_time`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm_time.svh:37`(`class uvm_time`)、`:210`(`typedef uvm_time uvm_tlm_time;`);包含入口 `src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2.svh:24`(1.2 为 `uvm_tlm2.svh:22` include `uvm_tlm2_time.svh`) - **差异说明**:类本体方法集零变化(仅报错宏尾分号等装饰性差异),仅类名与文件名变更;2.0 在库本体提供 `typedef uvm_time uvm_tlm_time`,因此用户代码中的 `uvm_tlm_time` 声明、nb_transport/b_transport 的 delay 参数均无需修改。唯一受影响场景:直接 `` `include "tlm2/uvm_tlm2_time.svh" `` 的编译文件列表(该文件在 2.0 不存在,新名 `uvm_tlm_time.svh`)。 - **迁移动作**:仅使用 uvm_tlm_time 类型时可保留声明。自行组织库文件的构建将 tlm2/uvm_tlm2_time.svh 引用改为 tlm2/uvm_tlm_time.svh;使用 VCS 内置库和 import uvm_pkg::* 的用户代码不必额外 include 该类文件,避免重复定义。 - **兼容说明**:主库 typedef 保留 uvm_tlm_time 类型名,无需开启宏;旧 uvm_tlm2_time.svh 文件名未保留,手工 include 或 filelist 引用仍须调整。 - **标准依据**:IEEE 1800.2-2020 §5.6(2.0 源码标注 §5.6.1,uvm_time 为标准类) #### uvm_tlm_fifo / uvm_tlm_analysis_fifo / uvm_tlm_req_rsp_channel / uvm_tlm_transport_channel 加入工厂注册 - **页面标题**:TLM 组件的工厂创建与类型名 - **内容类型**:用户接口与行为 - **验证方法**:工厂创建后检查实际类型及名称,传输请求/响应一轮并核对数量;更新实际依赖的类型字符串。 - **适用条件**:通过 factory 创建 TLM 组件,或按 transport_channel 类型字符串匹配。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:新增 API(能力增强) - **1.2 位置**:`src/vcs-uvm-1.2/tlm1/uvm_tlm_fifos.svh:48`、`:228`(仅 `const static string type_name` + `get_type_name()`,无注册);`src/vcs-uvm-1.2/tlm1/uvm_tlm_req_rsp.svh:50` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifos.svh:51-52`、`:233-234`;`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_req_rsp.svh:53-54`、`:295` - **差异说明**:2.0 对上述类增加参数化组件注册,获得 type override 能力。fifo/analysis_fifo/req_rsp 的类型名保持;transport_channel 以前继承 req_rsp 的名字,现在显式返回 uvm_tlm_transport_channel #(REQ,RSP),按类型字符串识别的日志/工具需要更新。同时 req_rsp 的手写 create 删除,由宏提供。 - **迁移动作**:普通 FIFO 和 req_rsp 传输调用可保留;根据 transport_channel 的 get_type_name() 输出匹配日志时,改为目标 uvm_tlm_transport_channel #(REQ,RSP)。类型判断优先使用实际类型句柄或 $cast;采用新 factory 创建能力时验证 override 后对象身份和一次完整请求/响应。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### TLM 接口未实现错误消息文本变化 - **内容类型**:用户接口与行为 - **验证方法**:受控调用未实现接口,检查按消息 ID 分类能检出错误;正常实现对照不得误报。 - **适用条件**:日志工具匹配 TLM 未实现接口的完整旧文案。 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:行为变化(消息文本) - **1.2 位置**:`src/vcs-uvm-1.2/tlm1/uvm_tlm_ifs.svh:23-24`;`src/vcs-uvm-1.2/tlm2/uvm_tlm2_ifs.svh:67` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_ifs.svh:24-25`;`src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_ifs.svh:71` - **差异说明**:`` `UVM_TASK_ERROR ``/`` `UVM_FUNCTION_ERROR `` 由 `"TLM interface task/function not implemented"` 改为 `"UVM TLM interface task/function not implemented"`;`` `UVM_TLM_FUNCTION_ERROR `` 由 `"TLM-2 interface function not implemented"` 改为 `"UVM TLM 2 interface function not implemented"`。仅影响按消息全文匹配日志的脚本/断言。 - **迁移动作**:日志正则若匹配旧文案需放宽(建议匹配消息 id 而非正文)。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### 无代码差异文件清单(已逐一核对,供核销) - **内容类型**:内部实现 - **影响类型**:无行为变化 - **处理级别**:无需改动 - **兼容机制**:无需启用 - **类型**:内部重构(无行为影响) - **差异说明**:`tlm1/uvm_ports.svh`、`uvm_exports.svh`、`uvm_imps.svh`、`uvm_tlm_imps.svh`、`uvm_sqr_connections.svh`、`uvm_sqr_ifs.svh`、`tlm2/uvm_tlm2_ports.svh`、`uvm_tlm2_exports.svh`、`uvm_tlm2_imps.svh`、`uvm_tlm2_defines.svh`、`macros/uvm_tlm_defines.svh`(宏集合两侧逐一比对一致)仅有注释/`@uvm-ieee` 标注/排版差异;`tlm2/uvm_tlm2_sockets.svh` 仅 `uvm_error` 宏调用尾分号清理;`tlm1/uvm_analysis_port.svh` 的 write 逻辑两侧等价(Verdi 录制钩子为 Synopsys 双侧共有,见下节)。 - **迁移动作**:无 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### port.get_connected_to / get_provided_to 返回容器改为 port 句柄 - **内容类型**:用户接口与行为 - **验证方法**:编译与 IF 匹配的新容器,建立已知连接后检查集合大小和每个 port 句柄;需要 proxy 时验证 get_comp 路径。 - **适用条件**:保存 get_connected_to/get_provided_to 的旧 proxy 容器。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:主库保留 - **类型**:签名变更(编译断点) - **1.2 位置**:`src/vcs-uvm-1.2/base/uvm_port_base.svh:636` / `:649`(ref uvm_port_list,值为 proxy component) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/base/uvm_port_base.svh:710` / `:736`(ref uvm_port_base#(IF) list[string]);`:171` / `:182`(proxy 上保留旧形态) - **差异说明**:直接调用 port 的查询接口并传 uvm_port_list,在目标 VCS 报 IRPC,不能将 TLM 查询 API 一概称为不变。目标返回真实 port,需再调用 get_comp() 取得 proxy;新增 get_provided_to_component 返回 parent component,和 proxy 不是同一概念。 - **迁移动作**:将容器声明为与端口 IF 参数匹配的 `uvm_port_base#(IF) list[string]`,并调整后续访问;若需要旧 proxy 容器,可经 port.get_comp() 调用其查询接口。 - **兼容说明**:主库 proxy 保留旧 uvm_port_list 查询,可通过 port.get_comp() 使用;直接 port 的旧容器签名未保留,改用真实 port 集合时同步元素类型。 - **证据**:`tests/uvm_review/compile_extended.sv` C15。 ##### 修改前后 以 `uvm_blocking_put_port#(int) port_value` 为例,实际 IF 为 `uvm_tlm_if_base#(int,int)`。在端口已构造并完成连接解析后查询: ```systemverilog // UVM 1.2 uvm_port_list peers; port_value.get_connected_to(peers); ``` ```systemverilog // UVM 2.0: collection of actual ports uvm_port_base#(uvm_tlm_if_base#(int,int)) peers[string]; port_value.get_connected_to(peers); ``` 其他端口按自身 IF 类型声明容器;`get_provided_to` 同样调整。集合元素现在是真实 port,要取得旧 proxy 时调用 `peers[name].get_comp()`。 如果后续代码确实需要 proxy 集合,可保留 `uvm_port_list`,改用主库保留的 proxy 查询: ```systemverilog uvm_port_list peers; port_value.get_comp().get_connected_to(peers); ``` 两种写法按后续代码需要选择。proxy component 与端口所属的 parent component 含义不同,不能互换。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | Verdi 端口事务插桩 | 两版均有 UVM_IF_METHOD_BEGIN/END、METHOD2/METHOD5 宏及 UVM_VERDI_PORT_RECORD_TX | tlm1/tlm2 imp、analysis write 与 TLM 宏向 tr_database 上报;UVM_VERDI_NO_PORT_RECORDING 可关闭。Accellera 无此逻辑,实际后端录制另行验证。 | | VCS_TLI_GP_PACKING | 两版都有条件打包,目标与旧版布局不同 | DMI 位重复及外部契约检查见 M08-003;补充区不另维护第二套打包改法。 | | UVM_TLM_GP_BUF_OVERFLOW_FIX | 两版保留 | 影响解包数据循环;预分配数组边界与 M08-003 一起检查。 | | UVM_CREATE_OPT | 旧 extension/channel 的 create 条件保护在目标移除 | 对象构造需结合实际工厂路径核对,见 M09-003;不据此要求全部 TLM 调用改写。 | --- ## 第 9 章 宏与废弃 API(macros/ + deprecated/) ### 概览 优先核对 field FLAG 是否启用全部所需操作;负向位或部分正向位都可能在目标库中跳过比较、打印等操作。字段自动化改由 `do_execute_op/uvm_field_op` 分派;旧 sequence 宏、print/record 宏、版本分支和 factory 构造约定分别核对。deprecated 与 legacy field 开关提供不同的过渡能力。 ### 建议阅读顺序 本主题集中核对 field FLAG、版本判断和兼容开关。Sequence 动作宏归入 Sequence,打印与打包宏归入策略与 I/O,factory 注册宏归入对象模型与工厂。手写 automation 属于直接依赖 UVM 内部接口的代码。 M09-002 → M09-007 → M09-008 → M09-006 ### 差异条目 #### 字段自动化机制重写:`__m_uvm_field_automation` → `do_execute_op(uvm_field_op)` - **内容类型**:内部实现 - **阅读主题**:09 - **关联主条目**:M01-003 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M01-003。 #### field 宏 FLAG 改为逐操作显式启用,旧负向或部分正向组合可能漏操作 - **页面标题**:uvm_field_* automation:显式启用需要的字段操作 - **内容类型**:用户接口与行为 - **影响类型**:静默/数据风险 - **一句话结论**:逐项核对 field FLAG 是否显式启用了所需操作;只有负向位或只含部分正向位都可能漏操作,且不一定告警。 - **处理级别**:命中后修改 - **兼容机制**:legacy field 开关 - **类型**:行为变化 + 签名变更(新增默认实参) - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:635`(`uvm_field_int(ARG,FLAG)`,各操作仅判负向位 `!((FLAG)&UVM_NOxxx)`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:842`(`uvm_field_int(ARG,FLAG=UVM_DEFAULT)`)、`:787`(`m_warn_if_no_positive_ops`)、`:800`(`m_uvm_field_begin`) - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 每项字段操作增加正向 FLAG 检查 | COPY/COMPARE 分支只检查对应禁用位:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:642-656`。例如 NOCOPY 不会禁用 compare。 | 操作守卫同时检查正向位和禁用位;legacy 开关移除正向检查:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:816-825`。uvm_field_int 的 COPY/COMPARE 调用该守卫:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:842-849`;此段是宏中对应两项操作的片段。 | | NO_FLAG 告警不能覆盖所有漏操作写法 | 旧行为由上面的负向位判断决定;各 FLAG 的实际操作效果见两版实验。 | 告警宏包含无正向位等附加条件,并有仅提示一次的状态:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:787-798`。已有部分正向位或数值 0 的写法可能不提示,须逐项验证操作。 | - **差异说明**: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`。 - **实测观察(VCS W-2024.09-SP2-8)**:`` `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 宏摘除前半)。 - **迁移动作**:审计全部 field FLAG 的实际操作意图,包括部分正向位、自定义宏和纯数字。若要保留旧版“除禁用项外都执行”,使用 `UVM_ALL_ON | 原禁用位`;若有意只执行部分操作,列出每个需要的正向位及对应禁用约束。S3 会计算受支持 FLAG 表达式的六类操作使能并报告未知表达式;宏展开、set 操作及实际数据行为仍需核对,不能仅凭零命中或没有 NO_FLAG 核销。legacy field 开关作为过渡时仍需验证实际操作。 - **兼容说明**:UVM_LEGACY_FIELD_MACRO_SEMANTICS 在已测负向及部分正向 FLAG 场景恢复旧操作规则,不依赖 deprecated 开关或 compat 包;不恢复旧 automation 分派、打印宏签名或任意位流格式。改写 FLAG 后移除开关并逐项验证所需操作。 - **标准依据**:IEEE 1800.2-2020 §B.2.2(各 field 宏原型均为 `FLAG=UVM_DEFAULT`) ##### 适用条件 用于 `uvm_field_*` 的 FLAG 没有显式启用全部所需操作时核对本条:包括 `UVM_NOCOPY`、`UVM_COPY` 等部分操作组合、0、进制位以及自定义 FLAG。已有某个正向位不代表其他操作已启用;保留原禁用意图,不批量覆盖原 flag。 ##### 修改前后 旧写法想禁止 copy,同时保留比较、打印、打包和记录: ```systemverilog `uvm_field_int(value, UVM_NOCOPY) ``` 显式启用操作,再保留原来的禁用意图: ```systemverilog `uvm_field_int(value, UVM_ALL_ON | UVM_NOCOPY) ``` 过渡期可在目标库构建中使用 `+define+UVM_LEGACY_FIELD_MACRO_SEMANTICS`。此开关与 `UVM_ENABLE_DEPRECATED_API` 不同,也不需要靠 import compat 包启用。显式 flag 改写后,应去掉过渡开关重新验证。 ##### 如何验证 创建两个仅 `value` 不同的对象,直接检查 `a.compare(b)`。**应返回 0,表示发现不匹配**。再调用 `b.copy(a)`,确认被禁止 copy 的 `b.value` 保持原值。改写后按所需操作分别验收 print、pack、record;启用过渡开关时,还需在移除开关后复验。 ##### 已有实测结果 | 观察量 | 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 与过渡开关为限;实际改写后按所需操作分别验收。 #### factory `create()` 强制向构造函数传 name(`m_uvm_object_create_func` 重写) - **页面标题**:工厂创建的对象需要带 name 参数的构造函数 - **内容类型**:用户接口与行为 - **阅读主题**:01 - **验证方法**:两库编译同一构造签名,使用 type_id::create 创建对象并检查 get_name;同时核对 super.new 转发。 - **适用条件**:工厂创建无 name 参数构造类,且旧构建依赖 UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:行为变化(可致编译错误) - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:412`(VCS 默认分支:`tmp = new(); if (name!="") tmp.set_name(name);`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:515`(`if (name=="") tmp = new(); else tmp = new(name);`) - **差异说明**:须区分对象的 `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`,勿将所有无参类都计为新增断点。 - **兼容说明**:旧 constructor 兼容宏不再提供;依赖该宏的注册类须补 name 参数并转发 super。 ##### 修改前后 需要工厂创建的 `uvm_object` 派生类中,旧构造函数没有名称参数: ```systemverilog function new(); super.new(); endfunction ``` 改为接受并转发名称: ```systemverilog 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`,不应把所有无参构造都算作切库新增错误。 #### sequence 动作宏收窄:15 个常用宏移入 deprecated(`uvm_do_with`/`uvm_do_on*`/`uvm_do_pri*`/`uvm_send_pri`/`uvm_rand_send_*`/`uvm_create_on`/`uvm_create_seq`/`uvm_do_seq*`) - **页面标题**:uvm_do* 动作宏:约束、sequencer 与优先级的迁移 - **一句话结论**:把旧宏的约束、sequencer 和优先级完整传给新宏;只改宏名可能让激励丢失原约束。 - **内容类型**:用户接口与行为 - **阅读主题**:06 - **验证方法**:使用带约束、指定 sequencer 和优先级的样例验证新原型;移除 deprecated 后再编译,检查实际激励仍满足约束。 - **适用条件**:调用 deprecated 的旧 sequence 动作宏。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:deprecated 开关 - **类型**:废弃(deprecated) + 签名变更 - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_sequence_defines.svh:90`(`uvm_do`)、`:146`(`uvm_create_on`)、`:162`/`:174`/`:187`/`:199`(`uvm_do_on*`)、`:240`/`:270`/`:282`/`:294`(`uvm_send_pri`/`uvm_rand_send_*`) ;补充:`src/vcs-uvm-1.2/macros/uvm_sequence_defines.svh:101` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_sequence_defines.svh:50`(`uvm_create(SEQ_OR_ITEM, SEQR=get_sequencer())`)、`:100`(`uvm_do(SEQ_OR_ITEM, SEQR=get_sequencer(), PRIORITY=-1, CONSTRAINTS={})`)、`:125`(`uvm_send`)、`:145`(`uvm_rand_send`);被移除宏见 `src/vcs-uvm-ieee-2020-2.0/deprecated/macros/uvm_sequence_defines.svh:47` 起,仅经 `+define+UVM_ENABLE_DEPRECATED_API` 引入(`src/vcs-uvm-ieee-2020-2.0/uvm_macros.svh:130-131`,默认不编入) - **差异说明**:2.0 主线仅保留 4 个动作宏并加默认实参,单参 `` `uvm_do(seq) `` 调用源码兼容;`uvm_do_with`/`uvm_do_on*`/`uvm_do_pri*` 等 15 个变体默认不可用。另有行为差异:默认 sequencer 由 1.2 的 `m_sequencer` 改为 `get_sequencer()`(在 sequence 上下文外调用时结果不同);`uvm_rand_send` 改用 `is_item()`/`get_randomize_enabled()` 判定并对非 sequence/item 实参新增 `NOT_SEQ_OR_ITEM` 警告。 - **迁移动作**:`uvm_do_with(x,{...})` → `uvm_do(x, get_sequencer(), -1, {...})` 或手工 start\_item/randomize/finish\_item;过渡期可 `+define+UVM_ENABLE_DEPRECATED_API`。 - **兼容说明**:UVM_ENABLE_DEPRECATED_API 开放本条列出的 15 个旧动作宏,不需要编译 compat 包;它不恢复已删除的注册宏,也不代替约束、sequencer、parent 和优先级验证。 - **标准依据**:IEEE 1800.2-2020 §B.3.1.1、§B.3.1.4(`uvm_do(SEQ_OR_ITEM, SEQR=get_sequencer(), PRIORITY=-1, CONSTRAINTS={})`) ##### 修改前后 在 sequence 的 `body()` 中,`req` 是已声明的请求句柄,`addr` 是它的随机字段。 旧写法: ```systemverilog `uvm_do_with(req, { addr == 'h100; }) ``` 目标写法,保留原 sequencer、默认优先级和地址约束: ```systemverilog `uvm_do(req, get_sequencer(), -1, { addr == 'h100; }) ``` 若原来指定了 sequencer 和优先级: ```systemverilog // UVM 1.2 `uvm_do_on_pri_with(req, target_seqr, 100, { addr == 'h100; }) // UVM 2.0 `uvm_do(req, target_seqr, 100, { addr == 'h100; }) ``` 不要缩成 `uvm_do(req)`,否则原约束会丢失。暂不改代码时,可在目标编译命令中加 `+define+UVM_ENABLE_DEPRECATED_API`。 | 本条示例 | 1.2 | 2.0 默认 | 2.0 开启 deprecated | |---|---|---|---| | 旧带约束宏 | 可编译 | 宏不可用 | 可编译 | | 新带参数宏 | 不适用此旧原型 | 可编译,保留约束 | 可编译,保留约束 | 在 driver 检查每笔 `req.addr=='h100`,并确认发送到预期 sequencer;多优先级环境还需检查实际仲裁结果。 完整旧宏映射如下。`x` 是 sequence/item 句柄,`s` 是目标 sequencer,`p` 是原优先级,`c` 是含花括号的约束块(如 `{ addr == 'h100; }`)。表中的宏调用均带反引号。 | UVM-1.2 旧宏 | 2.0 目标调用 | |---|---| | `uvm_do_pri(x, p)` | `uvm_do(x, get_sequencer(), p)` | | `uvm_do_with(x, c)` | `uvm_do(x, get_sequencer(), -1, c)` | | `uvm_do_pri_with(x, p, c)` | `uvm_do(x, get_sequencer(), p, c)` | | `uvm_create_on(x, s)` | `uvm_create(x, s)` | | `uvm_do_on(x, s)` | `uvm_do(x, s)` | | `uvm_do_on_pri(x, s, p)` | `uvm_do(x, s, p)` | | `uvm_do_on_with(x, s, c)` | `uvm_do(x, s, -1, c)` | | `uvm_do_on_pri_with(x, s, p, c)` | `uvm_do(x, s, p, c)` | | `uvm_send_pri(x, p)` | `uvm_send(x, p)` | | `uvm_rand_send_pri(x, p)` | `uvm_rand_send(x, p)` | | `uvm_rand_send_with(x, c)` | `uvm_rand_send(x, -1, c)` | | `uvm_rand_send_pri_with(x, p, c)` | `uvm_rand_send(x, p, c)` | | `uvm_create_seq(x, cons_if)` | `uvm_create(x, cons_if.consumer_seqr)` | | `uvm_do_seq(x, cons_if)` | `uvm_do(x, cons_if.consumer_seqr)` | | `uvm_do_seq_with(x, cons_if, c)` | `uvm_do(x, cons_if.consumer_seqr, -1, c)` | 最后三项是两侧 VCS 库提供的 consumer-sequencer 别名。`cons_if` 必须包含有效的 `consumer_seqr` 成员;不能把整个接口对象当成 sequencer 传入。 保留创建与随机化的原意:`uvm_create` 只创建;`uvm_send` 发送已有对象且不随机化;`uvm_rand_send` 对已有对象按目标规则随机化后发送;`uvm_do` 会创建并执行。旧 `uvm_create(x)`、`uvm_do(x)`、`uvm_send(x)`、`uvm_rand_send(x)` 的单参形式仍可在 sequence 上下文使用。 例如先指定 sequencer 创建,再发送已填写的值: ```systemverilog // UVM 1.2 `uvm_create_on(req, target_seqr) req.addr = 'h100; `uvm_send_pri(req, 100) ``` ```systemverilog // UVM 2.0 `uvm_create(req, target_seqr) req.addr = 'h100; `uvm_send(req, 100) ``` 若原来是 `uvm_rand_send_with`,则使用 `uvm_rand_send(req, -1, { addr == 'h100; })`,保留“使用已有对象并重新随机化”的行为。不要把这两类发送统一改成会重新创建对象的 `uvm_do`。sequence 自身禁用随机化、父子 sequence 回调和 sequence 上下文外的调用,仍按实际使用条件验证。 #### `uvm_deprecated_defines.svh` 整文件删除(`uvm_sequence_utils`/`uvm_sequencer_utils`/`uvm_declare_sequence_lib`/`uvm_update_sequence_lib*`/`uvm_package`/`uvm_sequence_library_package` 等) - **页面标题**:旧 sequence 注册宏改为 object/component 注册 - **内容类型**:用户接口与行为 - **阅读主题**:06 - **验证方法**:编译新 utils/package 写法;按 type 和 name 创建对象,并检查 sequence library 注册、p_sequencer 使用意图是否保留。 - **影响类型**:编译断点 - **一句话结论**:旧 sequence 注册和 package 宏需要改写为对象/组件注册、sequence library 接口或显式 package。 - **适用条件**:使用 uvm_deprecated_defines.svh 内旧宏的代码需修改;开启 deprecated 不能恢复被整文件删除的宏。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_deprecated_defines.svh:33`/`:73`/`:89`/`:125`/`:138`/`:149`/`:228`/`:246`;默认由 `src/vcs-uvm-1.2/uvm_macros.svh:109` 编入 - **2.0 位置**:2.0 全树无对应定义(`uvm_macros.svh` 中该 include 已移除) - **差异说明**:1.2 中已标注 deprecated 但仍默认可用的 sequence/sequencer 注册与打包宏,在 2.0 中彻底删除,`UVM_ENABLE_DEPRECATED_API` 也不恢复(deprecated/macros/ 仅含 object/sequence 两个 defines)。`uvm_add_to_seq_lib` 保留(1.2 `src/vcs-uvm-1.2/macros/uvm_sequence_defines.svh:356` → 2.0 `src/vcs-uvm-ieee-2020-2.0/macros/uvm_sequence_defines.svh:211`)。 - **迁移动作**:`uvm_sequence_utils(TYPE,SEQR)` 改为 `` `uvm_object_utils(TYPE)``;原宏还声明了 typed p_sequencer,需要该成员时保留 `` `uvm_declare_p_sequencer(SEQR)``。只有确需使用具体 `uvm_sequence_library` 时才加 `` `uvm_add_to_seq_lib(TYPE, LIBTYPE)``,LIBTYPE 是 library 类型,不能直接填旧 SEQR。`uvm_sequencer_utils(TYPE)` 改 `` `uvm_component_utils(TYPE)``;package 宏改为匹配的 `package` / `endpackage`。 - **兼容说明**:deprecated 开关不恢复已删除的注册/package 宏;按原 typed p_sequencer 和候选库需求分别改写。 ##### 修改前后 在业务 sequence 类中: ```systemverilog // UVM 1.2 `uvm_sequence_utils(traffic_seq, bus_sequencer) ``` 如果类内仍访问 `p_sequencer`,目标写法需要保留它的声明: ```systemverilog `uvm_object_utils(traffic_seq) `uvm_declare_p_sequencer(bus_sequencer) ``` 没有使用 `p_sequencer` 时只保留第一行。旧 `uvm_sequencer_utils(bus_sequencer)` 则改为 `uvm_component_utils(bus_sequencer)`。启用 deprecated 开关不能恢复这些已删除的注册宏。 #### `type_name` 由静态常量改为静态函数(`uvm_type_name_decl`) - **页面标题**:注册宏的 type_name 改为函数形式 - **内容类型**:用户接口与行为 - **验证方法**:两库分别编译普通读取及实际特殊上下文,核对返回名;只对受影响用法改写,不能把旧常量无条件调用。 comparator/pair 还应对照实际类型字符串,确认名称匹配结果。 - **适用条件**:把 type_name 当可写变量、重复声明它,或跨库改成函数调用。 包括 comparator/pair 工具类的 type_name 变量上下文及类型名匹配。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:434`(`m_uvm_get_type_name_func`:`const static string type_name = "T";`);phase 侧 `src/vcs-uvm-1.2/macros/uvm_phase_defines.svh:46` ;补充:`src/vcs-uvm-1.2/comps/uvm_in_order_comparator.svh:82`、`src/vcs-uvm-1.2/comps/uvm_in_order_comparator.svh:217`、`src/vcs-uvm-1.2/comps/uvm_in_order_comparator.svh:249`、`src/vcs-uvm-1.2/comps/uvm_algorithmic_comparator.svh:72`、`src/vcs-uvm-1.2/comps/uvm_pair.svh:43`、`src/vcs-uvm-1.2/comps/uvm_pair.svh:121` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:530`(`uvm_type_name_decl`:`static function string type_name();`);phase 侧 `src/vcs-uvm-ieee-2020-2.0/macros/uvm_phase_defines.svh:48` ;补充:`src/vcs-uvm-ieee-2020-2.0/comps/uvm_in_order_comparator.svh:84`、`src/vcs-uvm-ieee-2020-2.0/comps/uvm_in_order_comparator.svh:213`、`src/vcs-uvm-ieee-2020-2.0/comps/uvm_in_order_comparator.svh:240`、`src/vcs-uvm-ieee-2020-2.0/comps/uvm_algorithmic_comparator.svh:80`、`src/vcs-uvm-ieee-2020-2.0/comps/uvm_pair.svh:43`、`src/vcs-uvm-ieee-2020-2.0/comps/uvm_pair.svh:116` - **差异说明**:utils/phase 宏生成的 type_name 由静态数据成员变为无参静态函数,registry 的 type_name 也同步改变。普通 `T::type_name`、`T::type_id::type_name` 读取在两版 VCS 中可用,因为 SV 允许省略无参函数调用括号。不能仅凭省略括号判断编译断点;重复声明同名成员或要求变量的上下文需另行核对。 comparator/pair 工具类同样改用 uvm_type_name_decl:uvm_in_order_comparator、uvm_algorithmic_comparator、uvm_class_pair、uvm_built_in_pair 的类型名字符串与 get_type_name() 返回值保持,两版均未因此新增 factory 注册。 - **迁移动作**:普通读取可保留;新目标代码可显式写 `T::type_name()`。重复声明或要求变量的用法单独核对,跨版本代码不能把旧常量机械改成函数调用。 需要可写字符串、ref 实参或缓存类型名时,先复制到自有 string 变量;不要仅因 type_name 的实现变化给 comparator/pair 补 factory 注册。registry 初始化另见 M01-006,抽象组件注册见 M10-003,predictor 的旧可写成员及 flush 见 M07-012。 - **兼容说明**:普通 type_name 读取可保留;兼容措施不恢复静态变量形态,要求可写或 ref 的位置须使用自有变量。 #### 废弃开关极性翻转:`UVM_NO_DEPRECATED`(opt-out)→ `UVM_ENABLE_DEPRECATED_API`(opt-in) - **内容类型**:用户接口与行为 - **验证方法**:分别在启用/关闭旧接口的目标构建编译代表宏;检查预处理分支符合原 opt-out/opt-in 意图。 - **适用条件**:构建脚本包含 UVM_NO_DEPRECATED 或准备启用新 deprecated 开关。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:deprecated 开关 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/uvm_macros.svh:77`(`UVM_NO_DEPRECATED` 段)及 `:109`(deprecated defines 默认编入) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/uvm_macros.svh:130-131`;`src/vcs-uvm-ieee-2020-2.0/deprecated/readme.important` 明确"默认不包含,需编译期定义 UVM_ENABLE_DEPRECATED_API" - **差异说明**:1.2 默认包含 deprecated API、定义 `UVM_NO_DEPRECATED` 才排除;2.0 默认排除、需 `+define+UVM_ENABLE_DEPRECATED_API` 才引入 deprecated sequence 宏。原构建脚本中的 `+define+UVM_NO_DEPRECATED` 在 2.0 下无任何效果。 - **迁移动作**:按原意检查构建开关。原先定义 UVM_NO_DEPRECATED 是排除旧接口,不能机械改成启用 UVM_ENABLE_DEPRECATED_API;仅当确实需要目标版保留的旧宏时开启新开关。 - **兼容说明**:本开关只开放目标库仍保留的 deprecated API;不恢复已删除的接口,也不控制 field FLAG。旧 UVM_NO_DEPRECATED 是禁用,新开关是启用,须保留原构建意图。 #### 版本宏改名与取值变化 - **页面标题**:版本宏与版本字符串的迁移 - **内容类型**:用户接口与行为 - **验证方法**:两库分别给分支输出可识别标记;精确版本和能力分支分开检查,避免静默走 else。 另外捕获两版 uvm_revision_string() 返回值,回放到实际日志解析脚本。 - **影响类型**:编译断点、静默/数据风险、日志/调试变化 - **一句话结论**:版本分支应保持原来的精确版本或能力判断意图;旧版本宏不能统一替换为 POST 宏。 - **适用条件**:构建或代码按 UVM_VERSION_1_2 等宏选择实现、签名或能力时,分别检查两库实际进入的分支。 解析 uvm_revision_string() 返回值的日志脚本也需核对。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API + 新增 API - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_version_defines.svh:49`(`UVM_MAJOR_REV 1`)、`:57`(`UVM_MINOR_REV 2`)、`:92-94`(`UVM_VERSION_STRING` 文本宏)、`:118`/`:125`/`:131`/`:134`(`UVM_MAJOR_REV_1`/`UVM_MINOR_REV_2`/`UVM_VERSION_1_2`/`UVM_MAJOR_VERSION_1_2`) ;补充:`src/vcs-uvm-1.2/base/uvm_version.svh:33` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_version_defines.svh:30`(`UVM_VERSION 2020`)、`:40-44`(`UVM_VERSION_POST_*`)、`:51`/`:52`(`UVM_MAJOR_REV 2020`、`UVM_MINOR_REV 2.0`)、`:54`(`UVM_VERSION_STRING uvm_pkg::UVM_VERSION_STRING`)、`:58`(`UVM_POST_VERSION_1_2`) ;补充:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_version_defines.svh:57`、`src/vcs-uvm-ieee-2020-2.0/base/uvm_version.svh:30`、`src/vcs-uvm-ieee-2020-2.0/base/uvm_version.svh:32` - **源码对照**:| 结论 | VCS 1.2 依据 | VCS 2.0 依据 | |---|---|---| | 精确版本条件与 POST 条件含义不同 | 精确版本宏明确表示当前版本为 1.2:`src/vcs-uvm-1.2/macros/uvm_version_defines.svh:127-134`。 | 目标同时定义两个历史 POST 宏:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_version_defines.svh:56-58`。替换条件前要保留原分支意图;宏的完整定义集合见上下文和源码文件。 | | UVM_VERSION_STRING 的展开从字面量变为包常量 | 旧宏用预处理器拼接版本字符串;这里保留完整 ifdef/else/endif:`src/vcs-uvm-1.2/macros/uvm_version_defines.svh:91-95`。 | 目标宏展开为限定包常量,旁边也可看到 major/minor token:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_version_defines.svh:51-54`。使用处须允许该包常量表达式。 | - **差异说明**:UVM_VERSION_1_2 等精确版本宏删除;UVM_MINOR_REV 的 token 从整数 2 变为实数 2.0。UVM_VERSION_STRING 从字符串字面量展开改为 `uvm_pkg::UVM_VERSION_STRING`,要求该包已编译且上下文接受包常量表达式;限定名本身不要求 import。 uvm_revision_string() 的版本文本由 UVM-1.2.Synopsys 改为 Accellera:1800.2-2020:UVM:2.0,影响依赖旧前缀和分隔符的日志解析;uvm_mgc_copyright 等旧 copyright 参数也被删除。 - **迁移动作**:逐个确认分支意图。需要“恰为 1.2”与“支持 1.2 以后能力”时条件不同,不能一律把 UVM_VERSION_1_2 替换为 UVM_POST_VERSION_1_2。跨库签名示例见 semantic_probe 的目标宏分支;SV 预处理器没有 C 风格数值 `#if`,可用构建定义区分受支持版本。 日志解析脚本用两版实际版本文本校验前缀和分隔规则;删除对旧 copyright 参数的直接引用,版权文本以所用库随附声明为准,不把它当版本判断接口。 - **兼容说明**:旧精确版本宏与字符串展开方式不恢复;构建分支及日志解析须保持原版本判断意图。 #### `uvm_print_*` 打印机宏族签名重定义 - **内容类型**:用户接口与行为 - **阅读主题**:02 - **关联主条目**:M02-004 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M02-004。 #### pack/unpack/record 宏拆分独立文件并追加 policy 默认实参 - **页面标题**:pack、unpack、record 宏的文件拆分 - **内容类型**:内部实现 - **阅读主题**:02 - **验证方法**:改用 uvm_macros.svh 后编译全部使用方;跨边界位流仍与 1.2 golden 逐位对照,文件包含成功不能证明数据兼容。 - **适用条件**:直接 include uvm_object_defines.svh 并依赖其中的 pack/unpack/record 子宏。通过 uvm_macros.svh 使用默认 policy 参数的原调用保持源码兼容;公开 pack 位流变化由 M02-001 承接。 - **影响类型**:编译断点、静默/数据风险 - **处理级别**:命中后修改 - **兼容机制**:compat 包 - **类型**:内部重构(文件拆分)+ 签名变更(向后兼容) - **1.2 位置**:`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:3481`(`uvm_record_attribute`)、`:3502`(`uvm_record_int`)、`:3699`(`uvm_pack_int`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_packer_defines.svh:136`(`uvm_pack_int(VAR,PACKER=packer)`)、`uvm_recorder_defines.svh:77`/`:100`、`uvm_comparer_defines.svh:52`、`uvm_copier_defines.svh:36`、`uvm_resource_defines.svh:41`;统一由 `src/vcs-uvm-ieee-2020-2.0/uvm_macros.svh:114-119` 编入 - **差异说明**:宏从 `uvm_object_defines.svh` 拆到 5 个新 policy defines 文件(对用户透明,include 由 uvm_macros.svh 完成);签名新增默认实参(`PACKER=packer`、`RECORDER=recorder`、`COMPARER=comparer`、`COPIER=copier`),在 `do_pack(uvm_packer packer)` 等标准上下文中的既有调用保持源码兼容。 - **迁移动作**:直接 include 子宏文件的代码改用 uvm_macros.svh;跨版本打包须遵循 M02-001 的逐位验收,不能仅替换 compat packer。 - **兼容说明**:显式使用兼容包提供的类或宏后生效。部分(仅 packer 行为有 `uvm_compat_packer` 替代类;宏本身无需覆盖)。 - **标准依据**:IEEE 1800.2-2020 §B.2.4(pack/unpack 宏) #### message 宏实现改为 report object 检查,新增 `` `uvm_report_begin ``/`` `uvm_report_end `` - **内容类型**:用户接口与行为 - **阅读主题**:04 - **关联主条目**:M04-001 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M04-001。 #### 新增 abstract 注册宏族(virtual class 可注册 factory) - **内容类型**:新增功能 - **阅读主题**:01 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无(1.2 对 abstract 类只能使用 `uvm_field_utils_begin`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:322`(`uvm_object_abstract_utils`)、`:427`(`uvm_component_abstract_utils`,含 param/begin/end 变体) - **差异说明**:新增 object/component abstract utils 及 param/begin/end 变体,通过 abstract registry 注册。registry 提供 create 入口,允许 factory override 到具体类型;无具体 override 时返回 null 并报告抽象创建错误,不是完全没有 create API。 - **迁移动作**:无(可选用于整理 virtual 基类的 factory 注册)。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §B.2.1.2、§B.2.1.3 #### 新增 `` `uvm_declare_type_alias `` - **内容类型**:新增功能 - **阅读主题**:01 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:495` - **差异说明**:新增宏,为已注册类型声明 factory 类型别名(`type_id::set_type_alias`),支持多名称 override。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 新增 field 宏:real 数组/队列/静态数组与 aa_object_key/aa_string_key - **内容类型**:新增功能 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:无需启用 - **类型**:新增 API - **1.2 位置**:无(1.2 仅标量 `uvm_field_real` 与 `uvm_field_aa_int_key`,`src/vcs-uvm-1.2/macros/uvm_object_defines.svh:2565`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:2435`(`uvm_field_sarray_real`)、`:2557`/`:2560`(`uvm_field_array_real`/`uvm_field_queue_real`)、`:2057`/`:2118`(`uvm_field_aa_object_key`/`uvm_field_aa_string_key`) - **差异说明**:补齐 real 类型容器。aa_object_key/aa_string_key 中 object/string 指数组的值类型,KEY 是显式的索引类型,不能将宏名解释为“对象/字符串作键”。相关实现用 `$bits(KEY)` 与整数索引打包,须按支持的键类型使用;既有宏签名统一加默认 FLAG。 - **迁移动作**:无(1.2 中手写 do\_\* 处理的 real 容器字段可改用新宏)。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 - **标准依据**:IEEE 1800.2-2020 §B.2.2 #### 新增 `UVM_FIELD_FLAG_SIZE` 与 `UVM_COMPONENT_CONFIG_MODE_DEFAULT` - **页面标题**:字段自动配置的查询模式与操作位宽 - **内容类型**:用户接口与行为 - **验证方法**:使用实际字段注册和自定义操作,检查选中资源与最终赋值;CONFIG_STRICT 不会自动枚举任意未注册成员。 - **适用条件**:定制 field 操作位宽或修改默认自动配置查询模式。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:新增 API(编译期旋钮) - **1.2 位置**:无 - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh:146`(`UVM_FIELD_FLAG_SIZE` 默认 = `UVM_FIELD_FLAG_RESERVED_BITS`);`src/vcs-uvm-ieee-2020-2.0/macros/uvm_global_defines.svh:41`(`UVM_COMPONENT_CONFIG_MODE_DEFAULT` 默认 `CONFIG_CHECK_NAMES`,文件注释注明这是对 1800.2 的 deviation,可 `+define+...=CONFIG_STRICT` 覆盖) - **差异说明**:前者允许扩展 field flag 位宽;后者决定自动配置的资源查询策略。CONFIG_STRICT 扩大搜索范围,不是未注册成员的自动发现机制,也不是拼写检查开关,见 M01-007。 - **迁移动作**:默认注册字段的自动配置可保留。确需扩大资源查询范围时,在相关库编译前定义 +define+UVM_COMPONENT_CONFIG_MODE_DEFAULT=CONFIG_STRICT 并重建,检查实际选中值;该模式不会发现任意未注册成员。自定义操作位使用 UVM_FIELD_FLAG_SIZE 管理位宽并核对保留位,不能把扩大 FLAG 位宽当作恢复旧 FLAG 语义。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 - **标准依据**:IEEE 1800.2-2020 §B.6.1 #### `deprecated/uvm_resource_converter.svh` 与 `UVM_USE_RESOURCE_CONVERTER` 删除 - **内容类型**:用户接口与行为 - **阅读主题**:05 - **关联主条目**:M05-008 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M05-008。 #### 无用户可见变化的宏文件 - **内容类型**:内部实现 - **影响类型**:无行为变化 - **处理级别**:无需改动 - **兼容机制**:无需启用 - **类型**:内部重构(仅注释/排版/NODOCS 标记) - **说明**:`uvm_callback_defines.svh`、`uvm_tlm_defines.svh`、`uvm_reg_defines.svh` 在 VCS 1.2→VCS 2.0 间宏集合与语义无用户可见差异(tlm 的 Verdi 插桩两侧一致,见下节);`uvm_undefineall.svh` 仅新增 `` `undef UVM_XCELIUM `` 等清理项;`uvm_objection_defines`/`uvm_policy_defines`/`uvm_field_op_defines` 在两个版本中均不作为独立文件存在,本模块无对应条目。 - **迁移动作**:无。 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 ### Synopsys 定制点(本模块) 以下对照用于区分 VCS 定制与 Accellera 参照;需要迁移的事项以关联条目的条件、改法和验证为准。 | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | macros/snps_macros.svp | 两版 VCS 文件相同,经 uvm_macros.svh 引入;Accellera 无 | 存量厂商扩展,无需因文件存在单独改写。 | | UVM_VCS_DTL / UVM_VCS_* 与 Verdi 开关 | 目标宏入口含动态加载声明族、录制开关推导及 UVM_NO_VERDI_DPI 逻辑 | 属 VCS/Verdi 集成;选库与编译配置按目标安装核对。 | | uvm_tlm_defines Verdi 插桩 | 目标 UVM_SEQ_ITEM_PULL_IMP 根据 UVM_VERDI_NO_PORT_RECORDING 选择插桩版本 | 端口事务追踪见 TLM 模块定制说明;不把调试可见性等同于功能全覆盖验证。 | | ZEMI4UVM / UVM_VCS_FGP | 旧 ZeBu 属性与 FGP 宏体系不再沿用 | FGP 见 M10-007;ZeBu 流程需单独验证。 | | 旧对象 create 宏 | VCS 1.2 默认 new()+set_name() 与 Accellera 不同,registry 默认仍 new(name) | 编译断点必须结合旧构建开关判断,见 M09-003。 | --- ## 第 10 章 预定义组件、compat 兼容层与工具集成目录 ### 概览 常规组件连接主要涉及新增 factory 注册和 `DRVCONNECT` 告警。启用 regex 缓存或使用 FGP、native dumping 的环境需单独核对;regex/glob 混用的缓存风险已复现。compat 包配置见[版本与兼容](site/concepts.md#compat-package),文件入口见本页参考。 ### 建议阅读顺序 先确认环境是否使用 regex 缓存、FGP 或 native dumping 等特定流程;普通组件用法按新增报告和注册行为核对。 M10-006 → M10-001 → M10-007 → M10-008 comparator/pair 工具类的 type_name 读取与变量上下文统一见 M09-006;抽象组件新增 factory 注册仍见 M10-003。 ### 差异条目 #### uvm_driver 新增 seq_item_port 未连接告警(DRVCONNECT) - **内容类型**:用户接口与行为 - **验证方法**:对应连接的 driver 检查 is_connected 和实际事务;仅对设计上不需要该端口的 driver 定向抑制,不能全局隐藏漏接。 - **适用条件**:driver 的 seq_item_port 未连接,或依赖无 DRVCONNECT 告警。 - **影响类型**:日志/调试变化 - **处理级别**:按条件核对 - **兼容机制**:无兼容恢复 - **类型**:行为变化 - **1.2 位置**:`src/vcs-uvm-1.2/comps/uvm_driver.svh:44`(类定义,无 end_of_elaboration_phase) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/comps/uvm_driver.svh:89-92` - **差异说明**:2.0 在 `uvm_driver` 中新增 `end_of_elaboration_phase`,若 `seq_item_port.size() < 1`(未连接 sequencer)则发 `` `uvm_warning("DRVCONNECT", ...)``。1.2 无任何连接检查。继承自 uvm_driver 但未使用 seq_item_port 的用户 driver(如纯 push 模式、虚 driver 壳)会新增告警;对"warning 即失败"的回归环境是直接挂点。 - **迁移动作**:正常连接的 driver 无需改动;确不需连接的,在构造函数加 `set_report_severity_id_action(UVM_WARNING, "DRVCONNECT", UVM_NO_ACTION);`(VCS 2.0 内置 README "Migrating from 1.2" 第 2 条官方建议)。 - **兼容说明**:兼容措施不撤销新增连接检查;report action 只调整诊断显示,不会补上 driver 连接。 - **标准依据**:IEEE 1800.2-2020 §13.7(uvm_driver);告警本身是实现新增检查,源码标注 `// @uvm-ieee 1800.2-2020 auto 13.7.1` #### uvm_driver / uvm_push_driver 新增 factory 注册 - **内容类型**:内部实现 - **影响类型**:其他行为变化 - **处理级别**:无需改动 - **兼容机制**:无需启用 - **类型**:行为变化(factory 可见性新增) - **1.2 位置**:`src/vcs-uvm-1.2/comps/uvm_driver.svh:81`、`src/vcs-uvm-1.2/comps/uvm_push_driver.svh:89`(仅 `const static string type_name`,无注册) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/comps/uvm_driver.svh:51`(`` `uvm_component_param_utils(uvm_driver#(REQ,RSP))``)、`src/vcs-uvm-ieee-2020-2.0/comps/uvm_push_driver.svh:43` - **差异说明**:两个 driver 基类在 2.0 通过参数化注册宏使用 uvm_component_registry,并补 type_name 声明,可按类型查询和覆盖。`m_uvm_component_registry_param` 是宏名,并非新的 registry 类名;参数化注册也不保证按字符串名称查找能力。 - **迁移动作**:无 - **兼容说明**:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。 #### 五个抽象组件基类补 abstract factory 注册;type_name 由常量变为静态函数 - **页面标题**:抽象组件的工厂注册与 type_name 使用 - **内容类型**:用户接口与行为 - **验证方法**:编译相关声明;factory 创建抽象类型前配置具体 override,检查实例类型与所需虚方法行为。 - **适用条件**:抽象组件使用 factory,或把 type_name 用在特殊变量上下文。 - **影响类型**:其他行为变化 - **处理级别**:按条件核对 - **兼容机制**:无需启用 - **类型**:签名变更(成员形态)+ 行为变化(factory 注册新增) - **1.2 位置**:`src/vcs-uvm-1.2/comps/uvm_agent.svh:117`、`uvm_env.svh:45`、`uvm_test.svh:74`、`uvm_monitor.svh:46`、`uvm_scoreboard.svh:48`(均为 `const static string type_name` + `get_type_name()` 手写覆盖) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/comps/uvm_agent.svh:45`、`uvm_env.svh:36`、`uvm_test.svh:65`、`uvm_monitor.svh:37`、`uvm_scoreboard.svh:39`(均改为 `` `uvm_component_abstract_utils(<类名>)``) - **差异说明**:五个已是抽象类的基类在 2.0 新增 abstract factory 注册;`type_name` 改为无参静态函数,返回字符串保持。SV 允许省略无参函数的调用括号,`string s = uvm_agent::type_name;` 两版 VCS 实测均可用。变量引用/重定义等特殊上下文应单独检查。is_active 改用 `uvm_resource_enum_read`,枚举、字符串与整数回退须按实际资源类型核对。 - **迁移动作**:普通 get_type_name() 或无参 type_name 读取可保留。若需要可写字符串或 ref 实参,先复制类型名到自己的 string 变量,停止将目标 type_name 当变量写入或重复声明;同源例子见 M09-006。通过抽象基类 factory 创建时,先设置具体类 override,再检查实际对象类型。 - **兼容说明**:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。 #### comparator / pair 工具类 type_name 常量改静态函数 - **内容类型**:用户接口与行为 - **阅读主题**:09 - **关联主条目**:M09-006 - **类型**:合并入口 本条的适用条件、修改方法、源码依据与验证统一见 M09-006。 #### uvm_random_stimulus 降级为 @uvm-compat 兼容 API - **内容类型**:内部实现 - **验证方法**:若迁为 sequence,检查原随机约束、事务数量和消费路径;未迁移时保留现有功能回归,不因软废弃强制删除。 - **适用条件**:环境仍使用 uvm_random_stimulus。 - **影响类型**:新增/接口调整 - **处理级别**:可选采用 - **兼容机制**:主库保留 - **类型**:废弃(deprecated,软废弃——类仍编译可用) - **1.2 位置**:`src/vcs-uvm-1.2/comps/uvm_random_stimulus.svh:45` - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/comps/uvm_random_stimulus.svh:46-47`(类前新增 `//@uvm_compat` 标注,成员方法同样在 :97、:123 标注) - **差异说明**:2.0 将该类标为 @uvm-compat,按发布说明属于兼容旧版接口。去除注释后类体 token 一致;它调用的新库随机化、报告等机制仍可能改变外围行为,不能从类体不变推导整个仿真逐字等价。 - **迁移动作**:已有 uvm_random_stimulus 调用可继续使用并验证实际激励;需要改用 sequence 时再迁移约束与消费路径,不因兼容标注强制替换。 - **兼容说明**:主库仍提供 uvm_random_stimulus,已有调用无需启用 deprecated 或 compat 包;可继续验证实际产生的激励。 #### DPI 正则接口重构(uvm_dump_re_cache 删除、uvm_re_match 增参) - **页面标题**:正则接口与缓存:删除的调试 API 和匹配风险 - **内容类型**:用户接口与行为 - **验证方法**:按两种调用顺序测试同一表达式的 regex 与 glob,结果必须与无缓存对照一致;默认保持缓存关闭。 - **影响类型**:编译断点、静默/数据风险 - **一句话结论**:删除旧调试接口;regex/glob 混用时保持缓存默认关闭,并验证调用顺序不改变匹配结果。 - **适用条件**:直接调用 uvm_dump_re_cache 或开启正则缓存的环境需核对;普通缓存关闭的路径按对应用例比较。 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **验证结论**:目标库启用缓存后的 regex/glob 混用问题已复现;默认关闭缓存的对照已验证。 - **类型**:删除 API + 签名变更(向后兼容) - **1.2 位置**:`src/vcs-uvm-1.2/dpi/uvm_regex.svh:23-25`(`uvm_re_match`/`uvm_dump_re_cache`/`uvm_glob_to_re` 三个 DPI import) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/dpi/uvm_regex.svh:25-31`(新 DPI 组 `uvm_re_comp/exec/compexec/free/buffer/deglobbed`)、`:67`(`uvm_re_match(string,string,bit deglob=0)` 改为 SV 函数)、`:141`(`uvm_glob_to_re` 保留为 SV 函数) - **差异说明**:① `uvm_re_match` 从 DPI import 变为 SV 函数并新增可选参数 `deglob=0`,原两参调用点不受影响。② `uvm_dump_re_cache()` **删除**(2.0 全库 grep 无此符号)。③ 新增 `uvm_regex_cache` 缓存机制,默认关闭,`+define+UVM_ENABLE_RE_MATCH_CACHE` 开启(大型层次环境下 resource_db 查找提速;save/restore 场景勿开)。④ C 侧 `uvm_hdl_inca.c` 删除、新增 `uvm_hdl_xcelium.c`(Cadence 仿真器文件改名),`uvm_dpi.h` 汇总 regex/hdl 原型。`uvm_hdl_*` 后门函数签名两版一致(仅 `` `uvm_context_prop`` 宏展开写法变化)。 - **迁移动作**:删除对 `uvm_dump_re_cache()` 的调用(若有)。保留缓存默认关闭:目标缓存只以表达式字符串为键,未区分 deglob(`src/vcs-uvm-ieee-2020-2.0/dpi/uvm_regex.svh:46,59`)。utility_probe 先用 uvm_re_match("a.*","abc") 再用 uvm_is_match,同样代码在两库默认模式第二次均不匹配,目标开启缓存后错误匹配。混合 regex/glob 的查找结果可能依赖调用顺序,不能将缓存开关作为无条件性能优化(S21)。 - **关联变化**:组件名检查 visitor 也改用 uvm_is_match,并为自定义约束补 /.../ 定界;UVM_REGEX_NO_DPI 下跳过检查并首用提示 NO_VISIT_CHECK(`src/vcs-uvm-1.2/base/uvm_traversal.svh:272`;`src/vcs-uvm-ieee-2020-2.0/base/uvm_traversal.svh:267,274`)。该检查的 DPI 前提和告警不能视为零差异。 - **兼容说明**:旧缓存调试接口不恢复;保持正则缓存默认关闭,兼容措施不修复 regex/glob 共用缓存键。 #### Synopsys FGP 支持文件 vcs/vcs_uvm_alt.sv 删除 - **页面标题**:旧 FGP 类与集成文件已删除 - **内容类型**:用户接口与行为 - **验证方法**:整理最小类引用、完整工具版本和并行编译参数,先确认目标支持路径;替代方案确定后检查编译、功能结果和实际并行配置。本项目尚无该路径的实测替代。 - **适用条件**:显式引用 uvm_fgp_* 类或依赖旧 FGP 集成。 - **影响类型**:编译断点 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除 API(Synopsys 专属) - **1.2 位置**:`src/vcs-uvm-1.2/vcs/vcs_uvm_alt.sv:3-165`(`uvm_fgp_thread_object`、`uvm_fgpinit_phase` 等细粒度并行支持类),由 `src/vcs-uvm-1.2/uvm_pkg.sv:43` 在 `` `ifdef VCS`` 下 include - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/uvm_pkg.sv`(全文无 vcs/ include,文件已删除) - **差异说明**:1.2 中 uvm_pkg 编译时自动带入 VCS FGP(fine-grained parallelism)支持类;2.0 移除。显式使用 `uvm_fgp_*` 类或依赖旧集成文件的环境需要核对;仅凭这些文件删除不能推断全部 VCS 并行功能被移除。 - **迁移动作**:若环境引用 `uvm_fgp_thread_object`/`uvm_fgpinit_phase`,需联系 Synopsys 确认替代方案;否则无 - **兼容说明**:旧 FGP 文件和类不恢复;目标替代流程仍待产品确认,不能据此推断全部并行能力被移除。 #### Verdi native_dumping 录制变体删除 - **页面标题**:Verdi native_dumping 录制文件已删除 - **内容类型**:用户接口与行为 - **验证方法**:确认目标安装中的标准 recorder 流程与所需 DPI 配置,记录一组父子事务并在实际 Verdi 工作流检查;仅编译通过不代表录制迁移完成。 - **适用条件**:脚本使用 Verdi native_dumping 的 recorder/factory 文件。 - **影响类型**:编译断点、日志/调试变化 - **处理级别**:命中后修改 - **兼容机制**:无兼容恢复 - **类型**:删除(Synopsys 专属调试流程) - **1.2 位置**:`src/vcs-uvm-1.2/verdi/native_dumping/`(`uvm_custom_install_verdi_recorder_native_dumping.sv`、`uvm_verdi_factory_native_dumping.svh`、`uvm_verdi_message_catcher_native_dumping.svh`) - **2.0 位置**:`src/vcs-uvm-ieee-2020-2.0/verdi/` 仍存在;其下旧 `native_dumping/` 子目录已删除,标准 recorder 集成文件保留。 - **差异说明**:1.2 提供基于 VCS native dumping 的 Verdi 事务录制变体(不用 PLI/DPI);2.0 只保留标准 DPI 录制路径(`verdi/dpi/uvm_verdi_dpi.*`)。 - **迁移动作**:引用旧 native_dumping 文件或安装其 recorder 的脚本,迁移到目标安装提供的标准 `uvm_custom_install_verdi_recorder.sv` 流程,并核对 DPI 与启动配置。在实际 Verdi 中确认所需事务、字段及父子关系完整后,再移除旧脚本。未引用这些旧文件的流程无需因此替换文件;现有实测未覆盖全部 Verdi 工作流。 - **兼容说明**:旧 native_dumping 文件不恢复;标准 recorder 路径保留,DPI 配置与实际事务展示仍须验证。 ### compat/ 兼容层四件套逐条解读 编译、导入和退出方式统一见[版本与兼容](site/concepts.md#compat-package)。各类的恢复范围与限制只在关联条目维护。 | 文件 | 提供的入口 | 用法与边界 | |---|---|---| | uvm_compat_pkg.sv | 独立包入口 | [显式编译配置](site/concepts.md#configure-compat-package) | | uvm_compat_macros.svh | uvm_unpack_string_with_size | 字符串解包见 M02-010 | | uvm_compat_packer.svh | uvm_compat_packer | 位流及旧接口见 M02-001、M02-002 | | uvm_compat_proxy_sequence.svh | uvm_compat_proxy_sequence | 具体代理类见 M06-004 | ### DEVIATIONS.md 全文整理(Accellera 2.0 自带) 三项实现限制及所属模块统一见[标准与实现限制](site/references.md#implementation-limits)。这份原版说明用于解释实现边界,不能代替两侧 VCS 迁移结论。 ### 工具集成目录速览(dap / sled / directc / dpi / vcs / verdi) | 目录 | 实现背景与关联入口 | |---|---| | dap/ | 锁定访问策略;目标新增 is_locked 查询并调整打印接口,既有锁定约束保持;新增查询与输出格式不应概括为零差异。 | | sled/ | Synopsys $msglog 对接包、catcher 与 server,两侧文件一致。文件一致不等于整个集成流程已对跑。 | | directc/ | 随机种子钩子 vc_uvmCreateRandomSeed;svh 两侧一致,seed 头仅空白差异,受 UVM_DIRECTC_OPTS 控制。 | | dpi/ | 正则重构见 M10-006;HDL 后门公共入口保留,其他厂商源文件改名见文件差异附录。 | | vcs/ | 原生事务 recorder/database;FGP 删除见 M10-007,公开派生方法的句柄签名见 M02-012。 | | verdi/ | native_dumping 删除见 M10-008;标准 recorder 安装入口保留,但 DPI 与事务展示仍需实际集成验证。 | ### Synopsys 定制点(本模块) | 定制项 | 两版状态 | 工程影响与入口 | |---|---|---| | comps/ | 各版本 VCS 与对应 Accellera 文件一致 | 版本间组件 API 变化仍见上方条目。 | | compat 包属性 | VCS 2.0 为静态 package;非 VCS 分支使用 package automatic,Accellera 为普通 package | 源码 `src/vcs-uvm-ieee-2020-2.0/compat/uvm_compat_pkg.sv:28-32`;其余三文件仅版权头差异。配置见上方包参考。 | | analysis_port Verdi 插桩 | 两侧延续 | 端口录制统一见 TLM 模块;UVM_VERDI_NO_PORT_RECORDING 控制是否启用。 | | DPI 导入与 real 后门 | 两侧含 VCSMX_FAST_UVM 的 context 选择、UVM_HDL_REAL_FUNC 门控;VCS C 后端有 vpi_chk_error 诊断 | 属 VCS 集成路径,启用时核对目标 DPI 构建与 HDL 对象类型。 | | vcs/verdi/sled/directc/include/uvm_ams.sv | Synopsys 专属目录或文件 | 仅“Accellera 不存在”不构成 1.2→2.0 变化;版本差异见对应条目和文件附录。 | --- # 附录 ## 附录 A:全量 file-level diff 统计 下列数字采用四组成对 `diff -rq` 的输出口径,原始清单见 `docs/appendix/*.raw.txt`。`Only in` 项可能代表整个目录,不能与逐文件计数混用。 逐文件统计由 `uv run tools/review_diff.py` 生成,递归统计普通文件并记录哈希,不跟随 `src/` 软链接;统计结果与口径见 `docs/review/file-diff.json` 和 `docs/review/omissions.md`。 ### A.1 主线:VCS 内置 1.2 → VCS 内置 2.0(迁移实际路径) - 同名但内容不同:**169** 个文件;仅 1.2 存在:12 项;仅 2.0 存在:27 项。Only in 项包含整个目录,不能与逐文件计数混用;被删 deprecated/VCS 扩展仍可能影响现有环境功能。 - 分模块差异文件数:base 47 | reg 27 | comps 14 | dpi 12 | tlm1 12 | macros 11 | seq 10 | tlm2 9 | dap 5 | 顶层 3 | 其他(deprecated/directc/include/vcs/verdi)19 - 1.2 独有(2.0 中消失)的关键文件:`deprecated/uvm_resource_converter.svh`、`macros/uvm_deprecated_defines.svh`、`seq/uvm_sequence_builtin.svh`、`reg/uvm_reg_array*.svh`(VCS 私有)、`dpi/uvm_hdl_inca.c`(改名 xcelium)、`vcs/vcs_uvm_alt.sv`(FGP) - 2.0 新增的关键文件:`base/uvm_policy.svh`、`base/uvm_copier.svh`、`base/uvm_field_op.svh`、`base/uvm_cache.svh`、`base/uvm_lru_cache.svh`、`base/uvm_phase_hopper.svh`、`base/uvm_cmdline_report.svh`、`base/uvm_config_db_implementation.svh` 等 ### A.2 参照:Accellera 1.2 → Accellera 2.0 - 同名不同:150;仅 1.2:5;仅 2.0:25。与 A.1 高度重合,说明主线差异主要来自标准演进本身。 ### A.3 Synopsys 定制:VCS 2.0 vs Accellera 2.0 - 同名不同:36;VCS 独有 12 项(`compat/`、`directc/`、`include/`、`sled/`、`vcs/`、`verdi/` 目录与 `macros/snps_macros.svp`、`reg/snps_uvm_reg_bank.svh`、`uvm_ams.sv` 等),Accellera 独有:0 - 功能性迁移事项以各章正式条目为准;"Synopsys 定制点"小节提供两版状态与关联入口;最多的是 Verdi 事务录制集成与 `uvm_vcs_*`/`uvm_sled_*` 附加库 ### A.4 基线提醒:VCS 1.2 vs Accellera 1.2 - 同名不同:61;VCS 独有 15 项。**团队现行基线本就是 Synopsys 定制版 1.2**——若历史代码无意中依赖了 VCS 1.2 私有扩展(`uvm_reg_array*`/`uvm_reg_address_config`/`disable_apply_cfg_settings`/`UVM_ARRAY_NUM_LIMIT` 等),这些扩展在 2.0 中全部消失,已列入对应章节条目。 ## 附录 B:编译开关与 plusarg 变化速查 | 1.2 时代 | 2.0 时代 | 说明 | |---|---|---| | `UVM_NO_DEPRECATED`(opt-out) | `UVM_ENABLE_DEPRECATED_API`(opt-in) | 废弃宏开关极性翻转;一阶段建议开启后者(第 6、9 章) | | — | `UVM_LEGACY_FIELD_MACRO_SEMANTICS` | 恢复 field 宏负向 flag 的 1.2 语义(第 9 章 S3) | | — | `UVM_COMPONENT_CONFIG_MODE_DEFAULT=CONFIG_STRICT` | 扩大资源搜索范围,仍依赖字段操作赋值,不自动发现任意 SV 成员(M01-007) | | `+UVM_DISABLE_APPLY_CFG_SETTINGS` | 删除 | VCS 1.2 私有,2.0 改 override `use_automatic_config()`(第 1 章) | | `+define+UVM_SPARSE_ARRAY` | **悬空引用,打开即编译失败** | `uvm_reg_array*.svh` 已删(第 7 章) | | `+define+UVM_REG_ENABLE_ADDRESS_EXCLUSION` | 删除 | 改用 `NO_REG_TESTS` resource 机制(第 7 章) | | `+UVM_ARRAY_NUM_LIMIT` / `+UVM_VERDI_BEGIN_TR_REALTIME` | 删除 | 数组上限见 M02-016;取时与精度边界见 M02-017 | | `+UVM_STACKTRACE` | **解析保留但功能失效(死代码)** | VCS 2.0 已删 `$stack` 调用点(第 4 章) | | `UVM_USE_REALTIME_IN_MSGS` | 无效(恒 `$realtime`) | 日志时间戳行为变化(第 4 章) | | — | `+UVM_DUMP_REPORT_ARGS`、`+uvm_set_config_bitstream` | 2.0 新增 plusarg(第 1 章) | | — | `UVM_ENABLE_RE_MATCH_CACHE` | 默认关闭;regex/glob共用缓存键可导致错配,保留关闭(M10-006/S21) | | — | `UVM_DISABLE_RESOURCE_POOL_SHARED_QUEUE` | 退回 1.2 资源池队列实现(调试用,第 5 章) | | `UVM_VERSION_1_2` / `UVM_MAJOR_REV_1` 等 | 删除,改 `UVM_VERSION`/`UVM_POST_VERSION_1_2` | **ifdef 旧宏不报错、静默走 else**(S4,第 4、9 章) | | `UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR` 等旧构造开关 | 不再提供旧 registry 分支 | C6 须结合原构建条件核对,不能概括为所有调用恒 new(name)(M09-003) | ## 附录 C:方法与可复现性 1. 源码对比:`diff -rq` 四组成对(A.1–A.4),逐模块签名级 diff + 全文规范化 diff。 2. 标准佐证:IEEE 1800.2-2020 原文(WeKnora `IEEE` 知识库,`kb id 880e637d-21f3-4591-9707-d4ec69e93865`)chunk 检索,章节号以 `§` 标注;2.0 源码自带 `@uvm-ieee 1800.2-2020` 标注亦作为依据。 3. 仿真实测:L1、L2 及扩展风险探针的结果与适用边界见 `docs/review/evidence.md`。 4. 模块正文在 `docs/modules/`,review 台账在 `docs/review/`;合并文档由 `uv run tools/build_migration_doc.py` 生成。可复现 TB 在 `tests/uvm_review/`,运行器为 `tools/run_uvm_review.py`,完整构建日志留在 `.scratch/review/`;旧 L1 日志在 `.scratch/L1/`。 ## 参考资料 - IEEE 1800.2-2020 标准原文(WeKnora `IEEE` 库) - `src/1800.2-2020-2.0/DEVIATIONS.md`(Accellera 实现的 3 条标准偏离,见参考资料的标准与实现限制) - `src/1800.2-2020.3.2/compat/README.md`(compat 包官方使用说明) - `src/uvm-1.2/release-notes.txt`、`UVM_Reference.html` - VCS 内置 `uvm-ieee-2020-2.0/README.md`(含 "Migrating from 1.2" 官方建议)