sv 关于事件 的vcs仿真
时间:10-02
整理:3721RD
点击:
工作环境: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后加上“()”后,工具会包包跨层次引用出错,不知为什么?
种种问题,希望能够得到高人指教。
谢谢
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后加上“()”后,工具会包包跨层次引用出错,不知为什么?
种种问题,希望能够得到高人指教。
谢谢
小编和神人们能否帮我解答一下
似乎对这个现象有了一些理解:
1.SystemVerilog在执行的时候会根据程序中的initial执行情况自动退出,也就是说如果你的程序中如果没有明确的指定退出命令,例如:$finish,程序会在所有的initial执行完毕以后退出。这在<SystemVerilog验证>一书的4.3.6节有名确的描述。
2.个人认为程序在编译阶段,工具已经通过形式化分析方法已经分析出你的设计中是否可能出现触发事件,从而触发对应的wait这样的阻塞事件。如果分析出没有,则在对应点退出,从而避免了类似上述的死循环;如果有,程序执行并按照1执行。就好像形式验证工具进行等价性检验一样。
3.triggered是属性,而不是任务,所以这属于<SystemVerilog验证>这本书讲解上的错误。
我也遇到过
那为什么不帮我解答呢?