跳转至

输入查询内容

    本页内容

    大端 map 的整宽反转可能破坏数据,单拍也受影响(S13)

    已复现的目标库问题

    目标库大端数据问题已复现,包含 32 位寄存器接 32 位总线的单拍;固定映射的 adapter 补偿已验证。

    影响范围

    使用 UVM_BIG_ENDIAN 的访问都需核对;关键是有效总线数据宽度与 uvm_reg_data_t 整宽的关系,不要求寄存器大于总线。默认 64 位 reg_data 下,32 位寄存器接 32 位总线同样受影响;多级 map、桥接与不同响应契约需单独验证。

    具体差异

    目标实现对 UVM_BIG_ENDIAN 访问的整个 uvm_reg_data_t 做 byte streaming 反转,而非只处理有效总线宽度。64 位 reg_data / 32 位总线下,原低 32 位数据被移到高位,常规 adapter 截取低 32 位后写出零;读回也被移位后掩掉。reg_access_probe 在有无独立响应时均复现,status 仍为 UVM_IS_OK,普通小端场景无此现象。补充 reg_width_probe 使用 32 位寄存器和 32 位总线,写入及读回 0x12345678 在两版分别为原值 / 零,证明单拍等宽访问也需核对。

    修改方案

    大端环境迁移前必须检查 adapter 两侧数据和总线 beat。示例 +BE_ADAPTER_COMPENSATION 在目标版本的 adapter 写入口反转回原数据,读出口预反转,以抵消目标库操作;它仅为本机固定宽度、地址映射和 response 契约验证过的处理方案,不能直接套用到任意桥接/层级 map。部署前与总线端序契约、有效位宽一并验证,也可采用经过验证的用户 frontdoor。

    兼容措施与范围:兼容措施不修复大端整宽反转;adapter 补偿仅适用于已验证的宽度、映射和响应契约。

    已知限制KI-003

    迁移后验证

    对每个 beat 检查地址、adapter 输入/输出、总线数据、status、硬件值和镜像;补偿只在已核对的宽度、映射和响应契约下使用。

    记录本条结果M07-020 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    证据tests/uvm_review/reg_access_probe.svtools/run_reg_review.pytests/uvm_review/reg_width_probe.sv 的默认与 +MIGRATED 对照验证等宽单拍及限定补偿,两版补偿后均保留 0x12345678

    VCS 内置 UVM-1.2uvm_reg_map.svh:2940(do_bus_write,以拆分访问数据调用 adapter

    VCS 内置 uvm-ieee-2020-2.0uvm_reg_map.svh:2835–2837(写前反转)、uvm_reg_map.svh:2873–2875(读后反转)

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

    src/vcs-uvm-1.2/reg/uvm_reg_map.svh
    // do_bus_write
    
    task uvm_reg_map::do_bus_write (uvm_reg_item rw,
                                    uvm_sequencer_base sequencer,
                                    uvm_reg_adapter adapter);
    
      uvm_reg_addr_t     addrs[$];
      uvm_reg_map        system_map = get_root_map();
      int unsigned       bus_width  = get_n_bytes();
      uvm_reg_byte_en_t  byte_en    = -1;
      uvm_reg_map_info   map_info;
      int                n_bits;
      int                lsb;
      int                skip;
      int unsigned       curr_byte;
      int                n_access_extra, n_access;
      int               n_bits_init;
      uvm_reg_bus_op    accesses[$];
    

    完整源码 · SHA256:a254af6fbba9757b181756f224a3969c7c3dd0a4e2cb8f9dc499de69d0e00b94

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh
          uvm_reg_map rw_map;
          uvm_status_e rw_status;
    
          if ((rw_access.kind == UVM_WRITE) && (endian == UVM_BIG_ENDIAN)) begin
            { >> { rw_access.data }} = { << byte { rw_access.data}};
          end
    
          adapter.m_set_item(rw);
          bus_req = adapter.reg2bus(rw_access);
          adapter.m_set_item(null);
    
          if (bus_req == null)
            `uvm_fatal("RegMem",{"adapter [",adapter.get_name(),"] didnt return a bus transaction"})
    
          bus_req.set_sequencer(sequencer);
          rw_parent_seq = rw.get_parent_sequence();
          rw_parent_seq.start_item(bus_req,rw.get_priority());
    
          if (rw_parent_seq != null && i == 0)
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh
            adapter.bus2reg(bus_req,rw_access);
          end
    
          if ((rw_access.kind == UVM_READ) && (endian == UVM_BIG_ENDIAN)) begin
            { >> { rw_access.data }} = { << byte { rw_access.data}};
          end
    
          rw.set_status(rw_access.status);
    
          begin
           data = rw_access.data & ((1<<get_n_bytes()*8)-1); // mask the upper bits
    
          if(rw.get_kind() inside {UVM_READ,UVM_BURST_READ})
            if (rw.get_status() == UVM_IS_OK && (^data) === 1'bx)
              rw.set_status(UVM_HAS_X);
    
            rw_access.data=data;        
          end   
    

    完整源码 · SHA256:b9ea15a750893808abd619fd203ed3f6ea8762e38af01dac0bc47a1646013d26

    术语解释 · 兼容配置

    返回RAL(寄存器模型) · 迁移清单

    版本适用范围