(1) 一个寄存器模型必须包含一个reg_block;一般DUT内具有相同的基地址的所有寄存器,会放在一个reg_block中. (2) uvm_reg_block可以包含任意数量的uvm_reg, register files, memories以及其他低层次的uvm_reg_block; (3) uvm_reg block里含有uvm_reg_map类对象default_map,用于地址映射以及完成寄存器前门访问操作...
这是可以理解的,因为子block的default_map只能处理偏移地址,而只有加入了父block的reg_map中才能获取基地址,组成完整地址。因此一般将具有同一基地址的寄存器作为整体加入一个uvm_reg_block中,而不同的基地址对应于不同的uvm_reg_block。 除了已经引入的uvm_reg_field,uvm_reg,uvm_reg_block的概念,UVM的寄存器模型...
我们在创建uvm_reg_map的时候(如果只有一个uvm_reg_map我们一般会用uvm_reg_block自带的default_map)默认会将m_auto_predict设为0。 由于m_auto_predict是被local修饰的本地变量,因而不能在uvm_reg_map类外部访问,可以使用get_predict_map获取当前predict类型 m_auto_predict = 1 首先我们看下当我们执行寄存器...
uvm_reg_block里包含uvm_reg,一般一个最底层模块级的DUT的所有寄存器,具有相同的基地址,会放在一个reg_block中。uvm_reg_block内也可包含其他低层次的reg_block。 reg_block里有含有uvm_reg_map类的对象default_map,进行地址映射,以及用来完成寄存器前后门访问操作。 一个寄存器模型必须包含一个reg_block。 一个r...
层次化的寄存器结构通过uvm_reg_block创建,通常用两层结构组织,第一层包含uvm_reg,第二层用于组织子块。在配置和初始化时,需在父reg_block中实例化并调用configure和build方法,同时将子reg_block的default_map添加到父block的default_map中,以确保地址完整。UVM的寄存器模型中,uvm_reg_file用于区分...
第一个所在reg_block 的指针。 第二个此块存储器的hdl 路径。 3)加入default_map,可以进行前门操作。 4)如果没有对存储器分配地址空间,可以不加入default_map。只能后门访问。 4.要进行读写通过read,write,peek,poke。这4个在调用的时候需要额外一个offset 参数,说明读取哪个地址: ...
uvm_reg中的主要变量有,m_locked,由顶层的reg_block调用 m_parent,指向的uvm_reg_block; m_is_busy,当该reg正在执行frontdoor的读写操作时,该信号置 1,避免此时做predict。 m_backdoor,外部设置进去的backdoor的方法。 m_maps[uvm_reg_map],该reg挂载在的map的对象,在default_map,add_reg时,指定。
default_map是uvm_reg_block中的成员,是系统已经默认声明好的default_map,所以寄存器组类定义中不用再创建新的uvm_reg_map成员了,只需要在build中将其例化。 lock_model(): 一般在寄存器block定义完之后,要进行锁定,reg_model中就不能再添加新的寄存器了。
1.2.3. uvm_reg_map 关于uvm_reg_map的创建,方法也很多,第一种,在例化uvm_reg_block的component中也例化uvm_reg_map,然后调用其configure函数,配置base address,大小端,关联的uvm_reg_block等。这里介绍另一种方法,uvm_reg_block自带了一个create_map函数,我们直接调用该函数,假设我们在uvm_test中定义了reg_bl...
`uvm_object_utils(reg_model) function new(input string name="reg_model"); super.new(name, UVM_NO_COVERAGE); endfunction endclass 每一个由uvm_reg_block派生的类也要定义一个build函数。一般在此函数中实现所有寄存器的实例化。 系统已经有一个声明好的default_map,只需要在build中将其实例化,这个过程...