1.为7.1.1的DUT建立寄存器模型。只有一个寄存器invert。首先从uvm_reg 派生一个invert 类:

UVM:7.2.1 只有一个寄存器的寄存器模型_寻址

1)new函数中,invert 的宽度作为参数传给super.new。不是有效宽度,而是这个寄存器总共的位数。

2)另一个参数是是否加入覆盖率的支持。这个不支持。

3)派生自uvm_reg的类都有一个build 函数。和build_phase不同,他不会自动执行,需要手工调用。都是在这里例化,之后调用data.configure配置。意义如下:

UVM:7.2.1 只有一个寄存器的寄存器模型_字段_02

4)第四个参数表示此字段的存取方式。UVM提供如下25种:

UVM:7.2.1 只有一个寄存器的寄存器模型_字段_03


2.第一好寄存器后,需要在由reg_block 派生的类中将其例化:

UVM:7.2.1 只有一个寄存器的寄存器模型_寻址_04

1)每个由uvm_reg_block 派生的类也要定义一个build 函数,在其中实现所有寄存器的例化。

2)一个uvm_reg_block 对应一个uvm_reg_map,default_map系统已经声明,只需在build中例化,调用create_map。

第一个参数是名字。

第二个参数是基地址。

第三个是系统总线宽度,单位是byte。

第四个是大小端。

第五个是是否按照byte寻址。

3)例化invert 并调用invert.configure。指定后门访问时的路径。

第一个是此寄存器所在uvm_reg_block 的指针,这里是this。

第二个是reg_file的指针。

第三个是此寄存器后门路径。

4)需要受到build,将invert中的field 例化。

5)将此寄存器加入default_map中。uvm_reg_map 作用是存储所有寄存器地址,因此必须加入,否则无法前门操作。

第一个是要加入的寄存器。

第二个是寄存器地址。

第三个是存取方式。