在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4911|回复: 9

[讨论] 使用systemverilog的wait(event.triggered)遇到的疑惑

[复制链接]
发表于 2020-11-20 16:20:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近无意中翻到了路桑写的书里面对于wait(event.triggered)的一条限制,有点颠覆了自己的认知,原话大致是”对于线程多次通知的需求,应使用@,而无法使用wait(event.triggered)。这是由于,当一个event被触发时,它的状态使event.triggered一直保持为true(1'b1)“。

为此自己还特意做了一个小实验,实验内容大致是这样,
        fork
            begin
                #100ns;
                ->sync;
                `uvm_info("thread1","----- sync event trigger -----",UVM_NONE);
            end
            begin
                for(int k=0;k<3;k++)begin
                    #90ns;
                    wait(sync.triggered);
                    `uvm_info("thread2","----- get event -----",UVM_NONE);
                end
            end
            begin
                for(int i=0;i<3;i++)begin
                    #10ns;
                    wait(1);
                    `uvm_info("thread3","----- get event -----",UVM_NONE);
                end
            end
        join

实验结果如下,打印完这几句以后,仿真就hang住了,看起来像是hang在wait(sync.tiggered)的地方。倘若按照路桑这哥们的说法,事件sync触发然后被wait(sync.triggered)捕捉到以后,sync.triggered的状态就一直为1了,那么就会像thread3一样,thread2接下来就会继续执行剩余的两次,但是事实并非如此。所以到底是我理解错了,还是这书上的东西写错了,有没有同仁指点一下?
        [thread3] ----- get event -----
        [thread3] ----- get event -----
        [thread3] ----- get event -----
        [thread1] ----- sync event trigger -----
        [thread2] ----- get event -----

image.png
发表于 2020-11-21 01:44:17 来自手机 | 显示全部楼层
我不知道书上是怎么写的,实际应该是:一个event被触发,event.triggered变成TRUE,并一直保持到这个timeslot结束(所以避免了竞争问题)。而不是一直保持为TRUE。 不过人家既然能出书了,这个基本问题应该不会搞错。
发表于 2020-11-21 11:38:40 来自手机 | 显示全部楼层
我只讲一点,用forever begin wait(1== evt.triggered);  end仿真会卡死,而用forever begin @evt;  end就没问题。triggered是event的属性值,一旦被触发会持续到当前slot结束,所以你如果要用triggered属性的话,建议一定要手动加点延时,而@没这个要求。还有,有IEEE协议,看啥路桑,road桑,道桑的书?协议最准确最权威,再不行看s的ug,也比你看这个桑那个桑的书好。
 楼主| 发表于 2020-11-21 15:37:28 来自手机 | 显示全部楼层


dullman 发表于 2020-11-21 01:44
我不知道书上是怎么写的,实际应该是:一个event被触发,event.triggered变成TRUE,并一直保持到这个timesl ...


嗯,这也是解决了race问题的本质
 楼主| 发表于 2020-11-23 10:41:04 | 显示全部楼层


saipolo 发表于 2020-11-21 11:38
我只讲一点,用forever begin wait(1== evt.triggered);  end仿真会卡死,而用forever begin @evt;  end就 ...


呵呵,这个就要取决于自己怎么看带官方手册和书籍了,我的看法是官方发布的手册可以看作是字典,有需要的时候就去查,但是既然是字典的东西,肯定就是全而杂。别人写的书可以看作是经验总结,既然是总结,肯定就难免存在笔误或者见解上的差异。一个优秀的工程师应该是遵循“去其糟粕取其精华”的原则,然后消化为自己适用的东西。路桑这本书我个人觉得确实写得不太好,大段大段贴源码,或者是翻译手册,真正属于自己的见解并不是很多。
发表于 2020-11-23 19:33:30 | 显示全部楼层
你把2里面的#90去掉,2就能执行3次了
发表于 2021-7-24 15:56:09 | 显示全部楼层
小白是不可能从字典入手的,什么白皮书,红宝书,蓝皮书,不就是为了入门方便吗,不过入门了,感觉 要深入的话就得啃官方文档了
发表于 2021-7-26 10:17:22 | 显示全部楼层
书那里写错了,后来在公众号好像更正了
发表于 2021-7-26 14:55:27 | 显示全部楼层
        [thread3] ----- get event -----
        [thread3] ----- get event -----
        [thread3] ----- get event -----
        [thread1] ----- sync event trigger -----
        [thread2] ----- get event -----
我理解有问题吗 thread1要等100ns才打印一次,thread3是10ns打印一次。
thread1的打印之前,怎么只有3个thread3的打印呢,为什么不是10个呢?
发表于 2021-7-28 15:48:05 | 显示全部楼层


小科白菜 发表于 2021-7-26 14:55
[thread3] ----- get event -----
        [thread3] ----- get event -----
        [thread3] -- ...


thread3 不是总共就循环3次吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 11:55 , Processed in 0.044576 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表