热度 10| |||
1. UVM REG Model
UVM REG Model部分包含了REG模型与MEM模型,REG模型主要包含uvm_reg_block,uvm_reg_reg,uvm_reg_field以及包含一些path和地址信息的uvm_reg_map。
思路:简介各个reg相关的class,然后具体描述一下每个class,然后再举一些examples
1.1. 概述
1.1.1. uvm_reg_field
uvm_reg_field就像是一个功能模块中寄存器定义里面的域,例如一个32位的中断寄存器,其中可能包含有多种中断类型,一位就是一种中断。当然某些寄存器也会存在多个bit代表某种功能,这种某个寄存器内的某一个或者几个功能在UVM中就用uvm_reg_field类来表示。
所以一个典型的uvm_reg可能包含如下:
(代码)
1.1.2. uvm_reg
顾名思义uvm_reg类就相当于一个功能模块中的寄存器 TBD
1.1.3. uvm_reg_block
这个类相当于一个特定模块中所有寄存器的容器,用来包含和划分某个特定范围的uvm_reg。同时一个reg block除了可以包含多个reg之外,还能够包含其他的reg block。
1.1.4. uvm_reg_map
reg map类用于保存其所关联的寄存器地址,以及adapter, sequencer等信息。
1.1.5. 典型应用
这一节介绍一下一个经典的寄存器读写,以及predict,执行了哪些步骤,让读者有一个大概的流程概念,但不深入细节。
1.1.5.1. reg.write
首先对于寄存器的写,必须要提供一个value,以及准备一个uvm_status_e用来接收返回的状态,即操作成功与否, 当然write本身还提供了很多带默认值的参数,通常情况不强制用户给这些参数。
在我们调用寄存器的write之后,会将write中的参数信息都打包成类中的成员变量,然后调用do_write,并将该类传递给do_write。然后do_write会先做一些预操作,例如调用各个field的pre_write,以及callback函数中的pre_write(如果存在的话),然后再调用当前reg中的pre_write,和reg中的callback的pre_write。这些在一般操作中都不太需要,这里先不展开。
接下来,write将根据path为backdoor还是frontdoor执行不同的操作。典型应用中将只介绍frontdoor的操作,后续的章节会对各部分展开介绍。
frontdoor操作分为两种,第一种如果对reg和相应的map做了映射操作,并且在调用write时制定sequence,那么可以直接启动frontdoor sequence,然后执行sequence_item->driver->interface的操作,不过据我所知,更常用的方法是通过配置reg_adapter形式来实现,即frontdoor的另一种实现方式:调用相关联的reg_map的do_write操作。
reg_map中的do_write本身包含了支持field write,reg write等一系列的写,这里只介绍reg引起的write流程,在do_write中会调用根据会调用adapter的reg2bus函数,就是我们在adapter中定义的将reg item信息转化为我们需要的sequence item信息(严格来讲是do_write调用的一系列函数中会去调用reg2bus,具体较为复杂,在后续章节会陆续描述)。在经过reg2bus对sequence item进行转换后,就会像执行不同的sequence 一样将该sequence item分配给我们指定好的sequencer中,由相关driver驱动并且送到interface,最后作为一个寄存器写请求发送给DUT。