跳转至

输入查询内容

    本页内容

    uvm_packer 状态存取 API 重命名与签名变更

    影响范围

    调用旧 packer 状态存取 API,或把状态流当成有效载荷发送。

    具体差异

    get_packed_bits 同名但签名全改(返回值 → ref 数组);get_bytes/get_intsget_packed_bytes/get_packed_ints,新增 get_packed_longintsput_bits/put_bytes/put_intsset_packed_bits/bytes/ints/longintsget_bit/get_byte/get_intreset()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 单独迁移。

    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 的旧返回值形式也要调整:

    1
    2
    3
    // UVM 1.2: fixed packed return value
    uvm_pack_bitstream_t state;
    state = p.get_packed_bits();
    
    1
    2
    3
    // 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_compat_packer 内联提供了 get_bits/get_bytes/get_ints/put_*/reset 等 1.2 API,compat/uvm_compat_packer.svh:476-524;但仅在使用 compat packer 时生效。

    迁移后验证

    编译新接口调用,分别检查有效 bit 数、状态流长度和 unpack 结果;状态流中的迭代器元数据不能算作协议有效载荷。

    记录本条结果M02-002 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

    有扫描规则,覆盖部分可识别写法。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_packer.svh:380get_packed_bits() 返回 uvm_pack_bitstream_t)、uvm_packer.svh:386(get_bits)、uvm_packer.svh:390(put_bits)、uvm_packer.svh:398(reset)

    VCS 内置 uvm-ieee-2020-2.0uvm_packer.svh:103get_packed_bits(ref bit unsigned stream[]) 返回 void)、uvm_packer.svh:75(set_packed_bits)、uvm_packer.svh:134(flush)

    标准依据:IEEE 1800.2-2020 §16.5.3(state retrieval/assignment 方法)

    标为“源码标注”或未注明原文核对的条款仅作定位;具体库行为以源码和实测为准。

    引用代码(高亮为引用行);上方行号链接可直接定位。

    src/vcs-uvm-1.2/base/uvm_packer.svh
      extern virtual function void unpack_object_ext  (inout uvm_object value);
    
      extern virtual function uvm_pack_bitstream_t get_packed_bits ();
    
      extern virtual function bit  unsigned get_bit  (int unsigned index);
      extern virtual function byte unsigned get_byte (int unsigned index);
      extern virtual function int  unsigned get_int  (int unsigned index);
    
      extern virtual function void get_bits (ref bit unsigned bits[]);
      extern virtual function void get_bytes(ref byte unsigned bytes[]);
      extern virtual function void get_ints (ref int unsigned ints[]);
    
      extern virtual function void put_bits (ref bit unsigned bitstream[]);
      extern virtual function void put_bytes(ref byte unsigned bytestream[]);
      extern virtual function void put_ints (ref int unsigned intstream[]);
    
      extern virtual function void set_packed_size(); 
      extern function void index_error(int index, string id, int sz);
      extern function bit enough_bits(int needed, string id);
    
      extern function void reset();
    
    endclass
    
    
    
    //------------------------------------------------------------------------------
    // IMPLEMENTATION
    //------------------------------------------------------------------------------
    
    // NOTE- max size limited to BITSTREAM bits parameter (default: 4096)
    
    
    // index_ok
    // --------
    

    完整源码 · SHA256:2c802b943823e0d088bc70ec94ad49f08f2bbee46f451900353d5e926027b4f6

    src/vcs-uvm-ieee-2020-2.0/base/uvm_packer.svh
      //
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.1
      extern virtual function void set_packed_bits (ref bit unsigned stream[]);
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.1
      extern virtual function void set_packed_bytes (ref byte unsigned stream[]);
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.1
      extern virtual function void set_packed_ints (ref int unsigned stream[]);
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.1
      extern virtual function void set_packed_longints (ref longint unsigned stream[]);
    
      // Function -- NODOCS -- get_packed_*
      // Implementation of P1800.2 16.5.3.2
      //
      // The LRM specifies the get_packed_* methods as being
      // signed, whereas the <uvm_object::pack> methods are specified
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_packer.svh
      //
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.2
      extern virtual function void get_packed_bits (ref bit unsigned stream[]);
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.2
      extern virtual function void get_packed_bytes (ref byte unsigned stream[]);
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.2
      extern virtual function void get_packed_ints (ref int unsigned stream[]);
    
      // @uvm-ieee 1800.2-2020 auto 16.5.3.2
      extern virtual function void get_packed_longints (ref longint unsigned stream[]);
    
      //----------------//
      // Group -- NODOCS -- Packing //
      //----------------//
    
      // @uvm-ieee 1800.2-2020 auto 16.5.2.4
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_packer.svh
      // @uvm-ieee 1800.2-2020 auto 16.5.2.2
      extern virtual function void flush ();
      // Function -- NODOCS -- pack_field
      //
      // Packs an integral value (less than or equal to 4096 bits) into the
      // packed array. ~size~ is the number of bits of ~value~ to pack.
    
      // @uvm-ieee 1800.2-2020 auto 16.5.4.8
      extern virtual function void pack_field (uvm_bitstream_t value, int size);
    
    
      // Function -- NODOCS -- pack_field_int
      //
      // Packs the integral value (less than or equal to 64 bits) into the
      // pack array.  The ~size~ is the number of bits to pack, usually obtained by
      // ~$bits~. This optimized version of <pack_field> is useful for sizes up
      // to 64 bits.
    

    完整源码 · SHA256:46e8c9a07d8057451745f4d9b1f49549150620837e7a34bc638a6382d45d9ee2

    术语解释 · 兼容配置

    pack 位流格式改变(M02-001)

    返回Comparer / Printer / Packer / Recorder · 迁移清单

    版本适用范围