目录
寄存器模型概述
1.为什么要使用寄存器模型?
在复杂的UVM验证环境中,访问DUT中的寄存器可能会涉及到多个模块和层级的交互。初学者可能会发现手动处理这些交互过于复杂。
使用UVM寄存器模型,验证工程师可以直接调用内置的函数来访问寄存器,而无需处理复杂的交互过程。
1)寄存器检测的方法
通常来说,DUT中会有一组控制端口,通过控制端口,可以配置DUT中的寄存器,DUT可以根据寄存器的值来改变其行为。这组控制端口就是寄存器配置总线。
a. 无寄存器模型:
启动读写的sequence进出完成,sequence产生的读写事物通过sequencer传入到对应的driver当中,driver讲对应的信号驱动给dut中,dut根据驱动的信号做出相应的动作,如改变寄存器的值或者返回寄存器的值,monitor再从接口上捕获到接口信息,可以判断drive操作的哪个寄存器以及对应的值,再讲信息送到sb中,进行对比。
这个方法很难在其他组件中在适当的时间启动读写寄存器。
ral提供了用于对设计当中的寄存器和存储器进行建模的register model,是一套数据结构,需要使用他们建立寄存器模型。
b.有寄存器模型:
有了寄存器模型之后,scoreboard只与寄存器模型打交道,无论是发送读的指令还是获取读操作的返回值,都可以由寄存器模型完成。有了寄存器模型后,可以在任何耗费时间的phase中使用寄存器模型以前门访问或后门(BACKDOOR)访问的方式来读取寄存器的值,同时还能在某些不耗费时间的phase(如check_phase)中使用后门访问的方式来读取寄存器的值。
前门访问与后门访问是两种寄存器的访问方式。所谓前门访问,指的是通过模拟cpu在总线上发出读指令,进行读写操作。在这个过程中,仿真时间($time函数得到的时间)是一直往前走的。
UVM寄存器模型的本质就是重新定义了验证平台与DUT的寄存器接口,使验证人员更好地组织及配置寄存器,简化流程、减少工作量。
2)寄存器模型的作用
解耦Scoreboard和Sequence:
有了寄存器模型,Scoreboard可以通过寄存器模型间接访问DUT中的寄存器和存储器,而不需要直接与Sequence紧密耦合。这种解耦使得Scoreboard的设计更加灵活,能够更好地适应复杂的验证环境。简化寄存器访问流程:
使用寄存器模型提供的API,Scoreboard可以直接对寄存器和存储器进行访问,而不需要通过Sequence来启动访问操作。这简化了寄存器访问的流程,提高了验证环境的可维护性和可扩展性。提供读写接口:
寄存器模型提供了read和write等接口,使得Scoreboard可以方便地读取寄存器的值或向指定的寄存器写入值。这种直接的读写接口使得Scoreboard能够更加灵活地与DUT进行通信和交互。事务转换器的使用:
为了让寄存器模型能够与Sequence进行交互,通常需要使用事务转换器。这个转换器能够将寄存器模型产生的事务类型转换成Sequence能够接受的类型,从而实现寄存器模型与Sequence之间的无缝连接和通讯。寄存器模型与Sequencer的连接:
通过事务转换器,寄存器模型和Sequencer得以连接。这样一来,寄存器模型就可以直接与DUT进行通信,而不需要依赖于Sequence的启动,从而进一步简化了验证流程和提高了效率。
3)Froutdoor
scoreboard或者是平台的其他组件当中,调用寄存器模型的相关API进行寄存器访问时,寄存器模型会根据这个API以及寄存器的名称自动产生出一个类型为uvm_reg_item的事物对象。
比如,如果是read操作,那么这个对象中的操作类型就是独操作,访问的地址会根据寄存器的名称,register name自动生成。接着,寄存器模型会将这个事物对象进一步进行转换,转换为uvm_reg_ bus_op类型的事物对象。并将事物对象传入adapter转换器,转换器再将其转换为sequencer可接受的事物类型。sequencer在收到后,通过driver驱动到相应的dut,最终返回相应的值。
下面是一个简单的伪代码示例,展示了如何使用寄存器模型进行寄存器的读取操作:
import uvm_pkg::*;
class scoreboard extends uvm_component;
// 寄存器模