0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM环境的看门狗怎么没看住超时了?

冬至配饺子 来源:芯时代青年 作者:尼德兰的喵 2023-12-04 11:42 次阅读

uvm验证环境里一般通过objection机制来控制仿真的结束,不过在机制之外,有时还需要通过看门狗来watchdog避免仿真环境挂死,watchdog配合objection一起来控制仿真的进行与结束。

我一直自诩为对环境watchdog这件事烂熟于心了,不过没想到这天还是被伤害到了。

事故背景

一个中规中矩的watchdog是怎么组织的呢?要明确一下watchdog发挥的作用,就是在objection的基础上进行补充,在环境长时间没有动静的情况下能够使环境报错推出并打印此时阻止仿真结束的罪魁祸首。

基于这个认识,watchdog应该是base_test的run_phase()中进行调用,这样既从时间全程参与又从空间上统揽全局。当然了,因为环境的主要行为集中在main_phase()中,所以把watchdog放在main_phase()中我觉得也是可以的。

task base_test::run_phase(uvm_phase phase):
super.run_phase(phase);
phase.raise_objection(this);

this.watchdog(phase);

phase.drop_objection(this);
endtask: run_phase

watchdog上下的objection还是很有必要的,毕竟你要保证watchdog无论在哪里调用都可以执行起来,别这个phase没有objection就直接略过了。

watchdog内部逻辑就是几个并行的线程,简单来说可以这样写:

