跳转至

输入查询内容

    本页内容

    打印整数时显式传位宽,避免把 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 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。

    • C13 · 文本匹配:uvm_print_* 宏数字后缀变体删除、签名重排。

    • S16 · 启发式:旧两参 uvm_print_int 的 radix 可能被当成位宽。 只报告两参 uvm_print_int 的 SIZE/RADIX 歧义,省略默认参数及三参目标签名不因此报错。

    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules C13,S16
    

    核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。

    扫描器下载、输入范围与报告说明

    源码与标准依据

    核查方式:源码与实测核对。实测仅覆盖本条所列场景。

    VCS 内置 UVM-1.2uvm_printer_defines.svh:39uvm_print_int(F, R))、uvm_printer_defines.svh:67uvm_print_object(F))、uvm_printer_defines.svh:82uvm_print_string(F)

    VCS 内置 uvm-ieee-2020-2.0uvm_printer_defines.svh:41uvm_print_int(VALUE, SIZE, RADIX, VALUE_TYPE, PRINTER))、uvm_printer_defines.svh:74uvm_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 · 迁移清单

    版本适用范围