本页内容
pack、unpack、record 宏的文件拆分
编译断点 高风险 · 静默/数据
内部实现 :文件组织、内部数据结构与实现钩子的变化。直接依赖内部接口时查阅,普通 API 的使用不需要重审这些源码。
影响范围
直接 include uvm_object_defines.svh 并依赖其中的 pack/unpack/record 子宏。通过 uvm_macros.svh 使用默认 policy 参数的原调用保持源码兼容;公开 pack 位流变化由 M02-001 承接。
具体差异
宏从 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 替代类;宏本身无需覆盖)。
迁移后验证
改用 uvm_macros.svh 后编译全部使用方;跨边界位流仍与 1.2 golden 逐位对照,文件包含成功不能证明数据兼容。
记录核销 :在无规则及补充检查 中记录实际依赖与证据。
已有实测与复现
补充查阅
扫描定位与记录结果
有扫描规则,覆盖部分可识别写法 。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。
uv run tools/uvm_migration_scan.py <SoC代码目录> --rules D16
核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。
扫描器下载、输入范围与报告说明
源码与标准依据
核查方式:源码与实测核对 。实测仅覆盖本条所列场景。
VCS 内置 UVM-1.2 :uvm_object_defines.svh:3481 (uvm_record_attribute)、uvm_object_defines.svh:3502 (uvm_record_int)、uvm_object_defines.svh:3699 (uvm_pack_int)
VCS 内置 uvm-ieee-2020-2.0 :uvm_packer_defines.svh:136 (uvm_pack_int(VAR,PACKER=packer))、uvm_recorder_defines.svh:77 /uvm_recorder_defines.svh:100 、uvm_comparer_defines.svh:52 、uvm_copier_defines.svh:36 、uvm_resource_defines.svh:41 ;统一由 uvm_macros.svh:114–119 编入
标准依据 :IEEE 1800.2-2020 §B.2.4(pack/unpack 宏)
标为“源码标注”或未注明原文核对的条款仅作定位;具体库行为以源码和实测为准。
引用代码(高亮为引用行);上方行号链接可直接定位。
src/vcs-uvm-1.2/macros/uvm_object_defines.svh `ifndef uvm_record_attribute
`ifdef QUESTA
`define uvm_record_attribute ( TR_HANDLE , NAME , VALUE ) \
$ add_attribute ( TR_HANDLE , VALUE , NAME );
`else
`define uvm_record_attribute ( TR_HANDLE , NAME , VALUE ) \
recorder . record_generic ( NAME , $ sformatf ( "%p" , VALUE ));
`endif
`endif
// Macro: `uvm_record_int
//
//| `uvm_record_int(NAME,VALUE,SIZE[,RADIX])
//
// The ~`uvm_record_int~ macro takes the same arguments as
// the <uvm_recorder::record_field> method (including the optional ~RADIX~).
//
// The default implementation will pass the name/value pair to
src/vcs-uvm-1.2/macros/uvm_object_defines.svh //
`ifndef uvm_record_int
`define uvm_record_int ( NAME , VALUE , SIZE , RADIX = UVM_NORADIX ) \
if ( recorder != null && recorder . is_open ()) begin \
if ( recorder . use_record_attribute ()) \
`uvm_record_attribute ( recorder . get_record_attribute_handle (), NAME , VALUE ) \
else \
if ( SIZE > 64 ) \
recorder . record_field ( NAME , VALUE , SIZE , RADIX ); \
else \
recorder . record_field_int ( NAME , VALUE , SIZE , RADIX ); \
end
`endif
// Macro: `uvm_record_string
//
//| `uvm_record_string(NAME,VALUE)
//
src/vcs-uvm-1.2/macros/uvm_object_defines.svh //
//| `uvm_pack_int(VAR)
//
`define uvm_pack_int(VAR) \
`uvm_pack_intN(VAR,$bits(VAR))
// Macro: `uvm_pack_enum
//
// Pack an enumeration value. Packing does not require its type be specified.
//
//| `uvm_pack_enum(VAR)
//
`define uvm_pack_enum(VAR) \
`uvm_pack_enumN(VAR,$bits(VAR))
// Macro: `uvm_pack_string
//
完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1
src/vcs-uvm-ieee-2020-2.0/macros/uvm_packer_defines.svh // @uvm-ieee 1800.2-2020 auto B.2.4.6
`define uvm_pack_int(VAR,PACKER=packer) \
`uvm_pack_intN(VAR,$bits(VAR),PACKER)
// uvm_pack_object
`define uvm_pack_object(VAR,PACKER=packer) \
PACKER.pack_object_with_meta(VAR);
// @uvm-ieee 1800.2-2020 auto B.2.4.7
`define uvm_pack_enum(VAR,PACKER=packer) \
`uvm_pack_enumN(VAR,$bits(VAR),PACKER)
// @uvm-ieee 1800.2-2020 auto B.2.4.8
`define uvm_pack_string(VAR,PACKER=packer) \
PACKER.pack_string(VAR);
完整源码 · SHA256:08f5c945fa7d7fe4bb53cb9478756c920dfff5d1e86bbbd93054999813f717ab
src/vcs-uvm-ieee-2020-2.0/macros/uvm_recorder_defines.svh `ifndef uvm_record_attribute
`ifdef QUESTA
`define uvm_record_attribute ( TR_HANDLE , NAME , VALUE , RECORDER = recorder ) \
$ add_attribute ( TR_HANDLE , VALUE , NAME );
`else
// @uvm-ieee 1800.2-2020 auto B.2.3.1
`define uvm_record_attribute(TR_HANDLE,NAME,VALUE,RECORDER=recorder) \
RECORDER.record_generic(NAME, $sformatf("%p", VALUE));
`endif
`endif
// Macro -- NODOCS -- `uvm_record_int
//
//| `uvm_record_int(NAME,VALUE,SIZE[,RADIX])
//
// The ~`uvm_record_int~ macro takes the same arguments as
// the <uvm_recorder::record_field> method (including the optional ~RADIX~).
//
src/vcs-uvm-ieee-2020-2.0/macros/uvm_recorder_defines.svh `ifndef uvm_record_int
// @uvm-ieee 1800.2-2020 auto B.2.3.2
`define uvm_record_int(NAME,VALUE,SIZE,RADIX = UVM_NORADIX,RECORDER=recorder) \
if (RECORDER != null && RECORDER.is_open()) begin \
if (RECORDER.use_record_attribute()) \
`uvm_record_attribute(RECORDER.get_record_attribute_handle(),NAME,VALUE,RECORDER) \
else \
if (SIZE > 64) \
RECORDER.record_field(NAME, VALUE, SIZE, RADIX); \
else \
RECORDER.record_field_int(NAME, VALUE, SIZE, RADIX); \
end
`endif
// Macro -- NODOCS -- `uvm_record_string
//
//| `uvm_record_string(NAME,VALUE)
//
完整源码 · SHA256:182dfa5e33826150d5ad29527498a0dfb0418ab868e578332308841cb4c84c00
src/vcs-uvm-ieee-2020-2.0/macros/uvm_comparer_defines.svh `m_uvm_compare_threshold_end
// uvm_compare_int
`define uvm_compare_int(LVALUE, RVALUE, RADIX, COMPARER=comparer) \
`uvm_compare_named_int(`"LVALUE`", LVALUE, RVALUE, RADIX, COMPARER)
`define uvm_compare_named_int(NAME, LVALUE, RVALUE, RADIX, COMPARER=comparer) \
`m_uvm_compare_begin(LVALUE, RVALUE, COMPARER) \
if ($bits(LVALUE) <= 64) \
void'(COMPARER.compare_field_int(NAME , LVALUE, RVALUE, $bits(LVALUE), RADIX)); \
else \
void'(COMPARER.compare_field(NAME , LVALUE, RVALUE, $bits(LVALUE), RADIX)); \
`m_uvm_compare_end
// uvm_compare_enum
`define uvm_compare_enum(LVALUE, RVALUE, TYPE, COMPARER=comparer) \
`uvm_compare_named_enum(`"LVALUE`", LVALUE, RVALUE, TYPE, COMPARER)
完整源码 · SHA256:bc5a1f24eadb26912cc84e92d77fdd35970a281965fa6afc60d9b56b02d36352
src/vcs-uvm-ieee-2020-2.0/macros/uvm_copier_defines.svh // uvm_copy_object
`define uvm_copy_object(LVALUE, RVALUE, POLICY=UVM_DEFAULT_POLICY, COPIER=copier) \
if (LVALUE != RVALUE) begin \
if ((RVALUE == null) || \
(POLICY == UVM_REFERENCE) || \
((POLICY == UVM_DEFAULT_POLICY) && \
(COPIER.get_recursion_policy() == UVM_REFERENCE))) begin \
LVALUE = RVALUE; \
end \
else begin \
uvm_object lvalue_ref__; \
if (!COPIER.get_first_copy(RVALUE,lvalue_ref__) || !$cast(LVALUE,lvalue_ref__)) begin \
uvm_recursion_policy_enum prev_pol__ = COPIER.get_recursion_policy(); \
uvm_recursion_policy_enum curr_pol__; \
if (POLICY != UVM_DEFAULT_POLICY) \
COPIER.set_recursion_policy(POLICY); \
curr_pol__ = COPIER.get_recursion_policy(); \
完整源码 · SHA256:44dd0b5d425833a899da4dddfe96cce59c3d30b65b54a1991fead765da9aae73
src/vcs-uvm-ieee-2020-2.0/macros/uvm_resource_defines.svh // ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
`define uvm_resource_read(SUCCESS, RSRC, TYPE, VAL, OBJ=null) \
begin \
uvm_resource#(TYPE) __tmp_rsrc__; \
SUCCESS = $cast(__tmp_rsrc__, RSRC); \
if (SUCCESS) begin \
VAL = __tmp_rsrc__.read(OBJ); \
end \
end
// uvm_resource_builtin_int_read
// -----------------------------
// Attempts to read an integral typed resource ~RSRC~
// into VAL.
//
// ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
完整源码 · SHA256:6d3002de0c763a865adac11b443e5788d646b2c30f653cd3b831372a1bca051b
src/vcs-uvm-ieee-2020-2.0/uvm_macros.svh `include "macros/snps_macros.svp"
`include "macros/uvm_message_defines.svh"
`include "macros/uvm_phase_defines.svh"
`include "macros/uvm_printer_defines.svh"
`include "macros/uvm_comparer_defines.svh"
`include "macros/uvm_recorder_defines.svh"
`include "macros/uvm_resource_defines.svh"
`include "macros/uvm_packer_defines.svh"
`include "macros/uvm_copier_defines.svh"
//`ifdef UVM_ENABLE_DEPRECATED_API
//`include "deprecated/macros/uvm_object_defines.svh"
//`else
`include "macros/uvm_object_defines.svh"
//`endif
`include "macros/uvm_tlm_defines.svh"
`include "macros/uvm_sequence_defines.svh"
`include "macros/uvm_callback_defines.svh"
`include "macros/uvm_reg_defines.svh"
完整源码 · SHA256:d85eb414948cb37c6249b33c0c7f728296e86f833a81d772c86e09245d8df764
术语解释 · 兼容配置
pack 位流格式改变(M02-001)
返回Comparer / Printer / Packer / Recorder · 迁移清单
版本适用范围