(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,用于地址映射以及完成寄存器前门访问操作...
(2) 在使用get_root_blocks函数得到reg_block的指针后,使用cast将其转化为目标reg_block形式; externstaticfunctionvoidget_root_blocks(refuvm_reg_block blks[$]); functionvoiduvm_reg_block::get_root_blocks(refuvm_reg_block blks[$]);foreach(m_roots[blk]) begin blks.push_back(blk); end endfunc...
一个uvm_reg_block中一定要对应一个uvm_reg_map,系统已经有一个声明好的default_map,只需要在build中通过调用uvm_reg_block的create_map来将其实例化,create_map有众多的参数,其中第一个参数是名字,第二个参数是基地址,第三个参数则是系统总线的宽度,这里的单位是byte而不是bit,第四个参数是大小端,最后一个...
通常会用两层寄存器块来组织寄存器模型,在第一级uvm_reg_block中加入寄存器,而第二级的uvm_reg_block通常只添加uvm_reg_block,这样从整体上呈现比较清晰的结构。 在使用这种层次化的寄存器结构时,需要做的是定义好子reg_block之后,在父reg_block中实例化,并调用configure(),build()等进行初始化设置,最后将子reg_...
uvm_reg:包含成员变量m_fields,加入各个uvm_reg_field。 uvm_reg_block:uvm_reg的集合,uvm_reg需要加入到uvm_reg_map中,且属于同一个uvm_reg_block。每个uvm_reg_block至少包含一个uvm_reg_map。uvm_reg_block中也可以再添加子uvm_reg_block,同时子uvm_reg_block的uvm_reg_map也需要添加到父uvm_reg_block...
例码中通过 uvm_reg_ block: :add_ hdl _path()将寄存器模型关联到了 DUT一端,而通过uvm _reg: :add_ hdl _path_ slice 完成了将寄存器模型各个寄存器成员与 HDL一侧地址的映射。例如,稍后对寄存器 SLVO_RW_REG 进行后门访问时, UVM DPI 函数通过寄存器 HDL 路径 "reg_backdoor_access.dut.regs[0]" ...
在同一类族中,UVM还提供了uvm_mem类,用于对连续地址存储空间的建模。uvm_mem对象也可以被集成到uvm_reg_block中,并通过uvm_reg_map做地址映射, 此外,UVM还提供了uvm_reg_file类。这个类更像是一个对象容器,可以用来装载多个寄存器(uvm_reg)和其他uvm_reg_file,以便对相同规格的寄存器进行多次例化。
1.uvm_reg_field:寄存器模型中的最小单位。 2.uvm_reg:比uvm_reg_field 高一个级别,但依然是比较小的单位。一个寄存器中至少包含一个uvm_reg_field。 3.uvm_reg_block:比较大的单位,可以加入许多uvm_reg,也可以加入其它的uvm_reg_block。一个寄存器模型中至少包含一个uvm_reg_block。
default_map是uvm_reg_block中的成员,是系统已经默认声明好的default_map,所以寄存器组类定义中不用再创建新的uvm_reg_map成员了,只需要在build中将其例化。 lock_model(): 一般在寄存器block定义完之后,要进行锁定,reg_model中就不能再添加新的寄存器了。
第一个是此寄存器所在uvm_reg_block 的指针,这里是this。 第二个是reg_file的指针。 第三个是此寄存器后门路径。 4)需要受到build,将invert中的field 例化。 5)将此寄存器加入default_map中。uvm_reg_map 作用是存储所有寄存器地址,因此必须加入,否则无法前门操作。