- 差异参考
- 按模块查阅
- Comparer / Printer / Packer / Recorder
Comparer / Printer / Packer / Recorder
优先核对跨版本位流和直接定制 printer/comparer 的代码。目标库重构了策略类;packer 默认布局、printer knobs 和打印宏参数均有变化。跨边界 packet 必须与旧版 golden 对照,输出格式变化按项目的日志契约验收。
建议阅读顺序
先确认是否存在跨版本 packet 契约,再看自定义 comparer/printer。输出格式变化与数据协议变化应分别验收。
M02-001 → M02-005 → M02-003 → M02-004
用户接口与行为
| 条目 | 修改方案 |
|---|---|
| M02-001 | pack 位流格式改变:检查外部接收端与历史数据 编译断点 高风险 · 静默/数据同版 pack/unpack 仍需验证实际对象类型、空对象和数组长度;跨边界流必须与保留的 1.2 golden 逐位对照。可用 uvm_compat_packer 配合显式 do_pack/do_unpack 固定契约,或统一升级两端格式。不能将替换 packer 本身作为位流兼容性验收。 |
| M02-002 | uvm_packer 状态存取 API 重命名与签名变更 编译断点 其他行为变化把 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 单独迁移。 |
| M02-003 | 删除无效的打印宽度配置,使用 printer 访问器 编译断点 日志/调试变化删除旧 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 子类,不能对任意基类句柄照搬。 |
| M02-004 | 打印整数时显式传位宽,避免把 UVM_HEX 当宽度 编译断点 高风险 · 静默/数据保留现有 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 等操作意图。 |
| M02-005 | 自定义比较:检查类型设置和不匹配消息数量 编译断点 高风险 · 静默/数据 日志/调试变化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) ,由调用方管理独立比较之间的清理。 |
| M02-006 | uvm_printer emit() 必须配 flush(),新增 UVM/PRINT/NO_FLUSH 检查 日志/调试变化 其他行为变化直接拼装输出时,每次独立输出先 printer.flush(),再 print_field 等填入字段,最后保存 printer.emit() 返回值;下一次输出重新执行同样顺序。普通 obj.sprint(printer) 顶层已负责 flush,可保留该路径。 |
| M02-007 | 自定义 recorder 的对象递归与文本输出 日志/调试变化 其他行为变化仅用于手工递归的 do_record_object override 可移除,由目标基类递归。需要自定义属性时保留该 override,但只保留一次递归入口:选择 super.do_record_object(name, value) 后,删除重复的 value.record(this)。自定义后端仍保留必要的写属性逻辑;文本后处理改为读取 inst_id,并核对嵌套对象身份。 |
| M02-008 | uvm_tree_printer.newline 字段私有化;uvm_table_printer::calculate_max_widths 删除 编译断点 日志/调试变化需要单行输出时使用 uvm_line_printer ;自定义换行规则需在派生 printer 中实现并对照输出。 set_separators 配置对象的起止分隔字符,不替代 newline。删除 calculate_max_widths() 调用后,验证目标自动列宽满足原输出契约。 |
| M02-012 | 重写 recorder、stream、database 方法时同步句柄类型 编译断点 日志/调试变化普通 integer 变量存储 int 句柄无需因 64 位仿真而修改,两种整数都为 32 位四态。覆盖虚方法时须匹配目标版签名(参见 M06-007 的 VCS 类型检查);删除已失去调用入口的 m_get_handle override。 |
| M02-016 | 旧数组录制上限失效:显式控制记录项数 编译断点 日志/调试变化先确认需要记录全部元素还是限定元素;需要上限时,给对应字段的 field FLAG 加 UVM_NORECORD ,在 do_record(uvm_recorder recorder) 中按显式上限调用 record_field_int/record_object 等对应接口。调用旧 getter 的代码改读自己维护的配置;验证记录内容后再删除旧 plusarg。已有手工录制字段不要同时启用自动录制。 |
| M02-017 | 旧录制取时开关失效:明确事务时间契约 日志/调试变化若只需目标默认取时,删除失效 plusarg 后核对实际事务时间;若已有明确的整数时间契约,在调用 stream.open_recorder(name, recorded_time, type_name) 时传入按项目单位换算的非零 time。原先依赖小数分辨率或 Verdi 展示的路径需核对源 timeunit/timeprecision、time 转换和后端;没有已验证的通用开关替换。 |
新增功能 · 5 项
目标库新增的 API 和可选替代接口;已有用法的迁移要求列在用户接口与行为中。
| 条目 | 修改方案 |
|---|---|
| M02-009 | uvm_printer 新增标准配置/查询 API(accessor、set_default/get_default、element 栈) 日志/调试变化保留且行为符合需要的 knobs 字段可继续使用,无需仅为改名替换;需要标准配置接口时采用访问器并验证输出。删除成员按 M02-003 处理。 |
| M02-010 | uvm_packer 新增 API(pack_object_with_meta / unpack_object_with_meta / set_default 等) 高风险 · 静默/数据无(新增能力,可选用) |
| M02-011 | uvm_comparer 新增标准配置 API 新增/接口调整无(新增);建议新代码用 accessor |
| M02-014 | 新增 uvm_cache / uvm_lru_cache(及内部 uvm_regex_cache) 新增/接口调整无 |
| M02-015 | 新增 comparer 宏与命名比较辅助 高风险 · 静默/数据已有 do_compare 无需仅为新宏改写。选择新 comparer 宏时,按目标原型传入字段名、值和 comparer,并用相等/不等对象验证比较返回值与诊断。 |
内部实现 · 2 项
文件组织、内部数据结构与实现钩子的变化。直接依赖内部接口时查阅,普通 API 的使用不需要重审这些源码。
| 条目 | 修改方案 |
|---|---|
| M02-013 | uvm_text_tr_database / uvm_text_tr_stream 拆分为独立文件 编译断点 日志/调试变化通过 uvm_pkg 使用类型时无需修改;直接 include 旧宿主文件且依赖 text 类型时,同步目标文件依赖。 |
| M09-010 | pack、unpack、record 宏的文件拆分 编译断点 高风险 · 静默/数据直接 include 子宏文件的代码改用 uvm_macros.svh;跨版本打包须遵循 M02-001 的逐位验收,不能仅替换 compat packer。 |
VCS 定制说明
VCS 定制说明
以下对照用于区分 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 行为相同;版本间变化见各主条目。 |