当前位置: 首页 > news >正文

《UVM实战》学习笔记——第七章 UVM中的寄存器模型2——期望值/镜像值、自动/显示预测、操作方式

文章目录

  • 前言
  • 一、寄存器模型对DUT的模拟
    • 1.1 期望值和镜像值
    • 1.2 常见操作对期望值和镜像值的影响
  • 二、prediction分类
    • 2.1 自动预测
    • 2.2 显式预测
  • 三、访问寄存器方式
  • 四、mem和reg的联系和差别
  • 五、内建built_in sequence
    • 5.1 寄存器模型内建序列
    • 5.2 存储器模型内建序列
    • 5.3 禁止域名
  • 六、寄存器模型的应用场景
  • 七、检查寄存器的方式
  • 八、覆盖率收集


前言

2023.4.24 寄存器模型学起来感觉好难,没太理解,主要是还没有实际使用,理论知识学起来枯燥


一、寄存器模型对DUT的模拟

1.1 期望值和镜像值

  • 镜像值mirrored value,表示当前硬件状态的已知值。镜像值往往由模型预测给出,即在前门访问时通过观察总线或在后门访问时通过自动预测等方式来给出镜像值。镜像值有可能与硬件实际值(actual value)不一致,无法保持同步更新。

  • 期望值desired value,先利用寄存器模型修改软件对象值,而后利用该值更新硬件值。

  • mirrored value与desired value是寄存器模型的属性,而actual value对应硬件的真实数值。

  • 对于存储器,并不存在期望值和镜像值。

