跳转至

输入查询内容

    本页内容

    uvm_mem::get_addresses 增加越界检查

    影响范围

    向 memory get_addresses 传入越界索引,或依赖异常地址返回。

    具体差异

    旧行为:offset 越界时继续走 map 查询,结果未定义;新行为:发出 uvm_warning 并返回 -1

    修改方案

    正常范围内的 get_addresses 调用可保留;调用前检查 offset < mem.get_size(),超出模型范围时在用户逻辑中报告并停止该访问。删除依赖越界地址返回值的后续总线操作,分别验证最后一个合法 offset 与第一个越界 offset。

    兼容措施与范围:合法 offset 的调用可保留;兼容措施不恢复越界访问,调用方须阻止无效地址进入总线。

    迁移后验证

    测试边界内最后一项与越界项,检查诊断及是否阻止错误总线访问。

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

    补充查阅

    扫描定位与记录结果

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

    • S39 · 启发式:memory 地址查询的越界路径。 排除已识别的 reg/vreg 地址查询;memory 或未知类型的调用仍需核对 offset 范围。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S39
    

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

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

    源码与标准依据

    核查方式:源码核对。未单独进行 VCS 行为实测。

    VCS 内置 UVM-1.2uvm_mem.svh:1303

    VCS 内置 uvm-ieee-2020-2.0uvm_mem.svh:897uvm_mem.svh:905 起新增 offset >= m_size 检查)

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

    src/vcs-uvm-1.2/reg/uvm_mem.svh
    // get_addresses
    
    function int uvm_mem::get_addresses(uvm_reg_addr_t offset = 0,
                                        uvm_reg_map map=null,
                                        ref uvm_reg_addr_t addr[]);
    
       uvm_reg_map_info map_info;
       uvm_reg_map system_map;
       uvm_reg_map orig_map = map;
    
       map = get_local_map(map,"get_addresses()");
    
       if (map == null)
         return 0;
    
       map_info = map.get_mem_map_info(this);
    
       if (map_info.unmapped) begin
    

    完整源码 · SHA256:17f9d299cdc8517a1e1c4d4c8b4667e6a598b843fb0cae96f9a4c641473b9302

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_mem.svh
    // get_addresses
    
    function int uvm_mem::get_addresses(uvm_reg_addr_t offset = 0,
                                        uvm_reg_map map=null,
                                        ref uvm_reg_addr_t addr[]);
    
       uvm_reg_map_info map_info;
       uvm_reg_map system_map;
       uvm_reg_map orig_map = map;
    
       if (offset >= m_size) begin
         `uvm_warning("RegModel", $sformatf("Offset '%0x' lies outside of memory '%s', which has a size of %0x",
                                            offset,
                                            get_name(),
                                            m_size))
         return -1;
       end
    
       map = get_local_map(map);
    
       if (map == null) begin
         `uvm_warning("RegModel", $sformatf("Memory '%s' not found in map '%s'",
                                            get_name(),
                                            (orig_map == null) ? "<null>" : orig_map.get_full_name()))
         return -1;
       end
    

    完整源码 · SHA256:e9ae7cb0d6ec028458cd7d5475508ab54d539dee4f4842a58451439b7908b6bd

    术语解释 · 兼容配置

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

    版本适用范围