UVM Heartbeat机制

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。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UVM工厂机制是一种用于创建和管理UVM组件和对象的机制。它通过使用UVM工厂类(uvm_factory)来实现。\[1\]该工厂类是一个独特的对象,用于注册和创建UVM组件和对象。在UVM中,组件和对象的注册是通过使用宏来实现的,分别是uvm_component_utils和`uvm_object_utils。\[2\]这些宏将组件和对象注册到工厂中,以便在需要时可以通过工厂来创建它们。 使用UVM工厂机制创建组件和对象有两种方法。一种是通过继承uvm_component类或uvm_object类,并在类内重载方法来实现。这种方法本质上是借用工厂对象来创建组件和对象。\[1\]另一种方法是直接使用工厂方法来创建组件和对象。这需要使用全局唯一的uvm_factory类对象factory来调用工厂方法,并使用$cast进行类型转换。\[3\] 总之,UVM工厂机制提供了一种方便的方式来注册和创建UVM组件和对象,使得它们可以在需要时动态地创建和使用。 #### 引用[.reference_title] - *1* *3* [UVM:factory 机制](https://blog.csdn.net/Starry__/article/details/122930959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [UVM-工厂机制(factory)](https://blog.csdn.net/sinat_41774721/article/details/121763596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷公子的藏经阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值