class case0_cfg_vseq extends uvm_sequence;virtual task body();p_sequencer.p_rm.invert.set(16'h1);  //设置期望值value = p_sequencer.p_rm.invert.get();  //get函数去获得期望值value = p_sequencer.p_rm.invert.get_mirrored_value();  //得到镜像值p_sequencer.p_rm.invert.update(status, UVM_FRONTDOOR);  //update函数会去检查两者是否一致,不一样,会把期望值写入DUT,同时更新镜像值...
endclass

1.2 常见操作对期望值和镜像值的影响

read/write/peek/poke:读写会使得寄存器模型去更新值,使得两者是相等的
set:只改变期望值,不改变镜像值
update:检查是否一致,不一致会去更新镜像值,使其和期望值相同
randomize:随机化后,期望值会改变,镜像值不改变。但不是所有寄存器模型都支持此函数,此外可以在configure函数的第八个参数关闭随机化功能。

一般randomize和update配合使用,上电复位后,先随机化,再update去配置DUT。

二、prediction分类

左边是自动预测,右边是显示预测
在这里插入图片描述

2.1 自动预测

auto prediction:没有predictor和monitor的情况下,利用寄存器的操作来自动记录每次寄存器的读写数值并在后台自动调用predict()方法

  • 后门访问的时候只能自动预测uvm_reg_map::set_auto_predict()
  • 如果出现其它一些sequence直接在总线层面上对寄存器进行操作(跳过寄存器级别的write()/read()操作)或通过其它总线访问寄存器等额外情况,都无法自动得到寄存器的镜像值和预期值。

2.2 显式预测

explicit:更加可靠的方式是在物理总线上通过monitor捕捉总线事务,并将捕捉到的事务传递给外部例化的predictor,再利用adapter的桥接方法实现事务信息转换,并将转化后的寄存器模型有关信息更新到map中。

  • 显式预测对寄存器数值预测更为准确
class base_test extends uvm_test;reg_model rm; //寄存器模型my_adapter reg_sqr_adapter;my_adapter mon_reg_adapter;  //adapter是object类uvm_reg_predictor #(bus_transaction) reg_predictor;  //predictor是组件类,参数类,声明要传递的transaction类型...
endclassfunction void base_test::build_phase (uvm_phase phase) ;rm = reg_model::type_id::create ( "rm", this) ;rm.configure ( null, "");rm.build ( ) ;rm.lock_model ( );rm.reset ( ) ;reg_sqr_adapter = new ( "reg_sqr_adapter" ) ;mon_reg_adapter = new ( "mon_reg_adapter" ) ;reg_predictor = new ( "reg_predictor", this) ;env.p_rm = this.rm;
endfunctionfunction void base_test::connect_phase (uvm_phase phase) ;rm.default_map.set_sequencer (env.bus_agt.sqr,reg_sqr_adapter);  //连接sequencer和adapterrm.default_map.set_auto_predict (0);  //此处设置为0的话,就会关闭右图虚线更新寄存器模型的路径  reg_predictor.map = rm.default_map;  reg_predictor.adapter = mon_reg_adapter;env.bus_agt.ap.connect (reg_predictor.bus_in) ;
endfunction

在connect_phase中,需要将reg_predictor和bus_agt的ap口连接在一起,并设置reg_predictor的adapter和map。只有设置了map后,才能将predictor和寄存器模型关联在一起。
(在集成的过程中需要将adapter与map的句柄也一并传递给predictor,同时将monitor采集的事务通过analysis port接入到predictor一侧。)

三、访问寄存器方式

1、uvm_reg_blockuvm_reguvm_reg_field三个类提供用于访问寄存器的方法:
在这里插入图片描述

  • mirror():读取actual value去更新mirrored value,前门后门都可以,还可以检查
  • update():先set修改软件的值,然后再去修改硬件actual value,最后总线获得数据去更新mirrored value。最后三个数据都是一样的。(这个两个函数前门后门访问都可以使用,但是不能对寄存器域进行操作)
  • set():set的是desired value,是软件的值,不是硬件实际值。set之后的操作是update,因为两侧的值不相同了。
  • get():get的是desired value,是软件的值,不是硬件实际值
  • reset():复位block/reg/field的期望值和镜像值
  • get_reset():得到reg/field的复位值

mirror和read对比:

  • 相同:都可以进行前门或后门访问
  • 不同:mirror不会返回读取的值,但是会把镜像值进行修改;mirror前门访问可以进行block级别操作

randomize、set和update配合使用模拟场景:
先随机化寄存器的值,再去设置某些特定的值,最后再根据这些值去配置寄存器,相比较于write和read来说,这样做可以模拟更多的场景。

void'(rgm.chnl0_ctrl_reg.randomize());
rgm.chnl0_ctrl_reg.pkt_len.set('h3);
rgm.chnl0_ctrl_reg.update(status, UVM_FRONTDOOR, .parent(this));void'(rgm.chnl1_ctrl_reg.randomize());
rgm.chnl1_ctrl_reg.set('h22);
rgm.update(status, UVM_FRONTDOOR, .parent(this));

2、uvm_reg_sequence的访问方式:针对寄存器对象reg的,不是寄存器块或寄存器域
在这里插入图片描述

  • 对于前门访问的read()和write(),在总线事务完成时镜像值和期望值才会更新为与总线上相同的值,这种预测方式是显式预测
  • peek()和poke()及后门访问模式下的read()和write(),由于不通过总线,默认采取自动预测的方式,故在零时刻方法调用返回后镜像值和期望值也相应修改
  • 复位操作:捕捉到硬件进行复位时,需要把验证平台的寄存器模型进行复位。
    复位后,可以读取复位值,并与后门访问获得的寄存器复位值进行比较,来判断复位是否成功。
@(negedge p_sequencer.vif.rstn);
rgm.reset();	 
rgm.chnl0_ctrl_reg.reset();		
rgm.chnl0_ctrl_reg.pkt_len.reset();		//检查复位是否成功
rstval = rgm.chnl0_ctrl_reg.get_reset();  //得到复位值只能在reg/field层次
rgm.chnl0_ctrl_reg.read(status, data, UVM_BACKDOOR, .parent(this));
if(rstval != data)`uvm_error("RSTERR", "reset value read is not the desired reset value")

四、mem和reg的联系和差别

UVM寄存器模型也可以对存储建模。可以模拟RW、RO、WO类型的存储,而且可以配置存储模型的数据宽度和地址范围。

  • 一旦映射,会带来很大的资源消耗,因此就不支持预测和影子存储功能(shadow storage),没有镜像值和期望值
  • 利用自带的方法去访问硬件存储。利用模型的地址范围去测试硬件的地址范围是否全部覆盖。
  • 提供前门和后门访问,可以先后门写,前门读(以前是系统函数或者仿真器)
  • 除了有read/write/peek/poke之外,还有burst_readburst_write函数连续传输,传进去的是数组形式,传递多个数据。
  • 如果需要实现更多的协议配置要去,建议在总线UVC层面去驱动

五、内建built_in sequence

UVM自带的一些sequence,可以在项目初期对寄存器模型进行验证,为后期各个功能点验证打下基础

5.1 寄存器模型内建序列

在这里插入图片描述

5.2 存储器模型内建序列

在这里插入图片描述

5.3 禁止域名

对一些寄存器,如果想将其排除在某些内建序列测试范围之外,可额外添加上面列表中提到的“禁止域名”。由于uvm_reg_block和uvm_reg都是uvm_object类而不是uvm_component类,所以可以使用uvm_resource_db来配置“禁止域名”。

class mcdf_rgm extends uvm_reg_block;...virtual function build();...//disable build-in seq attributesuvm_resourcr_db #(bit)::set({"REG::", this.chnl0_stat_reg.get_full_name()}, "NO_REG_ACCESS_TEST", 1);uvm_resourcr_db #(bit)::set({"REG::", this.chnl1_stat_reg.get_full_name()}, "NO_REG_ACCESS_TEST", 1);uvm_resourcr_db #(bit)::set({"REG::", this.chnl2_stat_reg.get_full_name()}, "NO_REG_ACCESS_TEST", 1);endfunction
endclass

六、寄存器模型的应用场景

  • 检查寄存器,以及协助检查硬件设计逻辑和比对数据
  • 在对硬件数据通路做数据比对时,需及时知道当时的硬件配置状况,而利用寄存器模型的镜像值可实现实时读取,不需要从前门访问。
  • 寄存器模型不但可以用来检查硬件寄存器,也可用来配合scoreboard实时检查DUT的功能。

七、检查寄存器的方式

  • 从前门写,并且从前门读。这种方式最为常见,但是无法检查地址是否正确映射。而前门与后门混合操作的方式可以保证地址的映射检查
  • 从前门写再从后门读。利用write()实现前门写,再用read()或peek()从后门读。
  • 从后门写再从前门读。利用write()或poke()实现后门写,再用read()从前门读。
  • 对一些状态寄存器(硬件自身信号会驱动更新其实际值),先用peek()获取(并且会调用predict()方法更新镜像值),再调用mirror()方法从前门访问并且与之前更新的镜像值比较。

八、覆盖率收集

在验证前期可以不例化covergroup保证更好的资源利用;在验证后期需采集功能覆盖率时再考虑例化、使能采样。

  • read/write函数会自动调用回调函数sample,进行自动采样数据。sample又会调用sample_values函数,再去调用covergroup
  • sample_values函数是供外部调用的函数,在发生特定事件的触发时,如中断、复位等,可以在外部通过监听具体事件来调用该方法
  • 采样的时候会采集所有的域的值,但有些是没用的。希望可以采用自定义的形式,限定感兴趣的域和采样事件。
class ctrl_reg extends uvm_reg;`uvm_object_utils(ctrl_reg)uvm_reg_field reserved;rand uvm_reg_field pkt_len;rand uvm_reg_field prio_level;rand uvm_reg_field chnl_en;covergroup value_cg;option.per_instance = 1;reserved: coverpoint reserved.value[25:0];pkt_len: coverpoint pkt_len.value[2:0];prio_level: coverpoint prio_level.value[1:0];chnl_en: coverpoint chnl_en.value[0:0];endgroupfunction new(string name="ctrl_reg");super.new(name, 32, UVM_CVR_ALL);  //包含所有的覆盖率类型set_coverage(UVM_CVR_FIELD_VALS);if(has_coverage(UVM_CVR_FIELD_VALS)) begin   //是否具备对应的covergroup,有就例化groupvalue_cg = new();endendfunctionvirtual function build();reserved = uvm_reg_field::type_id::create("reserved");pkt_len = uvm_reg_field::type_id::create("pkt_len");prio_level = uvm_reg_field::type_id::create("prio_level");chnl_en = uvm_reg_field::type_id::create("chnl_en");reserved.configure(this, 26, 6, "RO", 0, 26'h0, 1, 0, 0);pkt_len.configure(this, 3, 3, "RW", 0, 3'h0, 1, 1, 0);prio_level.configure(this, 2, 1, "RW", 0, 2'h3, 1, 1, 0);chnl_en.configure(this, 1, 0, "RW", 0, 1'h0, 1, 1, 0);endfunctionfunction void sample(uvm_reg_data_t data,uvm_reg_data_t byte_en,bit is_read,uvm_reg_map map);super.sample(data, byte_en, is_read, map);sample_values();endfunctionfunction void sample_values();super.sample_values();if(get_coverage(UVM_CVR_FIELD_VALS)) begin   //是否允许使用对应的covergroup进行采样value_cg.sample();endendfunction
endclass

相关文章:

《UVM实战》学习笔记——第七章 UVM中的寄存器模型2——期望值/镜像值、自动/显示预测、操作方式

文章目录 前言一、寄存器模型对DUT的模拟1.1 期望值和镜像值1.2 常见操作对期望值和镜像值的影响 二、prediction分类2.1 自动预测2.2 显式预测 三、访问寄存器方式四、mem和reg的联系和差别五、内建built_in sequence5.1 寄存器模型内建序列5.2 存储器模型内建序列5.3 禁止域名…...

OFDM-LS信道估计 MMSE信道估计公式推导

假设ofdmN个子载波之间是完全正交的,即不考虑ICI影响,通过发送训练序列来实现信道估计。 其中,在推导6.8的时候,需要将6.6先拆解一下。 X − 1 Y X − 1 ( X H Z ) X − 1 X H X − 1 Z H X − 1 Z X^{-1}Y X^{-1}(XHZ)…...

业界内分布式锁

技术主题 在分布式系统中,面对分布式微服务日益流行的场景,分布式锁一直是分布式系统老生常谈的内容。分布式锁可以防止用户重复点击,对于电商场景中,分布式锁可以防止用户重复下单,给用户带来更好的体验。 技术实现…...

基于Java+Springboot+Vue+elememt甜品屋蛋糕商城系统设计和实现

基于JavaSpringbootVueelememt甜品屋蛋糕商城系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…...

C/C++每日一练(20230424)

目录 1. 只出现一次的数字 🌟 2. 有效的括号 🌟🌟 3. 递归反序正整数 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 只出现一次…...

三百左右的蓝牙耳机哪个音质好?三百左右音质最好的蓝牙耳机推荐

在外出携带的数码产品中,蓝牙耳机的出现频率居高不下,一部手机,一副耳机已经成为不少人外出的标配。蓝牙耳机无外乎是用来听的,下面,我来给大家推荐几款三百左右音质好的蓝牙耳机,一起来看看吧。 一、南卡…...

把阿里大鸟花3个月时间整理的软件测试面经偷偷给室友,差点被他开除了···

写在前面 “这份软件测试面经看起来不错,等会一起发给他吧”,我看着面前的面试笔记自言自语道。 就在这时,背后传来了leder“阴森森”的声音:“不错吧,我可是足足花了三个月整理的” 始末 刚入职阿里的我收到了大学…...

跳槽时的决策逻辑是什么?

你好,我是辰洋,《郭东白的架构课》的项目负责人。 我们正文的第二个模块已经更新过半。之前已经预告过,东白老师会时不时邀请一些不同行业的技术领导者来交流与对话,为你提供更多的视角、更宽阔的视野和更多元的思考维度。 正值…...

vs2022下配置zxing cpp环境

生成zxing 下载zxing,zxing-cpp-master https://github.com/zxing-cpp/zxing-cpp Cmake生成项目,点Generate,把OpenCV_DIR修改了,NameValue没有报红就点Generate。然后点Open Project打开项目。 打开项目后,右击解决…...

【linux】linux入门级别指令

一些基础指令 前言用户登录新建用户 ls指令pwd命令cd 指令which指令alias指令touch指令mkdir指令rmdir指令 && rm 指令rmdirrm man指令cp指令mv指令catmoreless指令head 指令tail指令输出重定向时间相关的指令cal指令find指令grep指令zip/unzip指令tar指令bc指令uname指…...

Android 开发之核心技术点——性能优化篇(带面试题)~

性能优化对于Android开发的重要性非常大。随着Android设备的不断升级,用户对应用的要求也越来越高,包括应用的运行速度、响应速度、流畅度等方面。如果应用的性能不能满足用户的需求,很可能会导致用户流失、差评以及应用被卸载等情况。 另外…...

typescript全局安装卸载以及npm相关问题

全局安装 npm install -g typescript 全局安装之后,如果想要卸载要使用 npm uninstall -g typescript 全局安装之后可以在终端使用 tsc xxx 编译ts文件 本地安装,也就是在项目目录下安装 npm install typescript 本地卸载 npm uninstall type…...

一条SQL如何被MySQL架构中的各个组件操作执行的?

文章目录 1. 单表查询SQL在MySQL架构中的各个组件的执行过程2. SELECT的各个关键字在哪里执行?3. 表关联查询SQL在MySQL架构中的各个组件的执行过程4. LEFT JOIN将过滤条件放在子查询中再关联和放在WHERE子句上有什么区别?5. 聚集索引和全表扫描有什么区…...

Go语言面试题--进阶语法(30)

文章目录 1.下面的代码能否正确输出?2.下面代码输出什么?3.下面的代码有什么问题?4.下面代码有什么不规范的地方吗? 1.下面的代码能否正确输出? func main() {var fn1 func() {}var fn2 func() {}if fn1 ! fn2 {pri…...

JavaScript概述四(DOM文档对象模型)

1.DOM(Document Object Model) 会把网页里面的元素当成对象去操作,包含对象的属性,属性值,方便我们去 操作网页。 整个页面最终会形成一个对象 :document ,页面里面的所有的元素(如 标签 ) 最终都会转换成 js 里面的对象。 1.1 获取页面的元素(通过选择器&#xff0…...

【玩转client-go】如何获取 Kubernetes API 客户端的 *rest.Config 对象

目录 1. 使用 kubeconfig 文件 2. 使用 Kubernetes 集群内的 Service Account 3. 直接指定 API Server 的地址和认证信息 4. 使用 genericclioptions.NewConfigFlags() 总结 在使用 Kubernetes API 客户端——client-go 的过程中,我们通常需要获取 *rest.Config 配…...

保护模式段描述符

目前为止,内存还是分段模式,所以想要保护内存,就需要保存段。由于CPU的扩展导致了32位的段基地址和段内偏移,所以16位的段寄存器就无法放下这些信息。现在就需要把这些信息放到内存中,这些信息被封装成特定的段描述符。…...

两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 思路: 由于这道题目,输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可…...

原创文章生成器在线版-ai写作生成器

随着人工智能技术的迅猛发展,越来越多的人开始意识到,利用AI可以实现许多以前不可能想象的事情。其中,一种最能体现人工智能技术优势的应用就是“ai原创文章生成器”。它可以为营销从业者提供一种全新的营销推广方式。 那么,什么是…...

打造高性能CSS的九个技巧我是这么做的

在Web开发中,CSS是不可或缺的一部分。但是,如果CSS代码不够优化,会导致页面加载速度变慢,用户体验下降。以下是九个技巧,用于打造高性能的CSS代码。 避免使用通配符选择器:通配符选择器会匹配页面中的所有…...

python tqdm教程

文章目录 1. 搭配迭代器使用2. 设置动态数据打印3. 中途打印不干扰进度条4. 在jupyter中打印不干扰进度条5. 使用gui显示进度条6. 双循环嵌套进度条7. enumerate和tqdm搭配使用参考文献tqdm是python中打印进度条的一个简易工具包,可以方便查看循环的进度。具体见tqdm文档 1. …...

深度学习 - 41.Word2vec、EGES 负采样实现 By Keras

目录 一.引言 二.实现思路 1.样本构建 2.Word2vec 架构 3.EGES 架构 4.基于 NEG 的 Word2vec 架构 三.Keras 实现 Word2vec 1.样本构建 2.模型构建 3.向量获取 四.keras 实现 EGES 1.样本构建 2.模型构建 3.Dot Layer 详解 3.1 init 方法 3.2 call 方法 3.3 完…...

研发管理风险控制

软件研发过程中需要做好风险控制,保证项目按计划发布,下面说明一下个人对软件风险控制的看法 一、规划、技术选型、架构方面提前规避风险 1.选择最熟悉、使用最多的技术 “一个新项目里最好不要使用超过30%的新技术”,我觉得这句话是有一定…...

母婴品牌内容输出怎么做?“四板斧”送你

新媒体时代,信息大爆炸,人们的注意力有限,有噱头和亮点的内容才能博得注意,成为用户关注的焦点。 母婴行业重视品牌效益和产品的质量,毕竟类似“三聚氰胺”的惨剧谁也不希望再发生。母婴产品的质量依赖技术和生产线支…...

【视频】视频存储技术

1、NVR NVR是(网络硬盘录像机)的缩写。NVR最主要的功能是通过网络接收IPC(网络摄像机)设备传输的数字视频码流, 并进行存储、管理,从而实现网络化带来的分布式架构优势。简单来说,通过NVR,可以同时观看、浏览、回放、管理、存储多个网络摄像机。NVR是x86架构储存+监控软…...

【C/C++】MySQL 为什么选择 B+ 树作为底层数据结构

为什么MySQL底层数据结构选择B树?(而不是B树等其他数据结构) B树非叶子节点,不存放数据记录,仅存放指针与关键字,所以一个B树非叶子节点可以存放更多子节点信息,有利于降低树高度,从…...

17、嵌入式Servlet容器

文章目录 1、切换嵌入式Servlet容器1.1、默认支持的webServer1.2、切换服务器 2、原理2.1、ServletWebServerApplicationContext2.2、作用2.3、ServletWebServerFactoryAutoConfiguration2.4、作用2.5、ServletWebServerFactoryConfiguration 配置类2.6、web服务器工厂作用 3、…...

倾斜摄影三维模型转换3DTILTES格式遇到的常见问题

倾斜摄影三维模型转换3DTILTES格式遇到的常见问题 将倾斜摄影三维模型从OSGB格式转换为3DTILES格式时,常见的问题包括: 1、3D Tiles生成时间较长:由于3D Tiles是一种高效的地理数据存储格式,能够支持海量的空间数据呈现和查询&am…...

手机如何访问电脑文件?(iOS和Android)

可以通过手机访问电脑文件吗? “我需要在我的电脑上查看一个文件,但我现在在外面无法实际访问它。我可以通过手机访问我的电脑文件吗?” 答案当然是可以的,无论您使用的是iOS设备还是Android设备,您都可以通过手机…...

TI在物联网和AI边缘计算中落伍了吗?

摘要:本文介绍一下TI在边缘计算工作中所做的努力。 发明“人工智能”这个term的老头儿也不会想到人工智能在中国有多火。 不管是懂还是不懂,啥东西披上“人工智能“的面纱都能瞬间成为大项目。 学习AI 的年轻人认识NVIDIA,可能不太知道DSP是…...