寄存器模型之reg model作用,结构,生成
(1)SystemVerilo | UVM | 精讲RAL寄存器模型基础 (qq.com)
(2)路科课程;
注1:在验证的过程中,寄存器的验证排在了验证清单的前列(因为其他测试都不可避免的需要涉及到寄存器的配置);
注2:环境可以通过读出寄存器的状态,获取硬件当前的状况;环境也可可以通过配置寄存器,使得硬件工作在一定模式下;
注3:寄存器模型的内容包括寄存器模型的构建(涉及到寄存器模型相关类)、寄存器模型的集成(与总线uvc桥接)与寄存器模型的使用(涉及到寄存器模型的常用方法以及预定义的sequence与寄存器的测试,还包括寄存器覆盖率);
1.寄存器与寄存器模型简介
(1) 寄存器(register)是数字系统中非常重要的部件,它常被用于数字系统的功能控制(control)和状态(status)显示。
注1:寄存器的硬件实现是触发器;
注2:寄存器一般由32个比特位构成,将单个寄存器拆分之后,又可以分为多个域,不同的域代表着某一项独立的功能;
注3:寄存器单个的域可能由多个比特位构成,也可能由单一比特位构成,这取决于该域的功能模式可配置的数量;

(2) 寄存器模型(RAL, register abstract layer)是一组高度抽象的类,用来对DUT中具有地址映射的寄存器和存储器进行建模;
(3) 寄存器模型,要能模拟任意数量的寄存器域操作、副作用以及不同寄存器间的交互作用.
2. 寄存器模型的作用(为什么对寄存器建模?)
(1)寄存器建模要做的事情就是在软件的世界里面复刻RTL中的寄存器.既然是面向软件世界做的事情,自然就是为软件所用,要么方便软件观测,要么方便软件使用。这里的软件指的是整个验证环境所构造出来的面向对象的世界。有了寄存器模型,软件世界中的参考模型(reference model)可以很方便的获取到当前RTL的功能配置和状态,我们也可以很方便的收集到对寄存器各个域段甚至位的测试覆盖情况等等。

(2)寄存器模型充当验证平台(尤其是uvm_component)与DUT之间寄存器访问操作的桥梁,简化了寄存器访问的流程. 比如,reference model里面需要读取寄存器的值,在没有寄存器模型之前,需要考虑怎么在reference model里启动一个sequence以及怎么将sequence读回的值返回给reference model.

注1:不使用ral的register sequence(只支持frontdoor);

注2:使用ral的register sequence(支持frontdoor与backdoor);

(3)寄存器模型完成启动sequence以及将读结果返回等操作;
(4)寄存器模型的本质是重新定义了验证平台与DUT的寄存器接口;
3.寄存器模型的结构(含层次化的regmodel&file)

寄存器模型就是一些类的集合,这些类模拟了DUT中的存储器、寄存器以及寄存器、存储器映射行为.这些类用于产生特定激励,进行功能检查.
3.1 normal register model

3.2 hierarchical regmodel(含regfile及sub_regmodel)






3.3 hierarchical regmodel实现方式1(含regfile及sub_regmodel, multi_reg_field)

3.4 hierarchical regmodel实现方式2(含regfile及sub_regmodel, multi_reg_field)

4. regmodel的生成
由于项目中寄存器数量多,通常使用工具产生和维护UVM寄存器模型,常见工具如下:
(1) Synopsys VCS自带的ralgen可以产生uvm寄存器模型;
(2) Paradigm works公司开源的RegWorks Spec2Reg;
5. register model的并行访问
(1) 多个并行执行的线程可同时访问register model,但是当访问同一个register时,内部会对这些访问进行串行处理;
(2) 每一个register内都有一个旗语,用于确保同一时刻只有一个线程对其进行读写操作; 如果一个线程在执行register访问操作的过程中被显式kill,有必要通过调用uvm_reg::reset()函数release该register的旗语;
6.精讲RAL寄存器模型基础
寄存器(register)是数字系统中非常重要的部件,它常被用于数字系统的功能控制(control)和状态(status)显示。
RAL(Register Abstract Layer,寄存器抽象层),通常也叫寄存器模型,顾名思义就是对寄存器这个部件的建模。本文要介绍的内容,包括对UVM寄存器模型的概述,如何构建寄存器模型,以及如何将寄存器模型集成到验证环境中。

