跳转至

输入查询内容

    本页内容

    失败访问不再更新寄存器镜像,新增 PREDICT_NOK 提示

    影响范围

    访问失败后依赖 mirror 更新,或遇到 PREDICT_NOK。

    具体差异

    2.0 do_predict 仅在 rw.status 为 UVM_IS_OK 时更新字段,否则提示 PREDICT_NOK。自动预测开启且总线拒绝写操作的实测中,1.2 镜像仍更新为请求的全 1,2.0 保留上次成功值,两版 API 都返回 UVM_NOT_OK。

    修改方案

    失败处理和 scoreboard 必须检查 status;不要继续依赖 1.2 失败后被更新的镜像。该提示不是要求无条件重新 predict,恢复值应由成功重试或可靠观测确定。

    兼容措施与范围:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。

    迁移后验证

    先成功写入,再注入总线失败;检查 status 为 NOT_OK、镜像保持上次可靠值,恢复策略必须依据成功访问或可信观测。

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

    已有实测与复现

    补充查阅

    扫描定位与记录结果

    无对应规则。当前脚本没有针对本条的直接检测规则。

    按“影响范围”检视实际代码与配置,再执行本条验证方法;扫描零命中不能排除此项。

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

    源码与标准依据

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

    证据tests/uvm_review/reg_access_probe.sv 的 failed_write_status / failed_write_mirror。

    VCS 内置 UVM-1.2uvm_reg.svh:2008(do_predict)

    VCS 内置 uvm-ieee-2020-2.0uvm_reg.svh:1525–1553

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

    src/vcs-uvm-1.2/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.value[0];
       m_fname = rw.fname;
       m_lineno = rw.lineno;
    
       if(rw.status != UVM_HAS_X) rw.status = UVM_IS_OK;
    
       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.status = UVM_NOT_OK;
          return;
       end
    

    完整源码 · SHA256:a01d27ace4190cce87f4bf8f78d0db63b1517ffb43a412e187e67391984971b6

    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
    
         foreach (m_fields[i]) begin
            rw.set_value((reg_value >> m_fields[i].get_lsb_pos()) &
                                       ((1 << m_fields[i].get_n_bits())-1));
            m_fields[i].do_predict(rw, kind, be>>(m_fields[i].get_lsb_pos()/8));
         end
    
         rw.set_value(reg_value, 0);
       end
       else begin
         `uvm_warning("PREDICT_NOK", "status UVM_NOT_OK; skip prediction.");
       end
       rw.set_value(reg_value, 0);
    

    完整源码 · SHA256:a0b3ba54fe8e7a696018aa531a0e93c98cfdc89c74073dfcf7eed58b9833618e

    术语解释 · 兼容配置

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

    版本适用范围