跳转至

输入查询内容

    本页内容

    uvm_reg_map 新增 API 组(uvm_reg_seq_base / get_physical_addresses_to_map / perform_accesses / do_bus_access / unregister / clone_and_update)

    新增功能:目标库新增的 API 和可选替代接口;已有用法的迁移要求列在用户接口与行为中。

    具体差异

    总线访问循环重构为 perform_accesses/do_bus_access;旧 get_physical_addresses 签名保留。L2 和扩展矩阵覆盖 64 位寄存器拆分、32 位 memory burst、独立响应、并发访问及失败返回。实测并非全面等价:大端数据、字段访问粒度、失败后镜像行为见 M07-020M07-022。复杂层级 map、自定义访问顺序和特殊总线协议仍需环境级验证。

    修改方案

    无。

    兼容措施与范围:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

    本条处理级别为“可选采用”,按修改方案评估;缺少扫描规则本身不增加迁移改造要求。

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

    源码与标准依据

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

    VCS 内置 UVM-1.2:无(uvm_reg_seq_base 在 1.2 全库不存在)

    VCS 内置 uvm-ieee-2020-2.0uvm_reg_map.svh:271uvm_reg_seq_base,因 1800.2 中 uvm_sequence_base 抽象化而提供的可构造基类)、uvm_reg_map.svh:763get_physical_addresses_to_map)、uvm_reg_map.svh:773perform_accesses)、uvm_reg_map.svh:779do_bus_access)、uvm_reg_map.svh:788unregister)、uvm_reg_map.svh:818clone_and_update

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

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh
    endclass
    
    // Extends virtual class uvm_sequence_base so that it can be constructed:
    class uvm_reg_seq_base extends uvm_sequence_base;
    
      `uvm_object_utils(uvm_reg_seq_base)
    
    
      function new(string name = "uvm_reg_seq_base");
        super.new(name);
      endfunction  
    
    endclass
    
    
    //------------------------------------------------------------------------------
    //
    // Class -- NODOCS -- uvm_reg_map
    //
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh
       * 
       * this implementation assumes a packed data access
       */ 
      extern virtual function int get_physical_addresses_to_map(uvm_reg_addr_t     base_addr,
                                                        uvm_reg_addr_t     mem_offset,
                                                        int unsigned       n_bytes,  // number of bytes
                                                        ref uvm_reg_addr_t addr[], // array of addresses 
                                                        input uvm_reg_map parent_map, // translate till parent_map is the parent of the actual map or NULL if this is a root_map
                                                        ref int unsigned byte_offset,
                                                        input uvm_mem mem =null
                                                            );
    
      // performs all bus operations ~accesses~ generated from ~rw~ via adapter ~adapter~ on sequencer ~sequencer~
      extern task perform_accesses(ref uvm_reg_bus_op    accesses[$],
                           input uvm_reg_item rw,
                           input uvm_reg_adapter adapter,
                           input  uvm_sequencer_base sequencer);
    
      // performs all necessary bus accesses defined by ~rw~ on the sequencer ~sequencer~ utilizing the adapter ~adapter~
      extern task do_bus_access (uvm_reg_item rw,
                                 uvm_sequencer_base sequencer,
                                 uvm_reg_adapter adapter);
    
      // unregisters all content from this map recursively
      // it is NOT expected that this leads to a fresh new map 
      // it rather removes all knowledge of this map from other objects 
      // so that they can be reused with a fresh map instance
      // @uvm-ieee 1800.2-2020 auto 18.2.3.11
      virtual function void unregister();
        uvm_reg_block q[$];
        uvm_reg_block::get_root_blocks(q);
    
        foreach(q[idx])
          q[idx].set_lock(0);
    
        foreach(q[idx])
          q[idx].unregister(this);
    
        foreach (m_submaps[map_])
          map_.unregister();
    
        m_submaps.delete();
        m_submap_rights.delete();
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_map.svh
        m_parent_map =null;
      endfunction
    
      virtual function uvm_reg_map clone_and_update(string rights);
        if(m_parent_map!=null) `uvm_error("UVM/REG/CLONEMAPWITHPARENT","cannot clone a map which already has a parent")
        if(m_submaps.size() != 0) `uvm_error("UVM/REG/CLONEMAPWITHCHILDREN","cannot clone a map which already has children")
    
        begin
          uvm_reg_map m;
          uvm_reg_block b = get_parent();
          uvm_reg qr[$];
          uvm_mem qm[$];
    
          m = b.create_map(get_name(),0,m_n_bytes,m_endian,m_byte_addressing);
    
          foreach(m_regs_by_offset[i]) begin
        uvm_reg rg=m_regs_by_offset[i];
        uvm_reg_map_info info = get_reg_map_info(rg);
        m.add_reg(rg,info.offset,rights, info.unmapped, info.frontdoor);
    

    完整源码 · SHA256:b9ea15a750893808abd619fd203ed3f6ea8762e38af01dac0bc47a1646013d26

    术语解释 · 兼容配置

    大端 map 的整宽反转可能破坏数据(M07-020) · 失败访问不再更新寄存器镜像(M07-022)

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

    版本适用范围