【寄存器模型】二、前门访问与后门访问

一、前门访问 

前门访问的概念
前门访问就是通过配置总线来对dut内部的寄存器操作。
实现前门访问的方式
1.使用全局变量
2.启动一个sequence对寄存器进行读写,其中如果为读操作,读出来的值要么通过config_db来返回。
3.在component有启动该sequence的sequencer指针,那么就可以在该组件中启动sequence,如果是读操作,通过读取sequence中的值就能得知dut中的寄存器值。

寄存器模型实现前门访问
uvm中实现前门访问的方式就是第三种方式,在寄存器模型中就有sequencer指针,这个指针就是在test层使用default map连接adapter与sequencer时,产生的指向sequencer的指针。
大体流程为:
1.参考模型调用读任务,使用read,参数设置成UVM_FRONTDOOR
2.参考模型产生sequence,并产生一个uvm_reg_item类型的对象rw。
3.将该对象传入adapter的bus2reg函数,产生一个能被driver接受的transaction类型的对象bus_req。
4.将bus_req发送给sequencer。
5.sequencer发送给driver。driver驱动该sequence,并将读取到的值放入bus_req中。
6.将bus_req传入adapter的bus2reg函数中,将读到的值传给对象rw
7.将rw中的数据返回给参考模型。

注:如果在adapter中有bit provides_responses这个参数,那么driver会将读取到的值放入RSP中,并返回rsp给寄存器模型

二、后门访问 

后门访问的概念
只要不通过dut总线对dut内寄存器进行存取的操作都是后门访问。
实现后门访问的方法:
1.使用点操作,也就是绝对路径。但这样可移植性不强。
2.使用interface(非virtual),在接口块内定义后门写或者后门读函数,其他component想要使用后门操作的时候,直接调用该接口函数即可,但这种可移植性也不强,因为如果dut内部有很多寄存器,那interface块内就要写很多个函数。
3,使用DPI+VPI。VPI是dut与c/c++之间的接口,DPI是sv与 c之间的接口,在DPI+VPI的方式中,路径被抽象成了字符串,并以参数的形式进行存储和传递。这是UVM中实现后门访问的方式。
其大体流程就是:
1.建立寄存器模型,设置好路径参数。
2.寄存器模型调用uvm_hdl_read,会通过DPI接口传入c/c++一侧,调用vpi_get_value来读取dut中寄存器的值。
3.寄存器模型调用uvm_hdl_deposit,会通过DPI接口传入c/c++一侧,调用vpi_put_value来写入dut中寄存器的值。
寄存器模型实现后门访问
寄存器模型实现后门访问的方式就是上述的第三种方式。所以要实现寄存器模型的后门访问:
1.设置好路径参数,这里有两个路径,分别为相对路径和根路径。
      1.1 设置相对路径:在uvm_block中的为每一个寄存器的configer函数设置后仿路径(第三个参数),该路径是个字符串,一般为dut中寄存器的名字
      1.2 设置根路径:在test层集成寄存器模型时设置根路径,使用寄存器模型的set_hdl_path_root,该函数的参数也是字符串,内容一般写到dut层,也就是top_tb.my_dut。
2.调用寄存器模型的后门读任务:read或peek。
使用read则需要设置第三个参数为字符串"UVM_BACKDOOR"。
3.调用寄存器模型的后门写任务:write或poke。
使用write则需要设置第三个参数为字符串"UVM_BACKDOOR"。

注:无论是peek还是poke,其常用的参数都是前两个。各自的第一个参数表示操作是否成功,第二个参数表示读写的数据。

这里使用后门访问提供了两类读写方法,第一类会在进行操作时模仿DUT的行为,第二类则完全不管DUT的行为。如对一个只读的寄存器进行写操作,那么第一类由于要模拟DUT的只读行为,所以是写不进去的,但是使用第二类可以写进去。

三、前门访问以及后门访问的寄存器模型操作函数

前门/后门操作都有读写两种操作:

reg_model.INVERT_REG.read(status, rdata, UVM_FRONTDOOR);//前门读
reg_model.INVERT_REG.write(status, wdata, UVM_FRONTDOOR);//前门写

reg_model.INVERT_REG.read(status, rdata, UVM_BACKDOOR);//后门读
reg_model.INVERT_REG.write(status, wdata, UVM_BACKDOOR);//后门写

后门访问新增了peek/poke操作:

reg_model.INVERT_REG.peek(status, rdata, UVM_BACKDOOR);// 通过后门访问方式读取寄存器的值,不关心DUT的行为,即使寄存器的读写类型是不能读,也可以将值读出来
reg_model.INVERT_REG.poke(status, wdata, UVM_BACKDOOR);//通过后门访问方式写入寄存器的值,不关心DUT的行为,即使寄存器的读写类型是不能写,也可以将值写进去

对于read clear类型的field,peek读操作不会clear,所以有的时候peek和read操作结果不一样

对于write clear类型的filed,poke操作不会clear,所以有的时候poke和write操作结果不一样

四、为什么要用后门访问?它的优势是什么?

1.后门访问可以更好的完成前门访问能够完成的事情:后门访问不消耗仿真时间,且消耗的运行时间也远小于前门访问的运行时间。

2.后门访问可以完成前门访问不能完成的事:对于某些特定的场景,如网络通信系统中的一些只读计数器,当要验证计数器进位归零的场景时,前门访问无法完成写寄存器操作,只能通过消耗仿真时间来使计数器到达特定的计数值。而后门访问可以直接对只读寄存器赋一个初值。

五、后门访问的缺点

前门访问操作可以在波形中找出总线信号变化的波形及所有操作的记录,而后门访问无法在波形文件中找到操作记录。这是因为后门访问并没有通过总线对dut操作,其次后门访问没有消耗仿真时间。

 六、前门访问与后门访问比较 

前门访问后门访问
通过总线协议访问,需要耗时。总线访问结束时,前门访问才结束。通过UVM DPI关联硬件寄存器路径,直接读取或修改硬件,不消耗仿真时间,零时刻响应。
一般只能按字(word)读写,无法直接读写寄存器域。可以对寄存器或者寄存器域直接读写。
依靠总线检测来对寄存器模型做预测。依靠auto predition方式对寄存器模型做预测。
反映了正确的时序关系。不受硬件时序控制,对硬件做的后门访问可能发生时序冲突。
通过总线协议可以有效捕捉总线错误,从而验证总线访问路径。不受总线时序功能影响

参考:UVM学习笔记—前门访问/后门访问_Verification_White的博客-程序员宝宝_uvm前门访问后门访问 - 程序员宝宝 UVM-前门访问和后门访问_卢卡猫的博客-CSDN博客_uvm后门访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值