uvm_reg_map——寄存器模型(八)

所有的寄存器都需要地址,都需要加入到地址列表中

 

//------------------------------------------------------------------------------
//
// Class: uvm_reg_map
//
// :Address map abstraction class
//
// This class represents an address map.
// An address map is a collection of registers and memories
// accessible via a specific physical interface.
// Address maps can be composed into higher-level address maps.
//
// Address maps are created using the <uvm_reg_block::create_map()>
// method.
//------------------------------------------------------------------------------

class uvm_reg_map extends uvm_object;

   `uvm_object_utils(uvm_reg_map)
   
   // info that is valid only if top-level map
   local uvm_reg_addr_t     m_base_addr;
   local int unsigned       m_n_bytes;
   local uvm_endianness_e   m_endian;
   local bit                m_byte_addressing;
   local uvm_object_wrapper m_sequence_wrapper;
   local uvm_reg_adapter    m_adapter;
   local uvm_sequencer_base m_sequencer;
   local bit                m_auto_predict;
   local bit                m_check_on_read;

   local uvm_reg_block      m_parent;

   local int unsigned       m_system_n_bytes;

   local uvm_reg_map        m_parent_map;
   local uvm_reg_addr_t     m_parent_maps[uvm_reg_map];   // value=offset of this map at parent level
   local uvm_reg_addr_t     m_submaps[uvm_reg_map];       // value=offset of submap at this level
   local string             m_submap_rights[uvm_reg_map]; // value=rights of submap at this level

   local uvm_reg_map_info   m_regs_info[uvm_reg];
   local uvm_reg_map_info   m_mems_info[uvm_mem];

   local uvm_reg            m_regs_by_offset[uvm_reg_addr_t];
                            // Use only in addition to above if a RO and a WO
                            // register share the same address.
   local uvm_reg            m_regs_by_offset_wo[uvm_reg_addr_t]; 
   local uvm_mem            m_mems_by_offset[uvm_reg_map_addr_range];

   local uvm_reg_transaction_order_policy policy;

   extern /*local*/ function void Xinit_address_mapX();

   static local uvm_reg_map   m_backdoor;

   // Function: backdoor
   // Return the backdoor pseudo-map singleton
   //
   // This pseudo-map is used to specify or configure the backdoor
   // instead of a real address map.
   //
   static function uvm_reg_map backdoor();
      if (m_backdoor == null)
        m_backdoor = new("Backdoor");
      return m_backdoor;
   endfunction

 

转载于:https://www.cnblogs.com/dpc525/p/8025257.html

好的,这是一个关于UVM寄存器模型的问题。您需要创建一个包含test_set和reserved字段的寄存器模型,并将其添加到uvm_reg_block中。test_set字段的存取方式为RW,reserved字段的存取方式为RO。然后,您需要使用uvm_reg_map寄存器模型映射到物理地址,并使用configure()方法配置寄存器模型的默认值和访问权限。 以下是一个示例代码,用于创建一个包含test_set和reserved字段的寄存器模型,并将其添加到uvm_reg_block中: ```systemverilog class my_reg_block extends uvm_reg_block; my_reg_model my_reg; uvm_reg_map reg_map; // Constructor function new(string name = "my_reg_block", uvm_component parent=null); super.new(name, parent); // Create register model my_reg = my_reg_model::type_id::create("my_reg"); // Add fields to register model my_reg.test_set = uvm_reg_field_rw #(.size(4))::type_id::create("test_set", 0, my_reg, null); my_reg.reserved = uvm_reg_field_ro #(.size(28))::type_id::create("reserved", 4, my_reg, null); // Add register model to block add_reg(my_reg, 0); // Create register map reg_map = uvm_reg_map::type_id::create("reg_map", null, UVM_LITTLE_ENDIAN); // Add register to map reg_map.add_reg(my_reg, 0); // Set default value and access policy my_reg.set_access("RW", "test_set"); my_reg.set_access("RO", "reserved"); my_reg.set_default(32'h00000000); // Add map to block add_map(reg_map); endfunction endclass ``` 在上述代码中,my_reg_block类继承自uvm_reg_block类,并包含一个my_reg_model类型的寄存器模型my_reg,以及一个uvm_reg_map类型的寄存器映射reg_map。在构造函数中,首先使用my_reg_model::type_id::create()方法创建my_reg寄存器模型,并使用uvm_reg_field_rw和uvm_reg_field_ro类创建寄存器字段test_set和reserved,并将它们添加到my_reg寄存器模型中。 然后,使用add_reg()方法将my_reg寄存器模型添加到my_reg_block中。接下来,使用uvm_reg_map::type_id::create()方法创建寄存器映射reg_map,并使用reg_map.add_reg()方法将my_reg寄存器模型添加到reg_map中。 接下来,使用my_reg.set_access()方法设置寄存器模型字段的访问权限,使用my_reg.set_default()方法设置寄存器模型的默认值。 最后,使用add_map()方法将reg_map寄存器映射添加到my_reg_block中。这样,就可以将my_reg寄存器模型映射到物理地址,并对它们进行读写操作。 希望这个示例代码可以帮助您创建一个包含test_set和reserved字段的寄存器模型,并将其添加到uvm_reg_block中,并使用uvm_reg_map和configure()方法配置寄存器模型的默认值和访问权限。如果您还有其他问题,可以继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值