[UVM源代码研究] 聊聊寄存器模型的后门访问
引言
我们在之前的文章 [UVM源代码研究] 当我们使用寄存器模型里的寄存器调用write/read方法,数据包是如何在寄存器模型、adapter、sequencer中传递的 一文中 介绍了读写寄存器时UVM源代码的实现过程,对于后门访问只是一笔带过,不是所有的寄存器都支持后门访问,并且如果rtl的寄存器路径比较分散的话也不利于寄存器模型后门路径的设置,所以现实工作中使用后门访问的场景确实比较有限。但是后门访问有时可以大大简化我们的验证工作,尤其是在有些不得不使用寄存器模型后门访问的场景下又显得尤为重要(比如在check_phase这样一个function phase里试图获取DUT寄存器的值),本文就带着大家一起窥探下源代码中是如何实现寄存器模型的后门访问的。
寄存器模型相关的基本概念在之前的相关文章中已经详细讲解过了,这里就不多赘述了,具体可以参考以下几篇文章:
[UVM源代码研究] 当我们使用寄存器模型里的寄存器调用write/read方法,数据包是如何在寄存器模型、adapter、sequencer中传递的
[UVM源代码研究] 我们在使用UVM寄存器模型内建的sequence检查寄存器时UVM源代码都执行了些啥?
[UVM源代码研究] 聊聊寄存器模型中的期望值(desired value)、镜像值(mirrored value)以及DUT中的实际值(actual value)的相关概念及方法
UVM源代码溯源
我们以后门写寄存器为例结合具体实例讲解下UVM源代码是如何实现寄存器模型的后门访问的。
源代码中涉及到的相关方法首先是write任务,如图1所示
图1 src/reg/uvm_reg.svh中的write()任务

wirte()中的核心方法是do_write(),其他内容可以认为是在等待寄存器的访问权限(Xtomic()任务)和更新期望值(set()函数)。do_write()任务如图2所示。
图2 src/reg/uvm_reg.svh中的do_write任务

do_write()我们分5大块来讲解其中UVM_BACKDOOR相关的代码,首先是第1步调用get_backdoor来获取uvm_reg_backdoor的句柄,uvm_reg_backdoor类的定义和描述如图2所示。
图3 src/reg/uvm_reg_backdoor.svh中uvm_reg_backdoor类的定义与描述

简单概括下这个类的功能就是作为用户使用backdoor的方式访问寄存器或者memory的积累,用户如果不想通过sv或者内置的DPI方式去后门访问寄存器模型的话,就可以从该类派生出自定义的backdoor访问类,override其中的相关方法来实现自定义形式的后门访问,默认情况下UVM源代码中是使用sv语法的DPI方式来实现寄存器的后门访问的,这个实现方法我们后面会具体讲,等于说我们要进行后面访问都是通过uvm_reg_backdoor或者其派生类来实现的,后面我们还会讲其中相关方法的具体实现。
继续回到图2中的第一步,我们是通过get_backdoor()来获取uvm_reg_backdoor的句柄的,get_backdoor()的定义如图4所示。
图4 src/reg/uvm_reg.svh中的get_backdoor函数

如果我们未曾对backdoor进行任何的设置(没有自定义的uvm_reg_backdoor模型),那么默认的m_backdoor就是null,inherited缺省值为1,图4中1368行就会调用该uvm_reg所在的寄存器模型uvm_reg_block中的get_backdoor()函数,如图5所示。

本文详细探讨了UVM源代码中如何实现寄存器模型的后门访问,涉及uvm_reg_backdoor类、HDL路径管理、寄存器模型与RTL映射以及DPI的使用,为理解寄存器后门操作提供了深入剖析。
最低0.47元/天 解锁文章
950

被折叠的 条评论
为什么被折叠?



