event e1,e2;
initial begin
$display("@%0t: 1:before trigger", $time);
-> e1;
@e2;
$display("@%0t: 1:after trigger", $time);
end
initial begin
$display("@%0t: 2:before trigger", $time);
->e2;
@e1;
$display("@%0t: 2:after trigger", $time);
end
event创建了两个对象,不需要new。触发e1时等待e2,触发e2时等待e1。打印结果为:
@0:1:before trigger
@0:2:before trigger
@0:1:after trigger
e1和e2在同一时刻被触发,但是由于delta cycle的时间 差是的两个 初始化块可能无法等到e1或者e2。
更加安全的方式使用event的方法triggered()。
event e1,e2;
initial begin
$display("@%0t: 1:before trigger", $time);
-> e1;
wait (e2.tregger);
$display("@%0t: 1:after trigger", $time);
end
initial begin
$display("@%0t: 2:before trigger", $time);
->e2;
wait (e1.tregger);
$display("@%0t: 2:after trigger", $time);
end
此时的打印结果为:
@0:1:before trigger
@0:2:before trigger
@0:1:after trigger
@0:2:after trigger
使用wait(e1.trigger())电平敏感来代替 边沿敏感的 阻塞语句@e1。留言功能
module road;
initial begin
sutomatic begin
byd.drive();
end
endmodule
class car;
bit static = 0;
task launch();
start = 1;
$display("car is launched");
endtask
task move();
wait(start == 1);
$display("car is moving");
endtask
task drive();
fork
this.launch();
this.move();
join
endtask
endclass
输出的结果car is launched
car is moving,并行 线程变为顺序触发信号。
尽管在ar::drive中同时启动了两个线程,通过共享信号car::start来判断什么时候可以行使。
如果将上述公共变量修改为event,那么通过事件的触发和判断也可以实现一样的需求。
class car;
event e_start;
task launch();
-> e_start;
$display("car is launched");
endtask
task move();
wait(e_start.triggered())