UVM Heartbeat机制

news2024/11/23 23:54:25

1. 前言

在硬件电路中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗(Watchdog)。看门狗其实就是一个定时器电路。当看门狗启动后,计数器开始自动计数,经过一定时间,如果没有被清零,计数器溢出就会对CPU产生一个复位信号使系统重启(俗称“被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零(俗称“喂狗”),不让复位信号产生。如果系统不出问题,程序保证按时“喂狗”,一旦程序跑飞,没有“喂狗”,系统“被咬”复位。

2. Heartbeat作用

UVM heartbeat在UVM中充当类似看门狗定时器的角色,我们可以设定它的定时长度,也就是在这时间内必须要喂狗,还可以设定heartbeat要监控的组件。uvm_heartbeat 监视测试环境中组件的活动,如果发现在指定的时间间隔内没有活动,则 uvm_heratbeat 发出UVM_FATAL消息,导致模拟结束,可以在早期阶段检测仿真挂住,而不是在全局仿真超时到期时检测:

  • 这将有助于识别导致死锁的组件;
  • 通过提前终止仿真来节省仿真时间并释放资源;

既然uvm_heartbeat类似于看门狗,那么在使用上,只需要关注以下三件事:

  • 配置它的定时长度 (这段时间内没有喂狗就终止仿真)
  • 配置它需要监控的对象 (由哪些对象去喂狗)
  • 设置多长时间喂狗 (正常情况下这个时间要小于步骤1的定时长度,除非TB或RTL出问题了)

3. Heartbeat内置函数

uvm_heartbeat 类派生自 uvm_object,它提供一组内置方法来方便用户使用。有如下:

方法定义描述
 function new(string name, uvm_component cntxt, uvm_objection objection=null)uvm_heartbeat的构造函数,name指定当前instance的名字,cntxt通常传当前component的this就好了,objection是uvm_heartbeat监控的关键参数,其它components通过raise或drop这个objection来表示有activity。
function uvm_heartbeat_modes set_mode (uvm_heartbeat_modes mode = UVM_NO_HB_MODE)设置或检索heartbeat的模式,有以下4种模式:
1. UVM_ALL_ACTIVE  – all components are active
2. UVM_ONE_ACTIVE – only one component is active
3. UVM_ANY_ACTIVE – any component is active
4. UVM_NO_HB_MODE — disabled
function void set_heartbeat (uvm_event#(uvm_object) e, ref uvm_component comps[$])comps[$]传递需要监控的组件列表,e用于触发heartbeat检查,并启动heartbeat开始监视。1. 如果event e为空的话,则必须通过显示调用start()方法来启动监视。2. 如果用户需要更改event e,则必须使用stop()来停止监视,并且start()来使新event开始触发监视。
function void add (uvm_component comp)除了在set_heartbeat里可以传递要监控的组件,也可以单独通过add函数来添加监控组件。
function void remove (uvm_component comp)将监控组件从监控列表中移除
function void start (uvm_event#(uvm_object) e=null)启动heartbeat监控。
1. 如果 e 为空,则使用先前设置的事件。
2. 如果之前未设置任何事件,则会发出警告。
3. 如果触发的事件与正在运行的监视器的当前事件不同,则会发出错误。
function void stop ()停止heartbeat监视并可以使用 start() 方法调用启动。

注意:uvm_event e 必须定期触发,它会设置一个监视窗口。如果heartbeat监视器在该时间段内未发现任何活动,则会生成 HBFAIL UVM_FATAL消息。一般来说,事件e可以在无限循环中触发,作为一个永远持续的过程。

4. Heartbeat例子

根据heartbeat的作用和内置函数,举个使用例子。

第一步创建喂狗的uvm_objection实例(假设为uvm_objection obj=new(“obj”)),这个objection需要传递给uvm_heartbeat和所有被监控组件,被监控组件需要定期去raise这个obj来达到喂狗的目的。

第二步创建触发监控窗口的uvm_event实例(假设为uvm_event hb_e=new(“hb_e”)),这个event决定了多长时间去检查下是否有组件喂狗了,也就是raise objection。

第三步就是创建uvm_heartbeat实例(假设为uvm_heartbeat hb=new("hb", this, obj)),在这里把obj传递进去了。

第四步设置uvm_heartbeat的工作模式,比如hb.set_mode(UVM_ANY_ACTIVE)。

第五步设置uvm_heartbeat触发检查的event和检查对象,比如hb.set_heartbeat(hb_e,hb_comp)。这里面把event hb_e和监控组件列表comp传递给uvm_heartbeat了。

此时uvm_heartbeat就正式开始工作了,在hb_e每次被trigger()的时候,根据当前工作模式去检查各个被监控组件是否有调用过obj.raise_objection(this)。如果没有,就会停止仿真,表明验证环境有异常情况。另外一点大家主要注意的是,被监控的多个组件raise的objection是同一个,也就是obj这个实例,因此需要在上层创建好obj之后,把句柄传递给各个被监控组件去raise。

以下为uvm_heartbeat监控两个组件(compA和compB)的示意图,uvm_heartbeat模式为UVM_ALL_ACTIVE。第一张图,在检查窗口内,compA和compB都有喂狗,检查通过。第二张图,在检查窗口内,只有compB喂狗,compA没有喂狗,因此检查失败,会报出UVM_FATAL。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谁为软件质量负责?

如果我们直接问自己以下问题——谁负责软件质量,我们首先想到的就是——当然是测试人员!但这并不像看起来那么容易。 IT领域有几个特点,总是发生在软件测试的最后阶段,就在它发布之前。它们使我们不仅从软件的技术质量保证的角度…

学习JAVA打卡第四十一天

字符串与字符数组、字节数组 ⑴字符串与字符数组 String类的构造方法String(char a[])和String(char a[]),int offset,int length,分别用数组a中的全部字符和部分字符创建string对象。 String类也提供将string对象的字符序列存…

vray for Cinema 4D如何创建照片级真实室内效果?

在V-Ray for Cinema 4D中渲染 3D室内设计一开始可能会很困难,但您投入的努力总会得到回报。无论您的技术水平和创意眼光如何,在 V-Ray 中创建室内设计时都需要考虑很多事项。 在这篇博文中,我们将分享一些最佳实践,帮助您创建令人…

12-总结-从 0 开始搭建框架

项目结构: 一. 安装第三方库 # 下载源: https://pypi.tuna.tsinghua.edu.cn/simple/pip3 install flask2.3.2 pip3 install jinja23.1.2 pip install pymysql # 保持持久化pip install flask-script2.0.3 # 管理应用程序 pip install flask-sqlalchemy3.0.3 # 实现ORM映射…

高等数学之不定积分

由导函数推原函数就是不定积分 只是一个! 记得常数C!!! 不定积分的几何含义

基于TechGrow实现Hexo引流微信公众号

首发博客地址 https://blog.zysicyj.top/ # 前言 Hexo 博客建议安装 hexo-readmore (opens new window) 插件,将 TechGrow (opens new window) 的免费微信公众号引流工具整合到博客中,用户扫码关注微信公众号后可以解锁全站文章,让微信公众号…

基于乌燕鸥算法优化的BP神经网络(预测应用) - 附代码

基于乌燕鸥算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于乌燕鸥算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.乌燕鸥优化BP神经网络2.1 BP神经网络参数设置2.2 乌燕鸥算法应用 4.测试结果:5.Matlab代…

数字的画笔:数据可视化的魅力与实用性

数据可视化是一种强大的工具,用于将复杂的数据和信息以图形化的方式呈现,以便人们更容易理解、分析和发现其中的模式和趋势。通过图表、图形和其他可视元素,数据可视化可以帮助我们将抽象的数字转化为有意义的视觉呈现,从而提升了…

QT6安装完成后,再安装低版本的MinGW或其他组件方式

首先进入点击安装的uinstall Qt 并不是真的卸载 通过下面几步 1,首先登录自己账户 2,然后进入欢迎中,点击“添加和移除组件” 3,然后检索自己需要的安装内容

MDTA模块(Restormer)

From a layer normalized tensor Y ∈ R H ^ W ^ C ^ \mathbf{Y} \in \mathbb{R}^{\hat{H} \times \hat{W} \times \hat{C}} Y∈RH^W^C^, our MDTA first generates query ( Q ) (\mathbf{Q}) (Q), key ( K ) (\mathbf{K}) (K) and value ( V ) (\mathbf{V}) (V) project…

前端基础踩坑记录

前言:在做vue项目时,有时代码没有报错,但运行时却各种问题,没有报错排查起来就很费劲,本人感悟:写前端,需要好的眼神!!!谨以此博客记录下自己的踩坑点。 一、…

vue学习之hello world

依赖引入 <script src"https://unpkg.com/vue2.6.10/dist/vue.js"></script>Hello world 实现 <html><head><style></style></head><body><script src"https://unpkg.com/vue2.6.10/dist/vue.js">…

日志搞不定?手把手教你如何使用Log4j2

系列文章目录 从零开始&#xff0c;手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 SpringBean生成流程详解 —— 由浅入深(附超精细流程图) Spring监听器用法与原理详解 Spring事务畅谈 —— 由浅入深彻底弄懂 Transactional注解 面试热点详解…

Keepalived+Lvs(dr)调度器主备配置小实验

目录 前言 一、实验拓扑图 二、配置LVS&#xff08;dr&#xff09;模式 三、配置调配器热备 四、测试 总结 前言 Keepalived和LVS&#xff08;Linux Virtual Server&#xff09;是两个常用的开源软件&#xff0c;通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalive…

Mybatis查询一条数据

上一篇我们介绍了在pom文件中引入mybatis依赖&#xff0c;配置了mybatis配置文件&#xff0c;通过读取配置文件创建了会话工厂&#xff0c;使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。 如果您需要对上面的内容进行了解&#xff0c;可以参考Mybatis引入与使用…

【指标】指标公式大全,款款经典(建议珍藏)!-神奇指标网

三、指标源码&#xff1a; 1、连续三天高开高走的选股公式 count(o〉ref(c,1&#xff09;andc>o&#xff0c;3)3&#xff1b; 2、连续3天每天的最低价都比前一天高 count&#xff08;l〉ref(c,1&#xff09;,3)3&#xff1b; 3、周量缩小50%或40&#xff05;或n&#x…

帮助中心实践方式:及时提示反馈,引导自助解决

为了及时高效的帮助用户解决当下实际问题&#xff0c;很多产品都会专门设置一个独立的产品帮助中心&#xff0c;满足客户需要获取解决方案的需要&#xff0c;减轻人工客服端压力。 帮助中心实践方式 常规的帮助中心文档和用户群&#xff0c;解决的是用户遇到问题或者疑问时&am…

Zebec Protocol:模块化 L3 链 Nautilus Chain,深度拓展流支付体系

过去三十年间&#xff0c;全球金融科技领域已经成熟并迅速增长&#xff0c;主要归功于不同的数字支付媒介的出现。然而&#xff0c;由于交易延迟、高额转账费用等问题愈发突出&#xff0c;更高效、更安全、更易访问的支付系统成为新的刚需。 此前&#xff0c;咨询巨头麦肯锡的一…

基于纵横交叉算法优化的BP神经网络(预测应用) - 附代码

基于纵横交叉算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于纵横交叉算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.纵横交叉优化BP神经网络2.1 BP神经网络参数设置2.2 纵横交叉算法应用 4.测试结果&#xff1a;5…

基于grpc从零开始搭建一个准生产分布式应用(5) - MapStruct传输对象转换

分层设计中上下游间接口调用时&#xff0c;如果接口方法参数很多最好的方式是包装一个对象。但每层都有自己专用的对象&#xff0c;比如vo、bo、po等。在对象转换时需要写大量的getter和setter方法或是用deepCopy简化代码&#xff0c;但无论哪种都少不了大量的代码。 这里我们会…