寄存器模型概述
为什么要对寄存器建模,可能是初学者问得较多的问题。简单地说,寄存器建模要做的事情,就是在软件的世界里面,复刻RTL中的寄存器。既然是面向软件世界做的事情,自然就是为软件所用,要么方便软件观测,要么方便软件使用。
这里的软件,指的是整个验证环境所构造出来的面向对象的世界。有了寄存器模型,软件世界中的参考模型(reference model)可以很方便的获取到当前RTL的功能配置和状态,我们也可以很方便的收集到对寄存器各个域段甚至位的测试覆盖情况等等。
要达成这一目标,就需要考虑两个基本的问题:如何对寄存器进行建模,以及建立怎样的机制才可以让寄存器模型是“实时”复刻RTL寄存器的(上图中的虚线箭头)。这也是本文后面两个小节要介绍的内容。
7. 构造寄存器模型
寄存器模型的框架实际上跟RTL中的寄存器组没有什么两样。寄存器组中有的,寄存器模型也应该要有,顶多是多了一些抽象。基于这个想法,构造寄存器模型的工作,便可以从硬件寄存器组的设计,一一映射为对应的数据结构。
寄存器最小的功能单元是域段(field)。一个寄存器要切分成多少个域段、每个域段的位宽、默认值、读写属性以及分别用于什么功能的控制或状态的指示,是根据功能规范来定义的。对域段的建模,UVM类库提供的类型叫uvm_reg_field。
寄存器是可作为单个实体被访问的多个域段的集合,它可以被映射到一个或者多个地址上(memory-mapped)被访问。对寄存器的建模,UVM提供的类型叫uvm_reg。为了提供后门访问(backdoor access),uvm_reg还增加了成员来表示其对应的硬件寄存器在RTL中的层次路径。
寄存器访问译码表,或者叫memory map,是寄存器接口从访问地址到使能对应寄存器所需要的查找表。这张表中指定了每个寄存器的偏移地址(offset)、访问属性、大小端、对应的总线等配置。对memory map的建模,UVM提供的类型叫uvm_reg_map。

多个寄存器及其访问译码表最终构成寄存器组。在同个数字系统的不同总线视角下,寄存器组可以映射到不同的基地址(base)。因此,一个寄存器组除了可以包含多个寄存器,还可以有多个译码表。UVM针对寄存器组的建模提供的类型叫uvm_reg_block。为了便于集中管理,uvm_reg_block还可以包含其他子uvm_reg_block。
在同一类族中,UVM还提供了uvm_mem类,用于对连续地址存储空间的建模。uvm_mem对象也可以被集成到uvm_reg_block中,并通过uvm_reg_map做地址映射,
此外,UVM还提供了uvm_reg_file类。这个类更像是一个对象容器,可以用来装载多个寄存器(uvm_reg)和其他uvm_reg_file,以便对相同规格的寄存器进行多次例化。
8.集成到验证环境
如果只是简单把寄存器模型集成到验证环境,那么只要例化寄存器模型就可以了。现在主要的问题是,建立怎样的机制才可以让寄存器模型“实时”复刻RTL寄存器的值。为了解决这个问题,UVM引入Prediction机制,用到了两个新的组件:Adapter和Predictor。
Adapter,可以翻译为适配器,它的作用是寄存器访问事务和总线事务的相互转换。寄存器访问事务对数据的封装格式相对固定,一般包含读写类型、地址、数据和字节掩码。而总线事务则根据不同的总线协议会有所不同。因此,Adapter扮演了中间做事务转换的角色,其主要实现的函数为reg2bus和bus2reg。

Predictor,是保持寄存器模型“实时”复刻RTL寄存器值的关键组件。Predictor翻译过来叫预测器,可能反而不是很好理解,对其功能比较好的描述我觉得应该是“monitor and update the RAL Model”。根据是否使用外部predictor,有两种应用方式:Implicit Prediction和Explicit Prediction。
隐式预测(Implicit Prediction):用户使用寄存器模型中memory map默认的predictor,当开启其预测功能之后,如果用户在测试用例中通过寄存器模型的API(下篇文章会介绍都有哪些API)去发起硬件寄存器访问操作,该操作会自动被predictor捕捉,并在该操作完成之后自动同步到寄存器模型的寄存器中。下图为了方便展示,将原本同属于寄存器模型中的memory map、registers和adapter分开画了。

显式预测(Explicit Prediction):用户基于UVM提供的基类uvm_reg_predictor实现preditor,并将monitor的总线事务传递给该predictor,同时将其关联到寄存器模型的memory map和对应总线事务的adapter适配器。工作逻辑是这样的:该predictor相当于可以根据memory map监测总线上的寄存器访问行为,并将该行为通过adapter转换成寄存器事务,最终用于更新寄存器模型。

Explicit Prediction相对于Implicit Prediction,除了监视通过寄存器模型API对寄存器的访问操作,还可以覆盖到其他测试序列(sequence)通过总线对寄存器的直接访问,这一点会使它更加通用。

浙公网安备 33010602011771号