跳转至

输入查询内容

    本页内容

    uvm_tlm_generic_payload do_pack/do_unpack 无条件打包 m_dmi,打包流布局变化

    影响范围

    跨版本传输或保存 GP 位流的路径需比较 golden;同版闭环也需验证实际数组和缓冲区条件。

    具体差异

    1.2 中 m_dmi(1 bit)仅在定义 VCS_TLI_GP_PACKING 时打包,位置在 m_response_status 之后;2.0 改为无条件打包,位置在 m_length 之后、m_data 之前。依赖原布局的跨版本交换(TLI、DPI 桥接、落盘回放)需重新定义或适配契约。同版 pack/unpack 也要核对数组分配、长度和实际对象内容,不能仅凭使用同一库免测。另注意:2.0 下若再定义 VCS_TLI_GP_PACKING,m_dmi 会被打包两次(:570 无条件 + :578 ifdef 内),布局与 1.2+该 define 也不同。

    修改方案

    跨版本交换时升级两端契约或显式保留旧格式;更换 compat packer 不会撤销 GP 自身新增的 m_dmi。serialization_probe 中相同 GPcompat packer 下仍由 240 位变为 241 位,1.2 默认流不携带 DMI 状态。两版已有的预分配 data 数组解包风险也应核对 UVM_TLM_GP_BUF_OVERFLOW_FIX,不要仅凭同版闭环就免测。

    兼容措施与范围compat packer 不能撤销 GP 新增的 m_dmi 位;跨版本协议须明确格式并逐位验收。

    迁移后验证

    检查 DMI 状态、总位数、数据/byte-enable 数组和逐位 goldencompat packer 不会取消 GP 自身增加的 DMI 位。

    记录本条结果M08-003 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_tlm2_generic_payload.svh:509(do_pack)、uvm_tlm2_generic_payload.svh:548(do_unpack)

    VCS 内置 uvm-ieee-2020-2.0uvm_tlm2_generic_payload.svh:557(do_pack,m_dmi 在 :570)、uvm_tlm2_generic_payload.svh:602(do_unpack,m_dmi 在 :607)

    标准依据:IEEE 1800.2-2020 §12.3.4.2.4 / §12.3.4.2.5(2.0 源码标注,打包字段顺序含 m_dmi)

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

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

    src/vcs-uvm-1.2/tlm2/uvm_tlm2_generic_payload.svh
      // We only pack m_length bytes of the m_data array, even if m_data is larger
      // than m_length. Same treatment for the byte-enable array. We do not pack
      // the extensions, if any, as we will be unable to unpack them.
      function void do_pack(uvm_packer packer);
        super.do_pack(packer);
        if (m_length > m_data.size())
           `uvm_fatal("PACK_DATA_ARR",
             $sformatf("Data array m_length property (%0d) greater than m_data.size (%0d)",
             m_length,m_data.size()))
        if (m_byte_enable_length > m_byte_enable.size())
           `uvm_fatal("PACK_DATA_ARR",
             $sformatf("Data array m_byte_enable_length property (%0d) greater than m_byte_enable.size (%0d)",
             m_byte_enable_length,m_byte_enable.size()))
        `uvm_pack_intN  (m_address,64)
        `uvm_pack_enumN (m_command,32)
        `uvm_pack_intN  (m_length,32)
        for (int i=0; i<m_length; i++)
          `uvm_pack_intN(m_data[i],8)
    `ifdef VCS_TLI_GP_PACKING
    

    src/vcs-uvm-1.2/tlm2/uvm_tlm2_generic_payload.svh
      // is greater than their current size. We do not unpack extensions
      // because we do not know what object types to allocate before we
      // unpack into them. Extensions must be handled by user code.
      function void do_unpack(uvm_packer packer);
        super.do_unpack(packer);
        `uvm_unpack_intN  (m_address,64)
        `uvm_unpack_enumN (m_command, 32, uvm_tlm_command_e)
        `uvm_unpack_intN  (m_length,32)
        if (m_data.size() < m_length)
          m_data = new[m_length];
    `ifdef UVM_TLM_GP_BUF_OVERFLOW_FIX
        for(int i=0; i < m_length; i++) 
    `else
        foreach (m_data[i])
    `endif
          `uvm_unpack_intN(m_data[i],8)
    `ifdef VCS_TLI_GP_PACKING
        `uvm_unpack_intN  (m_length,32)
    `endif
    

    完整源码 · SHA256:a9d6f673e4c9fcf993fbb28fb24a1ecbb5912784966a3048b94c77fede11c6cf

    src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_generic_payload.svh
      //
    
      // @uvm-ieee 1800.2-2020 auto 12.3.4.2.4
      function void do_pack(uvm_packer packer);
        super.do_pack(packer);
        if (m_length > m_data.size())
           `uvm_fatal("PACK_DATA_ARR",
             $sformatf("Data array m_length property (%0d) greater than m_data.size (%0d)",
             m_length,m_data.size()))
        if (m_byte_enable_length > m_byte_enable.size())
           `uvm_fatal("PACK_DATA_ARR",
             $sformatf("Data array m_byte_enable_length property (%0d) greater than m_byte_enable.size (%0d)",
             m_byte_enable_length,m_byte_enable.size()))
        `uvm_pack_intN  (m_address,64)
        `uvm_pack_enumN (m_command,32)
        `uvm_pack_intN  (m_length,32)
        `uvm_pack_intN  (m_dmi,1)
        for (int i=0; i<m_length; i++)
          `uvm_pack_intN(m_data[i],8)
    

    src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_generic_payload.svh
      //
    
      // @uvm-ieee 1800.2-2020 auto 12.3.4.2.5
      function void do_unpack(uvm_packer packer);
        super.do_unpack(packer);
        `uvm_unpack_intN  (m_address,64)
        `uvm_unpack_enumN (m_command, 32, uvm_tlm_command_e)
        `uvm_unpack_intN  (m_length,32)
        `uvm_unpack_intN (m_dmi, 1)
        if (m_data.size() < m_length)
          m_data = new[m_length];
    `ifdef UVM_TLM_GP_BUF_OVERFLOW_FIX
        for(int i=0; i < m_length; i++) 
    `else
        foreach (m_data[i])
    `endif
          `uvm_unpack_intN(m_data[i],8)
    `ifdef VCS_TLI_GP_PACKING
        `uvm_unpack_intN  (m_length,32)
    

    完整源码 · SHA256:fe1a030902614234ed93702a137118fabfd1716a1c818177d7aa2bd56b5c87f5

    术语解释 · 兼容配置

    返回TLM · 迁移清单

    版本适用范围