事件(Events)是进程之间同步的静态对象。
事件发挥作用的过程分为两个阶段,即:
一个进程触发(trigger )事件,另一个进程等待事件被触发(triggered)。可以使用->操作符触发事件,使用@操作符或者wait()等待事件被触发
注意:其中@操作符会阻塞住所调用的进程直到触发给定的事件,所以等待进程必须先执行@语句,然后触发进程才能执行触发器操作符->。如果触发进程先执行,则等待进程会一直被阻塞。
而wait()操作覆盖则是监测触发事件是否曾被触发过,即使等待进程晚于触发进程也能接触阻塞。
wait_order是指等待所有指定的事件按照特定的顺序触发(从左到右)。例如wait_order(a,b,c)会一直等待事件a,b,c按顺序触发
bit success;
wait_order( a, b, c ) success = 1; else success = 0;
下面的示例显示了事件触发以及等待事件触发的两个过程
module events_ex;
event ev_1; //declaring event ev_1
initial begin
fork
//process-1, triggers the event
begin
#40;
$display($time,"\tTriggering The Event");
->ev_1;
end
//process-2, wait for the event to trigger
begin
$display($time,"\tWaiting for the Event to trigger");
@(ev_1.triggered);
$display($time,"\tEvent triggered");
end
join
end
endmodule
Simulator Output
0 Waiting for the Event to trigger
40 Triggering The Event
40 Event triggered
如果是先触发事件,然后再等待事件触发,那么等待触发之后的语句将不会被执行。
module events_ex;
event ev_1; //declaring event ev_1
initial begin
fork
//process-1, triggers the event
begin
#40;
$display($time,"\tTriggering The Event");
->ev_1;
end
//process-2, wait for the event to trigger
begin
$display($time,"\tWaiting for the Event to trigger");
#60;
@(ev_1.triggered);
$display($time,"\tEvent triggered");
end
join
end
initial begin
#100;
$display($time,"\tEnding the Simulation");
$finish;
end
endmodule
Simulator Output
0 Waiting for the Event to triggerSimulator Output
40 Triggering The Event
100 Ending the Simulation
这里如果不加上最后一个initial begin end进程,那么仿真就会一直hang。
作者:XinXinHu
原文链接:https://mp.weixin.qq.com/s/XH0BazPXPHBC\_\_Qrb5agSw
微信公众号:
授权转自数字芯片实验室公众号,请勿二次转载。
推荐阅读
更多数字IC设计技术干货等请关注数字芯片实验室专栏。