跳转至

输入查询内容

    本页内容

    predictor 仅继承首拍 status,后续拍失败仍可能更新镜像(S24)

    已复现的目标库问题

    目标库后续拍失败仍预测的问题已复现;普通 RW 串行替代已验证。

    影响范围

    多拍访问且后续拍可能失败时需核对;已验证的显式预测替代限定普通 RW、串行、小端、全字节访问。

    具体差异

    目标创建 pending item 时复制首拍 status,后续拍不聚合 status。64 位寄存器经两笔 32 位总线写:首拍失败,1.2 仍更新镜像,目标保留旧值;第二拍失败,两版均更新为请求值,目标 reg_item.status 仍是 UVM_IS_OK。因此 M07-022 的失败保护不能替代总线完整事务检查。

    修改方案

    monitor/scoreboard 必须聚合完整事务的失败状态。示例在两拍全部成功时才通过公开 predict 更新镜像,两版均在任一拍失败时保留原值;该例限定普通 RW、串行、小端、全字节访问,复杂副作用字段、乱序、多 master 需按总线协议建模,不能把它视作完整 predictor 的通用替换。

    兼容措施与范围:兼容措施不修复多拍失败聚合;显式聚合预测仅覆盖所述普通 RW、串行、小端、全字节场景。

    已知限制KI-006

    迁移后验证

    分别注入首拍失败、后续拍失败和全成功;任意拍失败均不得错误更新,复杂字段副作用及乱序另按协议验证。

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

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    证据tests/uvm_review/predictor_probe.sv,默认及 +MIGRATED 两组。

    VCS 内置 UVM-1.2uvm_reg_predictor.svh:164uvm_reg_predictor.svh:211

    VCS 内置 uvm-ieee-2020-2.0uvm_reg_predictor.svh:184uvm_reg_predictor.svh:225;预测入口 uvm_reg.svh:1525

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

    src/vcs-uvm-1.2/reg/uvm_reg_predictor.svh
           uvm_reg_indirect_data ireg;
           uvm_reg ir;
    
           if (!m_pending.exists(rg)) begin
             uvm_reg_item item = new;
             predict_info =new;
             item.element_kind = UVM_REG;
             item.element      = rg;
             item.path         = UVM_PREDICT;
             item.map          = map;
             item.kind         = rw.kind;
             predict_info.reg_item = item;
             m_pending[rg] = predict_info;
           end
           predict_info = m_pending[rg];
           reg_item = predict_info.reg_item;
    
           if (predict_info.addr.exists(rw.addr)) begin
              `uvm_error("REG_PREDICT_COLLISION",{"Collision detected for register '",
    

    src/vcs-uvm-1.2/reg/uvm_reg_predictor.svh
                              reg_item.kind == UVM_READ, local_map);
                  begin
                     uvm_reg_block blk = rg.get_parent();
                     blk.XsampleX(map_info.offset,
                                  reg_item.kind == UVM_READ,
                                  local_map);
                  end
    
                  rg.do_predict(reg_item, predict_kind, rw.byte_en);
                  if(reg_item.kind == UVM_WRITE)
                    `uvm_info("REG_PREDICT", {"Observed WRITE transaction to register ",
                             ir.get_full_name(), ": value='h",
                             $sformatf("%0h",reg_item.value[0]), " : updated value = 'h", 
                             $sformatf("%0h",ir.get())},UVM_HIGH)
                  else
                    `uvm_info("REG_PREDICT", {"Observed READ transaction to register ",
                             ir.get_full_name(), ": value='h",
                             $sformatf("%0h",reg_item.value[0])},UVM_HIGH)
                  reg_ap.write(reg_item);
    

    完整源码 · SHA256:edfc951ca2d36f78c9a4c3368f07ca71136803dfcfb356a23c30a9549109749a

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_predictor.svh
             item.set_map(map);
             item.set_kind(rw.kind);
             item.set_status(rw.status);
             predict_info.reg_item = item;
             m_pending[rg] = predict_info;
           end
           predict_info = m_pending[rg];
           reg_item = predict_info.reg_item;
    
           if (predict_info.addr.exists(rw.addr)) begin
              `uvm_error("REG_PREDICT_COLLISION",{"Collision detected for register '",
                         rg.get_full_name(),"'"})
              // TODO: what to do with subsequent collisions?
              m_pending.delete(rg);
           end
    
           local_map = rg.get_local_map(map);
           map_info = local_map.get_reg_map_info(rg);
           ir=($cast(ireg, rg))?ireg.get_indirect_reg():rg;
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_predictor.svh
                  ir.XsampleX(reg_item.get_value(0), rw.byte_en,
                              (reg_item.get_kind() == UVM_READ), local_map);
                  begin
                     uvm_reg_block blk = rg.get_parent();
                     blk.XsampleX(map_info.offset,
                                  (reg_item.get_kind() == UVM_READ),
                                  local_map);
                  end
    
                  rg.do_predict(reg_item, predict_kind, rw.byte_en);
                  if(reg_item.get_kind() == UVM_WRITE)
                    `uvm_info("REG_PREDICT", {"Observed WRITE transaction to register ",
                             ir.get_full_name(), ": value='h",
                             $sformatf("%0h",reg_item.get_value(0)), " : updated value = 'h", 
                             $sformatf("%0h",ir.get())},UVM_HIGH)
                  else
                    `uvm_info("REG_PREDICT", {"Observed READ transaction to register ",
                             ir.get_full_name(), ": value='h",
                             $sformatf("%0h",reg_item.get_value(0))},UVM_HIGH)
    

    完整源码 · SHA256:a6e7b4d48f874febb3ba5edf30ad961c4eaa8e988e8a99b6f6bb0b374e88fece

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh
    // do_predict
    
    function void uvm_reg::do_predict(uvm_reg_item      rw,
                                      uvm_predict_e     kind = UVM_PREDICT_DIRECT,
                                      uvm_reg_byte_en_t be = -1);
    
       uvm_reg_data_t reg_value = rw.get_value(0);
       m_fname = rw.get_fname();
       m_lineno = rw.get_line();
    
       if (rw.get_status() == UVM_IS_OK ) begin
    
         if (m_is_busy && kind == UVM_PREDICT_DIRECT) begin
            `uvm_warning("RegModel", {"Trying to predict value of register '",
                        get_full_name(),"' while it is being accessed"})
            rw.set_status(UVM_NOT_OK);
            return;
         end
    

    完整源码 · SHA256:a0b3ba54fe8e7a696018aa531a0e93c98cfdc89c74073dfcf7eed58b9833618e

    术语解释 · 兼容配置

    失败访问不再更新寄存器镜像(M07-022)

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

    版本适用范围