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

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

3天内不再提示

环境wait了一次为啥执行了两次?

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

前言

副标题 —— 验证环境中bus.mon.sig与@bus.mon同时使用的反面案例哈哈哈。这个bug是在是过于经典了所以每过一段时间我就会拿出来跟人聊聊,要是没有这个的激励,我一定不会走上记录bug的道路的。

事故现场

先来还原出错的场景。代码示意如下,验证环境构建于module中,这段代码的本意是希望对齐rtl的时钟沿,因此在wait到bus.mon.vld(bus是interface,mon是clocking block)后@时钟,之后从队列中取数进行处理,下面的代码我将取数调整成打印信息,本质都是执行一个操作:

initial begin
    forever begin
        wait (bus.mon.vld == 1'b1);
        @bus.mon;
        $display("%t, pop_front this cyc", $realtime);
    end
end

此时RTL的波形如下,vld信号置起一拍:

图片

当时出现的错误是,发现只有一拍的valid信号,但是却发生了两次取值行为,且发生在两拍,那么对应打印行为就是说发生了两次打印且在不同时刻:

2010.000ns, pop_front this cyc
2020.000ns, pop_front this cyc

为了进一步确定行为,在wait和@之后分别加入打印:

initial begin
    forever begin
        wait (bus.mon.vld == 1'b1);
        $display("%t, wait dao le!", $realtime);
        @bus.mon;
        $display("%t, pop_front this cyc", $realtime);
    end
end

打印结果为:

2010.000ns, wait dao le!
2010.000ns, pop_front this cyc
2010.000ns, wait dao le!
2020.000ns, pop_front this cyc

可以确定在2010ns时刻wait生效了2次,事故现场还原结束。

事故分析

明确下,这个现象是不符合代码本意的,本意应该是一拍有效取一个数据出来,那么接下来具体分析下为什么是这种现象,由本灵魂画手把波形画一下!

图片

顺便在把time slot的图搬出来对着看,因为环境搭建并启动于于module中,只需要module regions的就够了:

图片

那么在2010ns时间点,进程上在做哪些事呢?

1.2010ns ts之前的1ps(interface中设置的skew)采样rtl vld信号为1,在active-observed之间bus.mon.vld值跳变为1;
2.时钟bus.mon在observed域跳变为1;对应的时序结构如下图,那么也就不难发现为什么wait会判定成功2次了:

图片

时间线也就理清楚了:

*2010ns, bus.mon.vld跳变为1 -->
*wait(bus.mon.vld)在observed之前生效 -->
*@bus.mon成功(observed域)-->
*执行环境语句,不消耗时间,forever回wait语句 -->
*wait(bus.mon.vld)再次成功,此时仍为2010ns -->
*@bus.mon不成功(关于@和wait的区别请查询绿皮书吧),该进程等待在这里,等下一次bus.mon上升沿-->

  • 时间推进到2020ns,@bus.mon成功,再一次执行下面的语句。

责任划分

该波形是符合systemVerilog仿真规则的,但是不符合本人意图,最好就别这么搞。乖乖的@bus.mon (if bus,mon.vld) 是最安全的。

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

    关注

    1

    文章

    384

    浏览量

    59553
  • VLD
    VLD
    +关注

    关注

    0

    文章

    2

    浏览量

    7160
收藏 人收藏

    评论

    相关推荐

    个IO模拟串口的,外部中断进一次自动执行两次怎么解决?

    最近在做个IO模拟串口的。 外部中断进一次自动执行两次,而且实验发现,第一次进中断有问题,串口显示的内容不符合,第二
    发表于 05-11 08:35

    如何比较前后两次输入值的大小

    个循环不停的产生数据,如何实现比较前后两次数据的大小问题,如果两次相差小于1说明数据有效,那么就保留这次的值;反之如果前后数相差大于1说明数据无效,则继续取前
    发表于 11-02 20:04

    stc12c5a60s2的外部中断 为什么会执行两次外部中断函数???

    翻转。这不就是外部中断一次执行了两次外部中断函数??测试程序#include "stc12c5a60s2.h"***it LED = P2^3;***it KEY2 = P2^0
    发表于 05-23 14:59

    while循环只执行一次

    ); //延时5msif(key==0)flag=1;}}void main(){ anjian(); while(flag==1){**(); //某个函数}}调试发现while里面的函数只执行了一次,不知道问题出在哪里..
    发表于 11-13 13:15

    STM32F107以太网每次发数据都连发了两次

    ),不知道是为什么?已知应用层只发了一次,协议底层调接口也只调了一次,但MAC层却发了两次,是我使用以太网库的方式不对吗?另外有块207的板子,同样的依照官网例程移植,只发了
    发表于 07-01 04:35

    请问为什么我在C6455板子上跑EDMA完成中断会进入两次中断程序?

    执行中断的函数里加了打印语句printf("I'm datain_isr");,进行软件仿真时只打印一次,用板子跑的时候却打印两次,后在中断函数打断点发现中断函数
    发表于 05-22 08:49

    为什么串口DMA中断在接受一次数据时会进入两次中断呢

    为什么串口DMA中断在接受一次数据时会进入两次中断呢?其代码该如何去实现呢?
    发表于 12-07 07:26

    ARM按键中断时中断一次响应两次怎么回事

    ARM按键中断时中断一次响应两次怎么回事,调试时单步运行正常,全速时就出现这样的结果还有ARM按键中断时要求中断处理函数的第件事是清除
    发表于 07-14 11:53

    e203软件代码中断为什么会触发两次

    如图所示,然后串口输出得到的printf执行了两次(按一次按键触发两次中断) 如该图只按一次
    发表于 08-16 08:12

    关于一次仪表、二仪表、就地仪表、远传仪表的概念及区分

    计)转换成指针移动的机械能时,进行了第二能量转换就称为二仪表。换能的次数超过两次的往往都按两次称呼,如孔板测量流量,孔板本身是
    的头像 发表于 06-15 15:39 1.5w次阅读

    马斯克:4新冠病毒检测 两次阴性 两次阳性

    11月13日消息,据外媒报道,特斯拉CEO马斯克刚刚在社交网络上表示,今天做了4新冠病毒检测,检查结果两次为阴性两次为阳性。 马斯克表示,相同的机器,相同的测试,相同的护士,同样的抗原检测
    的头像 发表于 11-13 16:29 1787次阅读

    关于STM32F407一次事件触发两次中断

    关于STM32F407一次事件触发两次中断问题描述“bug的提出”“bug的解决”功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入段漂亮的代码片生成
    发表于 11-24 17:21 9次下载
    关于STM32F407<b class='flag-5'>一次</b>事件触发<b class='flag-5'>两次</b>中断

    Cortex-M3/M4内核处理器一次中断事件可能产生两次中断问题

    正常情况下一次红外遥控按键应该产生16外部中断。诊断代码却显示执行了32外部中断服务函数,也就是说一次中断事件,产生了
    发表于 01-25 19:00 3次下载
    Cortex-M3/M4内核处理器<b class='flag-5'>一次</b>中断事件可能产生<b class='flag-5'>两次</b>中断问题

    python怎么将list输入两次

    在Python中,有多种方法可以将个列表输入两次。下面是使用不同的方法来实现此功能的几个示例: 方法1: 使用循环将列表复制两次 这是种基本的方法,使用循环遍历列表并复制其元素
    的头像 发表于 11-21 16:17 1158次阅读

    说说TCP三握手的过程?为什么是三而不是两次、四

    而不是两次或四。 首先,我们需要了解TCP是种面向连接的协议。在进行数据传输之前,发送端和接收端需要建立个可靠的连接。TCP三
    的头像 发表于 02-04 11:03 476次阅读