以最基础的reg_field为例,来讲解寄存器模型的内部定义与复位
reg_field定义:
重点关注四个变量:
value:唯一一个没有被local修饰的值类型,即寄存器模型可以直接访问,也是唯一一个用rand修饰的字段,用于对寄存器模型里的reg进行randomize后存储随机值,同时也是我们对寄存器模型收集覆盖率所sample的值,value与m_desired关系密切。(之所以除了m_mirrored和m_desired外还要定义一个value,是因为m_mirrored和m_desired都是local属性,外部无法访问,所以先随机value的值,再将其赋值给m_desired)
m_mirrored(镜像值):存放我们认为此时DUT里寄存器的实际值。
m_desired(期望值):存放我们期望DUT寄存器被赋予的值。
m_reset[“HARD”](复位值):存放硬复位值。m_reset其实是一个以字符串为索引(key)以uvm_reg_data_t为值(value)的联合数组类型,除了默认的key="HARD"类型的硬复位值,我们还可以添加我们自定义的复位类型对。
这四个变量的类型都是uvm_reg_data_t,后缀_t表示这是一个typedef,
表示一个bit unsigned [63:0],即这四个变量都是一个64位的无符号bit变量
reg_field配置
注意,当在uvm_reg中调用某个uvm_reg_field的configure()函数时:
1.has_reset参数决定了m_reset[“HARD”]是否被赋值,赋值内容为reset参数所给的值
即如果has_reset=1,则reset参数的值将被视为“HARD”复位值,即m_reset[“HARD”]=reset。如果has_reset值为0,则reset参数将被忽略。
2.access和is_rand共同决定了在执行randomize的时候value值是否会被随机。若is_rand=0,则value的rand_mode将被置0关闭,rand_mode=0代表禁止变量随机化,相当于value声明时没有添加rand修饰
复位函数详解
set_reset()
调用修改uvm_reg_field里复位值的函数set_reset(),实现对m_reset[string]关联数组的赋值由此可以覆盖寄存器模型初始化时configure的硬复位值,即修改m_reset[“HARD”]值。此外也可以自定义添加其他复位值类型
通俗讲就是
set_reset(1'h0):即m_reset[“HARD”]=1'h0,修改HARD索引对应的值
set_reset(1'h0,“my_self_cmd”):即m_reset[“my_self_cmd”]=1'h0,在m_reset新建一对自定义的复位值和索引名
注:set_reset()设置的是软件寄存器模型的复位值,而非硬件DUT的寄存器
图解:config和set_reset都可以修改m_reset[“HARD”]
reset()
将uvm_reg_field中m_mirred、m_desired、value都赋值成我们预先设置的reset值(reset值即可以是默认的key=“HARD”,也可以是我们预先定义的key对应的reset值),同时将m_written变量赋值为0表示该uvm_reg_field没有被写过
图解:
reset()与set_reset()的关系:set_reset()只设定复位值而不执行,reset()执行复位
has_reset()
判断对应reset类型(kind参数)是否有reset值
get_reset()
获取某种reset类型(kind参数)的reset值,如果不存在该reset类型,则返回m_desired(期望值)
get_reset()检索m_reset [kind]属性的值,此外还有两个get访问本地属性。 get_mirrored_value()方法检索m_mirrored属性的值;get()检索m_desired
图解: