本页内容
打印整数时显式传位宽,避免把 UVM_HEX 当宽度
编译断点 高风险 · 静默/数据
影响范围
自定义 do_print 直接使用旧打印宏时受影响;数字后缀宏删除与同名宏参数变化需分别处理。
具体差异
打印宏改用显式 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 等操作意图。
在 do_print(uvm_printer printer) 内打印一个不超过 64 位的整数字段 value:
| // UVM 1.2 macro
`uvm_print_int(value, UVM_HEX)
|
改为两版均支持的直接调用,字段名、宽度和进制一一对应:
| printer.print_field_int("value", value, $bits(value), UVM_HEX);
|
若继续使用目标版宏,应写成 uvm_print_int(value, $bits(value), UVM_HEX)。旧两参调用可能仍能编译,但第二参在目标版是位宽,输出会错。更宽的数据应使用 print_field 并核对其位宽限制。
兼容措施与范围:旧数字后缀打印宏和旧参数含义无兼容恢复;按目标原型明确 SIZE、RADIX 与 printer。
迁移后验证
优先用探针捕获传入 printer 的 SIZE/RADIX,确认实际位宽与进制;再渲染正常宽度值,避免直接打印被误当位宽的 radix 常量。
记录本条结果:M02-004 · 状态与证据。
已有实测与复现
补充查阅
扫描定位与记录结果
有扫描规则,覆盖部分可识别写法。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。
| uv run tools/uvm_migration_scan.py <SoC代码目录> --rules C13,S16
|
核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。
扫描器下载、输入范围与报告说明
源码与标准依据
核查方式:源码与实测核对。实测仅覆盖本条所列场景。
VCS 内置 UVM-1.2:uvm_printer_defines.svh:39(uvm_print_int(F, R))、uvm_printer_defines.svh:67(uvm_print_object(F))、uvm_printer_defines.svh:82(uvm_print_string(F))
VCS 内置 uvm-ieee-2020-2.0:uvm_printer_defines.svh:41(uvm_print_int(VALUE, SIZE, RADIX, VALUE_TYPE, PRINTER))、uvm_printer_defines.svh:74、uvm_printer_defines.svh:104
标准依据:IEEE 1800.2-2020 §16.2.3.8 / §16.2.3.9 定义底层 print_field / print_field_int 方法;本条 uvm_print_* 宏原型以目标实现为准。
标为“源码标注”或未注明原文核对的条款仅作定位;具体库行为以源码和实测为准。
引用代码(高亮为引用行);上方行号链接可直接定位。
| src/vcs-uvm-1.2/macros/uvm_printer_defines.svh |
|---|
| // uvm_print_int*
// --------------
`define uvm_print_int(F, R) \
`uvm_print_int3(F, R, uvm_default_printer)
`define uvm_print_int3(F, R, P) \
do begin \
uvm_printer p__; \
if(P!=null) p__ = P; \
else p__ = uvm_default_printer; \
`uvm_print_int4(F, R, `"F`", p__) \
end while(0);
`define uvm_print_int4(F, R, NM, P) \
if ($bits(F) > 64) \
P.print_field(NM, F, $bits(F), R, "["); \
else \
P.print_field_int(NM, F, $bits(F), R, "[");
|
| src/vcs-uvm-1.2/macros/uvm_printer_defines.svh |
|---|
| // uvm_print_object*
// -----------------
`define uvm_print_object(F) \
`uvm_print_object2(F, uvm_default_printer)
`define uvm_print_object2(F, P) \
do begin \
uvm_printer p__; \
if(P!=null) p__ = P; \
else p__ = uvm_default_printer; \
p__.print_object(`"F`", F, "["); \
end while(0);
// uvm_print_string*
// -----------------
`define uvm_print_string(F) \
`uvm_print_string2(F, uvm_default_printer)
`define uvm_print_string2(F, P) \
do begin \
uvm_printer p__; \
if(P!=null) p__ = P; \
else p__ = uvm_default_printer; \
p__.print_string(`"F`", F, "["); \
end while(0);
// uvm_print_array*
// ----------------
`define uvm_print_array_int(F, R) \
|
完整源码 · SHA256:ae38ede76deb96d74f9b178c7eea3c1763c246884fdc751e6ad9659fead9f595
| src/vcs-uvm-ieee-2020-2.0/macros/uvm_printer_defines.svh |
|---|
| // uvm_print_int
// --------------
`define uvm_print_int(VALUE, SIZE, RADIX=UVM_NORADIX, VALUE_TYPE=integral, PRINTER=printer) \
`uvm_print_named_int(`"VALUE`", VALUE, SIZE, RADIX, VALUE_TYPE, PRINTER)
`define uvm_print_named_int(NAME, VALUE, SIZE, RADIX=UVM_NORADIX, VALUE_TYPE=integral, PRINTER=printer) \
if (SIZE > 64) \
PRINTER.print_field(NAME, VALUE, SIZE, RADIX, ".", `"VALUE_TYPE`"); \
else \
PRINTER.print_field_int(NAME, VALUE, SIZE, RADIX, ".", `"VALUE_TYPE`");
// uvm_print_real
// --------------
`define uvm_print_real(VALUE, PRINTER=printer) \
`uvm_print_named_real(`"VALUE`", VALUE, PRINTER)
`define uvm_print_named_real(NAME, VALUE, PRINTER=printer) \
|
| src/vcs-uvm-ieee-2020-2.0/macros/uvm_printer_defines.svh |
|---|
| // uvm_print_object*
// -----------------
`define uvm_print_object(VALUE, RECURSION_POLICY=UVM_DEFAULT_POLICY, PRINTER=printer) \
`uvm_print_named_object(`"VALUE`", VALUE, RECURSION_POLICY, PRINTER)
`define uvm_print_named_object(NAME, VALUE, RECURSION_POLICY=UVM_DEFAULT_POLICY, PRINTER=printer) \
if ((RECURSION_POLICY != UVM_DEFAULT_POLICY) && \
(RECURSION_POLICY != PRINTER.get_recursion_policy())) begin \
uvm_recursion_policy_enum __saved_recursion_policy = PRINTER.get_recursion_policy(); \
PRINTER.set_recursion_policy(RECURSION_POLICY); \
`m_uvm_print_named_object(NAME, VALUE, PRINTER) \
PRINTER.set_recursion_policy(__saved_recursion_policy); \
end \
else begin \
`m_uvm_print_named_object(NAME, VALUE, PRINTER) \
end
|
| src/vcs-uvm-ieee-2020-2.0/macros/uvm_printer_defines.svh |
|---|
| // uvm_print_string*
// -----------------
`define uvm_print_string(VALUE, PRINTER=printer) \
`uvm_print_named_string(`"VALUE`", VALUE, PRINTER)
`define uvm_print_named_string(NAME, VALUE, PRINTER=printer) \
PRINTER.print_string(NAME, VALUE);
////////////////////////
// Array Printing Below
////////////////////////
// Arrays of ints
`define uvm_print_qda_int(ARRAY_TYPE, VALUE, RADIX=UVM_NORADIX, VALUE_TYPE=integral, PRINTER=printer) \
`uvm_print_named_qda_int(ARRAY_TYPE, `"VALUE`", VALUE, RADIX, VALUE_TYPE, PRINTER)
`define uvm_print_named_qda_int(ARRAY_TYPE, NAME, VALUE, RADIX=UVM_NORADIX, VALUE_TYPE=integral, PRINTER=printer) \
|
完整源码 · SHA256:210a3dd8de8651c009a60c4fbde6c768bafe33bcaf4f8a7b1ea601a478308283
术语解释 · 兼容配置
返回Comparer / Printer / Packer / Recorder · 迁移清单
版本适用范围