task base_test::watchdog(uvm_phase phase):
#1000;
if(this.cfg.watchdog_en == 0) return;
while(1)begin
bit vr_reached;
fork: timeout
begin //normal finish
phase.phase_done.wait_for_total_count(null, 1);
vr_reached = 1;
end
begin //timeout
#this.cfg.watchdog_th;
`uvm_fatal("watchdog", $psprintf("watchdog timeout(%s_phase)::n %s", phase.get_name(), phase.phase_done.convert2string()))
end
#100 @prj_scoreboard::feed_watchdog;
#100 @harness.dut.hand_en;
#100 wait(this.env.num != 0);
join_any
disable timeout;

#10;
if(vr_reached && phase.phase_done.get_objection_tatal == 1)begin
`uvm_info("watchdog", $psprintf("watchdog timeout(%s_phase) normal reached", phase.get_name()), UVM_LOW)
break;
end
end
`uvm_note("watchdog", "watchdog Finished!", UVM_LOW)
endtask

代码的主体就是一个大的while(1)循环,循环内以fork - join_any的形式起多个喂狗线程,根据fork - join_any的机制,只要任何一个线程完成了都会触发喂狗机制。

*线程1:正常结束的线程,因为本身watchdog占着一个raise_objection,所以只要等待wait_for_total_count(null, 1)就可以了,为1说明其他的objection都已经drop了,那么就可以正常结束程序,和uvm本身的objection机制完全一样;

*线程2:超时线程,如果很长的时间里都没有喂狗,那么报fatal推出仿真。注意这里必须是fatal使方正立即结束,报error的话环境还是会挂死状态;

*线程3:所有的scoreboard都可以喂狗,因为scb里比对的一方是可以信任的环境预期,如果比对还在进行那么就说明仿真不应该结束;

*线程N:可以喂狗的其他线程,使用rtl线程需要万分谨慎,很有可能rtl里做错了一致重复出数据导致仿真无法结束;

当喂狗一次后,就可以杀掉timeout这个线程了,然后根据情况看看是否重新回到看门狗循环中。

事故现场

看门狗的核心起始就是,确定仿真在“动”,能动就是还活着不能结束仿真,所以在fork-join_any里除了超时线程以外,其他的都是证明系统还活着的“喂狗”线程。这些线程里如果使用rtl的信号作为系统还活着的参照,一定要万分的小心,万分的小心,万分的小心。

第一点小心是该停止但是停不下来,取材自上个月的bug。场景很简单,#100 @harness.dut.hand_en这个线程里hand_en做错了,进入了无限发包无限握手的死循环,带着环境也一直停不下来看门狗直接失效了。

第二点小心是该仿真但是挺下来了,这个事我以前就没想过能出现。事故现场是这样的还是#100 @harness.dut.hand_en这个线程(就是这么头铁,出过错了还继续用),这次确实是RTL正常的发包握手,但是,性能模式下外部没有反压拍拍握手成功,hand_en起来之后就没见到下降沿!这就导致了什么问题呢,导致@harness.dut.hand_en线程根本就触发不了!这就涉及到@和wait的区别了,@捕捉的是event trigger是信号的跳变,harness.dut.hand_en恒1不跳导致看门狗直接超时了。

简直目瞪口呆,只要每天比别人多碰到3个bug,两年能积累别人五年经验。

事故解决

我把@harness.dut.hand_en改成wait harness.dut.hand_en了

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 看门狗
    +关注

    关注

    10

    文章

    559

    浏览量

    70786
  • RTL
    RTL
    +关注

    关注

    1

    文章

    385

    浏览量

    59746
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    19160
  • Watchdog
    +关注

    关注

    0

    文章

    11

    浏览量

    9412
收藏 人收藏

    评论

    相关推荐

    独立看门狗(IWDG)的基础知识

      STM32F10xxx系列内置两个看门狗(独立看门狗和窗口看门狗),提供更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立
    发表于 10-19 17:10 4233次阅读
    独立<b class='flag-5'>看门狗</b>(IWDG)的基础知识

    STM32中的独立看门狗和窗口看门狗是什么

    在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立看门狗
    的头像 发表于 02-20 17:47 2704次阅读
    STM32中的独立<b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>是什么

    MCU独立看门狗和窗口看门狗的区别

    早期的MCU没有看门狗,就容易引起有些产品死机不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。
    发表于 03-03 09:18 766次阅读

    啥叫看门狗?如何合理的使用看门狗

    啥叫看门狗看门狗的工作原理是什么?看门狗看住哪些错误呢?看门狗叫后该咋整?具体咋喂看门狗呢?
    发表于 07-07 07:01

    stm32看门狗时间计算 独立看门狗和窗口看门狗的特性是什么

    本文为您讲解STM看门狗时间计算(时限)与频率计算,独立看门狗和窗口看门狗的特性、区别与联系。
    发表于 10-10 10:41 8753次阅读

    看门狗定时器的作用

    看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。 看门狗定时器的操作过程 使用时,WDT将递增,直到溢出,或称超时。除非处于休眠或空闲模式,WD
    发表于 10-20 14:41 6688次阅读

    什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析

    stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立看门狗
    的头像 发表于 11-06 11:48 2.7w次阅读
    什么是stm32<b class='flag-5'>看门狗</b>?独立<b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>工作原理解析

    STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)

    stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。看门狗主要作用是可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时
    发表于 11-09 17:17 8438次阅读
    STM32<b class='flag-5'>看门狗</b>配置(独立<b class='flag-5'>看门狗</b>IWDG和窗口<b class='flag-5'>看门狗</b>WWDG)

    stm32看门狗复位技巧编辑

    本文主要介绍stm32看门狗复位技巧,包括三个方面:判断是否需要使用、保证看门狗工作正常、保证看门狗复位时不会引起系统异常。stm32自带两个看门
    发表于 01-14 15:51 1.6w次阅读
    stm32<b class='flag-5'>看门狗</b>复位技巧编辑

    MCU独立看门狗与窗口看门狗的区别

    早期的MCU没有看门狗,就容易引起有些产品死机不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。为了满足更多使用场景,现在很多MCU都集成了两个看门狗:独立
    发表于 10-28 20:06 8次下载
    MCU独立<b class='flag-5'>看门狗</b>与窗口<b class='flag-5'>看门狗</b>的区别

    STM32:独立看门狗、窗口看门狗的配置

    STM32单片机的看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同。
    发表于 02-08 16:15 18次下载
    STM32:独立<b class='flag-5'>看门狗</b>、窗口<b class='flag-5'>看门狗</b>的配置

    STM32中的独立看门狗和窗口看门狗

    一、前言 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立
    的头像 发表于 12-22 16:58 2102次阅读

    STM32中的独立看门狗和窗口看门狗

    在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立看门狗
    的头像 发表于 01-30 14:38 1357次阅读
    STM32中的独立<b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>

    窗口看门狗增强了μP监控器

    看门狗定时器提高了基于微处理器的系统的可靠性。引脚可选的看门狗定时器允许看门狗超时周期可调,从而提供更大的灵活性,以满足不同的处理器时序要求。窗口
    的头像 发表于 05-08 11:23 1184次阅读
    窗口<b class='flag-5'>看门狗</b>增强了μP监控器

    UVM环境看门狗没看住超时是怎么回事?

    一个中规中矩的watchdog是怎么组织的呢?要明确一下watchdog发挥的作用,就是在objection的基础上进行补充,在环境长时间没有动静的情况下能够使环境报错推出并打印此时阻止仿真结束的罪魁祸首。
    的头像 发表于 12-05 10:15 694次阅读