event是SystemVerilog語(yǔ)言中的一個(gè)強(qiáng)大特性,可以支持多個(gè)并發(fā)進(jìn)程之間的同步。
我們可以在一個(gè)進(jìn)程trigger這個(gè)event,同時(shí)在另外一個(gè)進(jìn)程等待這個(gè)event(邊沿敏感的@和電平敏感的wait)。
event的觸發(fā)語(yǔ)法非常簡(jiǎn)單,那就是“->”運(yùn)算符。
下面是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”中,我們聲明了一個(gè)名為“etrig”的event。
在時(shí)間10觸發(fā)它,然后在時(shí)間20觸發(fā)它。
“always”語(yǔ)句塊等待“etrig”上的觸發(fā)器,這是邊沿敏感的。像仿真log顯示的那樣,打印了2次邊沿觸發(fā)。
該module還展示了如何使用電平敏感的被觸發(fā)方式(wait)
wait (eventName.triggered);
wait(eventName.triggered)相比@的一個(gè)特點(diǎn)是不關(guān)心wait和"->"之間的執(zhí)行順序。
下面是另一個(gè)例子,展示多個(gè)event事件并行觸發(fā)控制:
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
在上面的例子中,會(huì)并行地觸發(fā)3個(gè)event(e1、e2、e3),分別控制3個(gè)獨(dú)立的進(jìn)程)。從仿真log可以看出,3個(gè)event被同時(shí)觸發(fā)。
event序列:wait_order ()
在SystemVerilog中我們還可以使用語(yǔ)法wait_order等待事件以特定的順序觸發(fā)。
例如,wait_order (eveA, eveB, eveC)等待事件按照順序eveA -> eveB ->eveC觸發(fā)。
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
在上面的例子中,在時(shí)間10時(shí)觸發(fā)etrig1,然后在時(shí)間20時(shí)觸發(fā)etrig2,然后在時(shí)間30再次etrig1。所以,事件的順序是
etrig1 - > etrig2- > etrig1。
審核編輯:湯梓紅
-
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110074 -
System
+關(guān)注
關(guān)注
0文章
165瀏覽量
36928 -
數(shù)據(jù)類型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13618
原文標(biāo)題:SystemVerilog中的event數(shù)據(jù)類型
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論