跳转至

输入查询内容

    本页内容

    uvm_reg_address_config 与 get_registers_filtered_by_address 移除(UVM_REG_ENABLE_ADDRESS_EXCLUSION 扩展终止)

    影响范围

    启用地址排除扩展,或内建寄存器测试依赖地址区间过滤。

    具体差异

    同为 VCS 1.2 私有扩展(Accellera 无),默认关闭;用于按地址区间在内建 seq 中排除寄存器。2.0 无任何替代,需改用 NO_REG_TESTS 等标准 resource 机制。

    修改方案

    若定义了 UVM_REG_ENABLE_ADDRESS_EXCLUSION,改用 resource 排除机制。

    先按原模型所选 map 的地址区间,得到明确的排除寄存器集合。resource 机制按对象全名生效,没有地址范围配置类的一对一替换;多 map、别名地址与跨区间寄存器必须保留原筛选意图。

    在内建测试启动前,对确定要排除的 rg 设置资源:

    uvm_resource_db#(bit)::set(
      {"REG::", rg.get_full_name()}, "NO_REG_TESTS", 1, this);
    

    仅排除硬件复位测试时,将资源名改为 NO_REG_HW_RESET_TEST;其他专用测试按其读取的资源名设置,避免过度排除。这里的 this 位于 sequence/component 中,不能将地址字符串当作资源 scope。

    完成映射后,移除 UVM_REG_ENABLE_ADDRESS_EXCLUSIONuvm_reg_address_config 及其范围管理调用。记录内建 sequence 实际访问的寄存器集合,同时检查应排除项与应保留项。

    兼容措施与范围:兼容措施不恢复地址区间排除扩展;用实际寄存器集合配置对应测试资源。

    迁移后验证

    把原区间转换为明确的寄存器排除集合,记录内建 sequence 实际访问地址;应排除项不访问,其他项仍被覆盖。

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

    补充查阅

    扫描定位与记录结果

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

    • D4 · 文本匹配:UVM_REG_ENABLE_ADDRESS_EXCLUSION / uvm_reg_address_config(VCS 私有扩展删除)。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules D4
    

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_reg_block.svh:346(ifdef 声明)、uvm_reg_block.svh:1242class uvm_reg_address_config,含 add_address_include_range/add_address_exclude_range/clear_address_range)、uvm_reg_block.svh:1317get_registers_filtered_by_address 实现)

    VCS 内置 uvm-ieee-2020-2.0:无(整特性含 `ifdef 全部移除,内建 seq 中的对应 ifdef 分支同步删除)

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

    src/vcs-uvm-1.2/reg/uvm_reg_block.svh
       //Function: get_registers_filtered_by_address
       //
       //get the registers filtered on the basis of address range specified by user   
    `ifdef UVM_REG_ENABLE_ADDRESS_EXCLUSION   
       extern virtual function void get_registers_filtered_by_address (ref uvm_reg regs[$],
                                                          input uvm_hier_e hier = UVM_HIER); 
    `endif   
       // Function: get_fields
       //
       // Get the fields
       //
       // Get the fields in the registers instantiated in this block.
       // If ~hier~ is TRUE, recursively includes the fields of the registers
       // in the sub-blocks.
       //
       extern virtual function void get_fields (ref uvm_reg_field  fields[$],
                                                input uvm_hier_e hier=UVM_HIER);
    

    src/vcs-uvm-1.2/reg/uvm_reg_block.svh
    //This config class basically sets user defined address range for inclusion and exclusion of registers
    
    `ifdef UVM_REG_ENABLE_ADDRESS_EXCLUSION
    class uvm_reg_address_config extends uvm_object;
    
    `uvm_object_utils(uvm_reg_address_config)
    
        function new(string name="uvm_reg_address_config");
            super.new(name);
        endfunction
    
    typedef struct packed {
        uvm_reg_addr_t min;
        uvm_reg_addr_t max;
    } uvm_reg_addr_range_t;
    
    uvm_reg_addr_range_t exc_range[$], inc_range[$];
    
        function bit add_address_exclude_range(uvm_reg_addr_t begin_addr,uvm_reg_addr_t end_addr);
    

    src/vcs-uvm-1.2/reg/uvm_reg_block.svh
    `ifdef UVM_REG_ENABLE_ADDRESS_EXCLUSION 
    //This basically include or exclude registers on the basis of address range defined by user
    
    function void uvm_reg_block::get_registers_filtered_by_address(ref uvm_reg regs[$],input uvm_hier_e hier = UVM_HIER);
    
    uvm_reg_addr_t block_addr;
    uvm_reg_addr_t reg_addr;
    uvm_reg temp_regs[$];
    uvm_reg_address_config cfg_obj = null;
    uvm_reg_address_config::uvm_reg_addr_range_t exc[$], inc[$];
    int delete_reg_ind[$];
    get_registers(regs, hier);
    if (uvm_config_db#(uvm_reg_address_config)::get(null, {"REG::", this.get_full_name()}, "UVM_REG_EXCLUSION_ADDRESS_RANGE", cfg_obj)) begin
        exc = cfg_obj.exc_range;
        inc = cfg_obj.inc_range;
        foreach(regs[i]) begin
            reg_addr = regs[i].get_offset();
            foreach(inc[j]) begin
            if((reg_addr < inc[j].min) || (reg_addr > inc[j].max)) begin
    

    完整源码 · SHA256:6ca6f50282876b0cf52951223df74e4f721ad7443e194ec27b1e6dd995da8d43

    术语解释 · 兼容配置

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

    版本适用范围