前言
本文首先介绍SystemVerilog中的Events;其次记录了@操作符和wait()操作的区别;最后介绍了wait_order的用法。
一、事件(Events)
事件(Events)是进程之间同步的静态对象。
事件发挥作用的过程分为两个阶段,即:
一个进程触发(trigger )事件,另一个进程等待事件被触发(triggered)。可以使用->操作符触发事件,使用@操作符或者wait() 等待事件被触发。
下面的示例显示了事件触发以及等待事件触发的两个过程
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
仿真结果:
0 Waiting for the Event to trigger
40 Triggering The Event
40 Event triggered
二、@操作符和wait()操作的区别
其中@操作符会阻塞住所调用的进程直到触发给定的事件,所以等待进程必须先执行@语句,然后触发进程才能执行触发器操作符->。如果触发进程先执行,则等待进程会一直被阻塞。
而wait()操作覆盖则是监测触发事件是否曾被触发过,即使等待进程晚于触发进程也能接触阻塞。
如果是先触发事件,然后再等待事件触发,那么等待触发之后的语句将不会被执行。
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
仿真输出
0 Waiting for the Event to triggerSimulator Output
40 Triggering The Event
100 Ending the Simulation
这里如果不加上最后一个initial begin end进程,那么仿真就会一直持续。
三、wait_order
wait_order是指等待所有指定的事件按照特定的顺序触发(从左到右)。例如wait_order(a,b,c)会一直等待事件a,b,c按顺序触发 。
bit success;
wait_order( a, b, c ) success = 1; else success = 0;
总结
本文主要围绕systemverilog中,Events事件相关的用法进行了总结。