1.设计中具有不同功能字段的单个寄存器示例。
![](https://img-blog.csdnimg.cn/img_convert/a8300fc099c04f54cefe7e39519c0905.png)
2.在验证中需要为设计中的每一个寄存器都创建一个对象,该对象继承自 uvm_reg 类别,寄存器的每一个字段对应一个 uvm_reg_field 对象。
class reg_ctl extends uvm_reg;
//申明为rand类型便于随机化
rand uvm_reg_field En;
rand uvm_reg_field Mode;
rand uvm_reg_field Halt;
rand uvm_reg_field Auto;
rand uvm_reg_field Speed;
//super.new中第二个参数为寄存器的宽度这里是32,第三个参数为是否加入覆盖率的支持
function new (string name = "reg_ctl");
super.new(name,32,UVM_NO_COVERAGE);
endfunction
//每一个派生自uvm_reg的类都有一个build函数,可以在此build中 实例化、配置 uvm_reg_field
virtual function void build ();
En = uvm_reg_field :: type_id :: create ("En");
Mode = uvm_reg_field :: type_id :: create ("Mode");
Halt = uvm_reg_field :: type_id :: create ("Halt");
Auto = uvm_reg_field :: type_id :: create ("Auto");
Speed= uvm_reg_field :: type_id :: create ("Speed");
/*使用 configure 函数配置()
function void configure (
uvm_reg parent, 父类
int unsigned size, 宽度
int unsigned lsb, 最低位
string access, 存取方式,RW,RO.....
bit volatile, 是否易失,一般不使用
uvm_reg_data_t reset, 复位后的默认值
bit has_reset, 是否有复位,一般为1
bit is_rand, 是否可随机,一般为1
bit 是否可单独存取
)
*/
En.configure (this,1,0,"RW",0,1'h0,1,1,1);
Mode.configure (this,3,1,"RW",0,3'h2,1,1,1);
Halt.configure (this,1,4,"RW",0,1'h1,1,1,1);
Auto.configure (this,1,5,"RW",0,1'h0,1,1,1);
Speed.configure (this,5,11,"RW",0,5'h1c,1,1,1);
endfunction
endclass
3.定义好一个寄存器之后,需要在 reg_block 的派生的类中将其实例化。
class reg_block extends uvm_reg_block;
rand reg_ctl m_reg_ctl;
`uvm_object_utils(reg_block)
function new (string name = "reg_block");
super.new(name,UVM_NO_COVERAGE);
endfunction
//在build中经行实例化
virtual function viod build ();
//一个uvm_reg_block 中 要有一个对应的 uvm_reg_map,系统有一个已经定义好的default_map,只需要用create_map对其进行实例化
//第一个参数是名字,第二个参数是基地址,第三个参数是总线宽度单位是byte,第四个是大小端。
default_map = create_map ("default_map",0,4,UVM_BIG_ENDIAN);
//实例化reg_ctl
m_reg_ctl = reg_ctl :: type_id :: create ::("m_reg_ctl",get_full_name);
//configure函数用来指定寄存器进行 后门 访问的路径
//第一个参数:此uvm_reg_block的指针,第二个参数:reg_file的指针,第三个:后门访问路径
m_reg_ctl.configure(this,null,"");
//调用reg_ctl中的build函数
m_reg_ctl.build();
//将此寄存器加入到 uvm_reg_map 中
//uvm_reg_map 的作用用于储存寄存器的地址
//第一个:名字,第二个:寄存器的地址,第三个:存取方式
default_map.add_reg (m_reg_ctl,h'0,"RW");
endfunction
endclass