跳转至

输入查询内容

    本页内容

    uvm_tlm_generic_payload::do_compare() 全面重写

    已复现的目标库问题

    目标库 GP extension 漏检已复现;显式集合比较在限定场景通过。

    影响范围

    scoreboard 比较 uvm_tlm_generic_payload,且事务携带 extension 时重点核对。

    具体差异

    1.2 对字段作短路比较,extension 集合双向检查,byte_enable 数组内容本身不参与比较。2.0 改为逐字段 comparer 操作,新增 byte_enable 内容比较;threshold 控制比较停止门槛,与控制消息条数的 show_max 是不同属性。消息经 comparer.print_msg() 发出,仍使用 comparer 的 severity。顶层 obj.compare() 自动 flush;只有直接调用 do_compare() 等自行管理上下文的路径才需额外防范累计 result。

    已复现的风险:① 2.0 只遍历 lhs 的 extension,rhs 独有项漏检;② 遍历中 if (!threshold || result < threshold) break 在尚未达到阈值时退出,两个相同 extension 只调用一次比较,删除后一个 extension 仍返回相等。双库 semantic_probe 在相同条件下分别观察到比较次数 2 / 1、缺失后返回值 0 / 1。该缺陷存在于目标实现,不能仅靠双向调用 GP compare 消除。

    修改方案

    使用 extension 的 scoreboard 显式检查两侧键集合,并逐项比较每个 extension,结果与 GP 基本字段比较共同决定匹配。semantic_probe.svextensions_equal() 演示了派生 GP 访问受保护集合的方案;实际环境也可对已知 extension 类型逐项检查。依赖日志的断言同步核对消息 ID、数量和 severity;不能仅凭 compare 输出安静就判断相等。

    兼容措施与范围:兼容措施不修复 GP extension 漏检;键集合与各项内容须显式比较,并保留基本字段检查。

    已知限制KI-008

    迁移后验证

    分别制造 lhs/rhs 独有 extension、缺失后一个 extension 和内容不匹配;每种不等都应检出,全部匹配才返回相等。

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

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_tlm2_generic_payload.svh:444

    VCS 内置 uvm-ieee-2020-2.0uvm_tlm2_generic_payload.svh:471

    标准依据:无(2.0 标注 @uvm-contrib,待贡献至 1800.2)

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

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

    src/vcs-uvm-1.2/tlm2/uvm_tlm2_generic_payload.svh
      // Function- do_compare
      //
      function bit do_compare(uvm_object rhs, uvm_comparer comparer);
        uvm_tlm_generic_payload gp;
        do_compare = super.do_compare(rhs, comparer);
        $cast(gp, rhs);
    
        do_compare = (m_address == gp.m_address &&
                      m_command == gp.m_command &&
                      m_length  == gp.m_length  &&
                      m_dmi     == gp.m_dmi &&
                      m_byte_enable_length == gp.m_byte_enable_length  &&
                      m_response_status    == gp.m_response_status &&
                      m_streaming_width    == gp.m_streaming_width );
    
        if (do_compare && m_length == gp.m_length) begin
            byte unsigned lhs_be, rhs_be;
            for (int i=0; do_compare && i < m_length && i < m_data.size(); i++) begin
    

    完整源码 · SHA256:a9d6f673e4c9fcf993fbb28fb24a1ecbb5912784966a3048b94c77fede11c6cf

    src/vcs-uvm-ieee-2020-2.0/tlm2/uvm_tlm2_generic_payload.svh
      //
      // @uvm-contrib This API is being considered for potential contribution to 1800.2
    
      function bit do_compare(uvm_object rhs, uvm_comparer comparer);
        uvm_tlm_generic_payload gp;
        do_compare = super.do_compare(rhs, comparer);
        $cast(gp, rhs);
    
        `m_uvm_tlm_fast_compare_int(m_address, UVM_HEX)
        `m_uvm_tlm_fast_compare_enum(m_command, uvm_tlm_command_e)
        `m_uvm_tlm_fast_compare_int(m_length, UVM_UNSIGNED)
        `m_uvm_tlm_fast_compare_int(m_dmi, UVM_BIN)
        `m_uvm_tlm_fast_compare_int(m_byte_enable_length, UVM_UNSIGNED)
        `m_uvm_tlm_fast_compare_enum(m_response_status, uvm_tlm_response_status_e)
        `m_uvm_tlm_fast_compare_int(m_streaming_width, UVM_UNSIGNED)
    
        if ( (!comparer.get_threshold() || (comparer.get_result() < comparer.get_threshold())) &&
         m_byte_enable_length == gp.m_byte_enable_length ) begin
    

    完整源码 · SHA256:fe1a030902614234ed93702a137118fabfd1716a1c818177d7aa2bd56b5c87f5

    术语解释 · 兼容配置

    返回TLM · 迁移清单

    版本适用范围