说道systemverilog中的线程间通信,不得不说一下事件(event),事件也就两种:边沿阻塞(@ e)和电平阻塞(wait(e.triggered ()))。
1.事件通过-> 操作符来触发事件,通过@或者wait等待事件的触发。
2.@相当于Verilog中的边沿触发,@一定要先于->,@只在触发的那一瞬间有效 ,@而triggered是Verilog中的电平触发,只要事件触发后,triggered一直有效,triggered相当于事件的一个函数,使用方法:wait(e.triggered());
eg:
`timescale 1ns/1ns
event e;
initial
begin
fork
#10 -> e ;
# 20 @ e;
join
$dispaly("done");
end
该程序会阻塞在20ns时刻,不回输出“done”,因为触发信号只在10ns处有效。
initial
begin
fork
#10 @ e ;
# 20 -> e;
join
$dispaly("done");
end
该程序会在20ns处结束fork进程,并打印“done”。initial
begin
fork
#10 -> e ;
# 20 wait (e.triggered());
join
$dispaly("done");
end
会打印“done”。3.在循环中使用事件
在循环中使用wait一定小心,容易导致零延时死循环。如:
forever begin
wait(e.triggered()) //零延时循环 因为triggered是电平触发,一旦事件触发,会一直有效
end
但是用边沿触发就没事了,如:
forever begin
@e ;
end
申明:有些词是用我自己思维写出来的,不是官方的,如果表达不准确,请纠正也请原谅