/*-------------------------------寄存器模型--------------------------------------------------------
1. 验证平台为什么要用RAL(寄存器)以及使用什么方法去测试寄存器
(1) 在设计中寄存器作为模块间交互的窗口,我们可以通过状态寄存器值去观察模块的运行状态,通过控制寄存器去修改模块的配置和功能改变。
所以在验证中需要保证寄存器的读写正确,那么就不用谈后续 DUT是否正确了,因此,寄存器的验证是排在首要位置的。
(2) 采用RAL寄存器模型去测试验证,是目前最成功的方法吧,寄存器模型独立于TB之外,我们可以搭建一个测试寄存器的agent,去通过前门或者后门访问去控制DUT的寄存器,
使得 DUT按照我们的要求去运行。除此之外,UVM中内建了很多RAL的sequence,用于帮助我们去检测寄存器。
2. 寄存器模型的介绍?
3. 寄存器模型的优点?
(1) 提高了 sequence 的复用性
对于功能验证而言,通过使用寄存器模型对总线做访问,代替了直接从总线访问寄存器。这种方式的优点在于以往由具体地址来指定寄存器的方式,将由寄存器名称来代替。
并且寄存器模型封装的一些函数可以直接对寄存器的域进行操作,测试序列更易读。如果后期寄存器的地址做修改,或者是对寄存器域修改,测试激励中不需要跟着一起修改,
提高了测试序列的复用性。
举个例子,寄存器模型中包含各个寄存器和寄存器域,我们在写测试激励是是对特定的寄存器或寄存器域的set()它们的desired value,
再通过 updata( )的方式完成对寄存器的配置,这就避免了直接从总线上发送具体地址来对整个寄存器做配置。而如果不从寄存器模型对寄存器做配置,
首先需要发送寄存器对应地址,并发送对应地址需要对寄存器各个域写入的配置。假如这时需求变了,对应寄存器的地址或者域发生变化。
如果是前者通过寄存器模型访问,只需要去寄存器模型中修改相应的configure ()和map,测试激励不用变;
而后者直接从总线访问寄存器则需要改变测试激励中的地址和需要写入寄存器的值。
(2) 提供了后门访问方式,可以节省时间
后门访问的方式可以在软件仿真时直接读取寄存器模型中的值,从而不耗时的获取寄存器的值。如果没有寄存器模型,只能通过启动sequence通过前门访问总线的方式
来读取寄存器的值。后门访问不消耗仿真时间,在大型设计验证时,在其正常工作前需要配置众多寄存器,如果采用前门访问的方式会需要很长的时间,而如果使用后门
访问方式配置会极大地缩短时间。
---------------------------------------------------------------------------------------------------*/
/*-----------------------------------------寄存器模型新添加的类、方法--------------------------------------
注意:因为寄存器模型相关的类都是uvm_object类,因此没有phase机制来调动不同任务的执行,因此需要在不同的层次手动进行调用。
例如在配置寄存器时,在顶层的寄存器模型中调用uvm_reg的build函数,而uvm_reg的build函数会进一步调用uvm_reg_field的configure函数,从而实现配置
1. uvm_reg_field(uvm_object 类)
(0) 声明:在更高层次的寄存器中声明uvm_reg_field类型的寄存器域
(1) 创建:使用工厂机制创建
(2) 配置:自带的方法 field.configure()
pkt_len.configure(this, 3, 3, "RW", 0, 3'h0, 1, 1, 0);
第一个参数就是此域(uvm_reg_field)的父辈,也即此域位于哪个寄存器中
第二个参数是此域的宽度
第三个参数是此域的最低位在整个寄存器中的位置,从3开始计数。
第四个参数表示此字段的存器方式。UVM共支持25种存取方式:这里只列举常用的几种:
WO(write-only,只写);
RO:(read-only,只读);
RW(read and write,读写);
RC(clean-on-read,擦除模式);写入时无影响,读取时会清零
…
第五个参数表示是否是易失的(volatile),这个参数一般不会使用。
第六个参数表示此域上电复位后的默认值。
第七个参数表示此域是否有复位,一般的寄存器或者寄存器的域都有上电复位值,因此这里一般也填写1。
第八个参数表示这个域是否可以随机化。这主要用于对寄存器进行随机写测试,如果选择了0,那么此域将不会随机化,而一直是复位值,
否则将会随机出一个数值来。这个参数仅当第四个参数为RW、WRC、WRS、WO、W1、WO1时才有效。