event是SystemVerilog语言中的一个强大特性,可以支持多个并发进程之间的同步。
我们可以在一个进程trigger这个event,同时在另外一个进程等待这个event(边沿敏感的@和电平敏感的wait)。
event的触发语法非常简单,那就是“->”运算符。
下面是Systemverilog event的示例
module et; event etrig; initial begin #10; -> etrig; //trigger named event 'etrig' #10; -> etrig; //trigger named event 'etrig' end always @(etrig) //execute when event etrig is triggered //edge sensitive $display("@ etrig occurred at time %0t",$time); initial begin wait (etrig.triggered) ; //level sensitive 'wait' on the //event 'etrig' $display("'wait' etrig occurred at time %0t",$time); end endmodule
仿真log:
@ etrig occurred at time 10 'wait' etrig occurred at time 10 @ etrig occurred at time 20 V C S S i m u l a t i o n R e p o r t
在module“et”中,我们声明了一个名为“etrig”的event。
在时间10触发它,然后在时间20触发它。
“always”语句块等待“etrig”上的触发器,这是边沿敏感的。像仿真log显示的那样,打印了2次边沿触发。
该module还展示了如何使用电平敏感的被触发方式(wait)
wait (eventName.triggered);
wait(eventName.triggered)相比@的一个特点是不关心wait和"->"之间的执行顺序。
下面是另一个例子,展示多个event事件并行触发控制:
module et; event e1, e2, e3; initial begin #10; fork -> e1; -> e2; -> e3; join end always @(e1) $display("event e1 triggered at time %0t",$time); always @(e2) $display("event e2 triggered at time %0t",$time); always @(e3) $display("event e3 triggered at time %0t",$time); endmodule
仿真log:
event e1 triggered at time 10 event e2 triggered at time 10 event e3 triggered at time 10 V C S S i m u l a t i o n R e p o r t
在上面的例子中,会并行地触发3个event(e1、e2、e3),分别控制3个独立的进程)。从仿真log可以看出,3个event被同时触发。
event序列:wait_order ()
在SystemVerilog中我们还可以使用语法wait_order等待事件以特定的顺序触发。
例如,wait_order (eveA, eveB, eveC)等待事件按照顺序eveA -> eveB ->eveC触发。
module et; event etrig1, etrig2; initial begin #10; -> etrig1; //trigger named event 'etrig1' #10; -> etrig2; //trigger named event 'etrig2' #10; -> etrig1; //trigger named event 'etrig1' #100; end initial begin wait_order (etrig1 , etrig2); //OK $display("'wait' etrig1, etrig2 occurred at time %0t",$time); wait_order (etrig2 , etrig1); //OK $display("'wait' etrig2, etrig1 occurred at time %0t",$time); end endmodule
Simulation log:
'wait' etrig1, etrig2 occurred at time 20 'wait' etrig2, etrig1 occurred at time 30 V C S S i m u l a t i o n R e p o r t
在上面的例子中,在时间10时触发etrig1,然后在时间20时触发etrig2,然后在时间30再次etrig1。所以,事件的顺序是
etrig1 - > etrig2- > etrig1。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !