[UVM源代码研究] 聊聊寄存器模型中的期望值(desired value)、镜像值(mirrored value)以及DUT中的实际值(actual value)的相关概念及方法
讨论寄存器模型中涉及到各种值以及对应的方法,我们还是要从其中的最小存储单元uvm_reg_field开始讲起
uvm_reg_field
我们先看看uvm_reg_field的定义

我们可以看到这里涉及到了4个值类型:
-
value:唯一一个没有被local修饰的值类型,即寄存器模型可以直接访问,也是唯一一个用rand修饰的字段,即对寄存器模型里的寄存器进行随机时value用来存储随机后的随机值(关于这个随机值的值内容有什么特点我们后面会具体讲),并且这个值也是我们对寄存器模型收集覆盖率所sample的值。
-
m_mirrored(镜像值):存放我们认为此时DUT里寄存器的实际值。
-
m_desired(期望值):存放我们期望DUT寄存器被赋予的值。
-
m_reset[“HARD”](复位值):存放硬复位值。m_reset其实是一个以字符串为索引(key)以uvm_reg_data_t为值(value)的联合数组类型,除了默认的key="HARD"类型的硬复位值,我们还可以添加我们自定义的复位类型对。
上面这4种值类型,除了value都是用local修饰的,即除了uvm_reg_field本身和它的子类,其他外部类都无法直接访问,所以自然就需要提供一些访问(写和读)它们的函数。
首先我们看下我们创建uvm_reg_fiedl都会调用的configure()函数具体都执行了什么


这里需要注意的几点就是,当在uvm_reg中调用某个uvm_reg_field的configure()函数时:
-
has_reset参数决定了m_reset[“HARD”]是否被赋值,赋值内容为reset参数所给的值
-
access和is_rand共同决定了在执行randomize的时候value值是否会被随机。
set_reset()

这里我们涉及到了第一个修改uvm_reg_field里复位值的函数set_reset(),我们可以通过调用set_reset()函数实现对m_reset[string]关联数组的赋值,这样便可以覆盖我们在调用寄存器模型初始化configure的硬复位值,全局修改m_reset[“HARD”]值,当然也可以自定义添加其他复位值类型。
reset()

这是与复位相关的另一个函数,它实现了将uvm_reg_field中m_mirred、m_desired、value都赋值成我们预先设置的reset值(reset值即可以是默认的key=“HARD”,也可以是我们预先定义的key对应的reset值),同时将m_written变量赋值为0表示该uvm_reg_field没有被写过,纵观整个uvm_reg_field类的定义,只有在do_predict()函数里才有涉及到将m_written赋值为1的情况,后面我们再具体介绍do_predict()函数,这里先埋个伏笔。
set_reset()和reset()是用来修改reset值,而获取reset值包含如下两个函数
<

本文详细介绍了UVM寄存器模型中期望值、镜像值和实际值的概念,以及uvm_reg_field中的关键方法如randomize、set、get、mirror、update等的工作原理。此外,还探讨了uvm_reg中与寄存器操作相关的功能,如write、read、predict等。
最低0.47元/天 解锁文章
1358

被折叠的 条评论
为什么被折叠?



