ET创芯网论坛(EETOP)

您现在是游客状态

请您   登录   或  注册  享受更多权益

超低功耗免电池物联网方案合集(下载送好礼!)
查看: 1157|回复: 6

[求助] sv 关于事件 的vcs仿真

[复制链接]
发表于 2014-11-5 16:29:35 | 显示全部楼层 |阅读模式

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

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

x
工作环境:VCS Version G-2012.09_Full64仿真代码:
program wait_event;
  event a;

  //initial begin
  //  ->a;
  //end

  initial begin
    //#1;
    //@a;
    wait(a.triggered);
    $display("@%0t:a triggered!",$time);
  end

endprogram

说明:我想模拟两个线程并行运行的情况,其实主要是想理解“wait在给定时间段有效”这句话。
但是仿真过程中发现了例外:
上述程序,按照我本来的想法是,VCS会一直停留在wait(a.triggered);因为事件a一直没有触发。


但是仿真结果是VCS一执行wait(a.triggered);就退出了。实在0时刻退出。退出的时候不会执行后面的display
如果在wait之前加上#1就会在1时刻退出。退出的时候不会执行后面的display
如果在wait前使用@来等待事件a,发现仿真器会在执行@a的时刻退出。


另外,看一些sv的书籍中讲到tiggered是一个检查事件是否触发的一个函数,调用的时候是wait(a.triggered());
但是我在triggered后加上“()”后,工具会包包跨层次引用出错,不知为什么?


种种问题,希望能够得到高人指教。
谢谢
 楼主| 发表于 2014-11-6 09:28:26 | 显示全部楼层
版主和神人们能否帮我解答一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-12 16:13:00 | 显示全部楼层
似乎对这个现象有了一些理解:
1.SystemVerilog在执行的时候会根据程序中的initial执行情况自动退出,也就是说如果你的程序中如果没有明确的指定退出命令,例如:$finish,程序会在所有的initial执行完毕以后退出。这在<SystemVerilog验证>一书的4.3.6节有名确的描述。
2.个人认为程序在编译阶段,工具已经通过形式化分析方法已经分析出你的设计中是否可能出现触发事件,从而触发对应的wait这样的阻塞事件。如果分析出没有,则在对应点退出,从而避免了类似上述的死循环;如果有,程序执行并按照1执行。就好像形式验证工具进行等价性检验一样。
3.triggered是属性,而不是任务,所以这属于<SystemVerilog验证>这本书讲解上的错误。
回复 支持 反对

使用道具 举报

发表于 2014-11-12 19:21:00 | 显示全部楼层
我也遇到过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-14 09:29:50 | 显示全部楼层
回复 4# maochrng


   那为什么不帮我解答呢?
回复 支持 反对

使用道具 举报

发表于 2019-2-11 18:07:30 | 显示全部楼层
event被触发后多长时间后,就不能wait triggered了呢?
回复 支持 反对

使用道具 举报

发表于 2019-2-11 23:41:56 | 显示全部楼层
仿真器在执行完program里面的initial内容后会隐含调用$finish;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

小黑屋|手机版|Archiver|ET创芯网 ( 京ICP备:10050787号 京公网安备:110105001212 )

GMT+8, 2019-4-22 08:21 , Processed in 0.083829 second(s), 12 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表