一、前门访问

前门访问的概念
前门访问就是通过配置总线来对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, value, UVM_FRONTDOOR);//前门读
reg_model.INVERT_REG.write(status, 16'h1, UVM_FRONTDOOR);//前门写reg_model.INVERT_REG.read(status, value, UVM_BACKDOOR);//后门读
reg_model.INVERT_REG.write(status, 16'h1, UVM_BACKDOOR);//后门写

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

reg_model.INVERT_REG.peek(status, value, UVM_BACKDOOR);// 通过后门访问方式读取寄存器的值,不关心DUT的行为,即使寄存器的读写类型是不能读,也可以将值读出来
reg_model.INVERT_REG.poke(status, 16'h1, 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后门访问

【寄存器模型】二、前门访问与后门访问相关推荐

  1. UVM学习笔记—前门访问/后门访问

    目录 0.前言 1.前门访问 2.后门访问 2.1路径设置 2.2操作类型 0.前言 在UVM学习笔记-寄存器模型的搭建及使用中提到过前门访问和后门访问的概念,这篇文章将会详细的阐述一下这2种访问方式 ...

  2. uvm 形式验证_6.小白学uvm验证 - 寄存器模型

    写过 verilog 硬件代码的同学应该都知道 DUT 会包含很多寄存器,它们是模块间交互的接口,其用途大致可以分为两类: a. 通过读出寄存器当前的值获取 DUT 当前的状态,该类寄存器称为状态寄存 ...

  3. UVM实战 卷I学习笔记10——UVM中的寄存器模型(3)

    目录 后门访问与前门访问 *UVM中前门访问的实现 后门访问操作的定义 *使用interface进行后门访问操作 UVM中后门访问操作的实现:DPI+VPI *UVM中后门访问操作接口 后门访问与前门 ...

  4. UVM实战(张强)-- UVM中的寄存器模型

    目录 一.整体的设计结构图 二.各个组件代码详解 2.1 DUT 2.2 bus_driver 2.3 bus_sequencer 2.4 bus_monitor 2.5 bus_agent 2.6 ...

  5. 寄存器模型 — UVM

    文章目录 一.基本概念 二.寄存器模型的集成 1. 寄存器模型与总线的桥接 2. adapter的实现 3. 寄存器模型rgm和adapter的集成 三.访问寄存器的方式 1. 前门访问 2. 后门访 ...

  6. UVM中的寄存器模型

    寄存器模型简介 1. 通常来说,DUT中会有一组控制端口,通过控制端口,可以配置DUT中的寄存器,DUT可以根据寄存器的值来改变其行为.这组控制端口就是寄存器配置总线. 在没有寄存器模型之前,只能启动 ...

  7. UVM入门与进阶学习笔记17——寄存器模型(2)

    目录 寄存器模型集成 总线UVC的实现 总线UVC解析 MCDF寄存器设计代码 Adapter的实现 Adapter的集成 访问方式 前门访问 后门访问 前门与后门的比较 前门与后门的混合应用 寄存器 ...

  8. UVM学习笔记—寄存器模型的搭建及使用

    目录 0.前言 1.DUT中的寄存器是什么? 2.为什么需要寄存器模型? 3.如何搭建寄存器模型 3.0基本概念 3.1搭建一个reg(将reg filed加入到reg) 3.2搭建一个reg blo ...

  9. 《UVM实战卷Ⅰ》学习笔记 第七章 UVM中的寄存器模型(2)

    推荐另外一篇相对更为基础的UVM 寄存器相关知识梳理UVM寄存器模型笔记_IC-V的博客-CSDN博客 目录 7.3 后门访问和前门访问 1.后门访问的方式 7.4复杂的寄存器模型 7.5复杂寄存器模 ...

最新文章

  1. 自定义Sharepoint的登陆页面(2)
  2. 透明物体分割学习笔记
  3. Py之pyecharts:基于大数据对人工智能进行各种可视化图表分析
  4. 【css】文字溢出,显示省略符号(...)
  5. cf1009F. Dominant Indices
  6. 前端学习(2184):tabber--封装成独立的组件
  7. python统计中文字符的个数_python统计中文字符数量的两种方法
  8. 重磅预售 | 分子生物学与遗传学经典名著——《Lewin基因XII》(中译本)
  9. java c s聊天程序_Java建立C/S 模式聊天室服务器和客户端
  10. 破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)
  11. 【英语学习】【Level 07】U05 Best Destination L4 A perfect destination
  12. pandas如何获取名以及删除列
  13. linux 查看nginx,php-fpm运行用户及用户组
  14. FontLab 7 for Mac(字体编辑器)
  15. 安国U盘量产无法识别芯片处理
  16. 淘宝为什么有的人月销量上万,他们是怎么操作的?
  17. T141基于51单片机出租车计费器公里计数,Proteus设计,keil程序、课题设计
  18. Java发起GET请求的二三事
  19. JQuery ----Reset()方法
  20. 页面静态化--Nginx

热门文章

  1. gulp-jade 动态数据渲染编译模板 热更新案例开发
  2. 服务器虚拟内存不够1,虚拟内存不足怎么办?告诉你一个好办法
  3. Fair Distribution (整除分块)
  4. UE4/UE5获取时间戳和两个时间戳的差
  5. 【论文阅读】FL下一种利用GAN生成辅助数据的 被动成员推断攻击GAN Enhanced Membership Inference: A Passive Local Attack in FL
  6. python--matplotlib.colors
  7. PDFbox基本操作
  8. Python中的条件语句
  9. Ubuntu升级后进入不了图形界面
  10. ARM64基础0:ARM64架构简介