systemverilog中阻塞和非阻塞事件以及同步

一、SV中非阻塞事件

module test;

event ev1, ev2;

//belong to logic function part
always@(ev1)
$display("ev1 triggered at %0ts", $time);

initial wait(ev2.triggered)
$display("ev2 triggered at %0ts", $time);

//belong to stimulus
initial begin
->> #5 ev1; //"->>": non-blocking event, delay 5 cycle triggering the event
end

initial begin
->> @(ev1) ev2;       //event ev1 and ev2 will triggered simutaneous,but ev1 is earlier.
end

endmodule

//Makefile
comp:
vcs -sverilog Synchronous multi-events.sv -l comp.log
run:
./simv -l run.log
clean:
\rm -rf csrc simv* *.log

//run.log
ev1 triggered at 5s

ev2 triggered at 5s

//--------------------------------------------------------------------------------------------------------------


二、SV中阻塞事件

program p;

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

endprogram

//Makefile
comp:
vcs -sverilog *..sv -l comp.log
run:
./simv -l run.log
clean:
\rm -rf csrc simv* *.log

//run.log
@0: 1: before trigger

@0: 2: before trigger

@0: 1: after trigger

#解釋:

兩個initial塊同一時刻執行,但即便是在同一時刻運行也有先後順序,按照書寫順序從上到下運行(試驗過兩個initial塊前後位置調換,結果恰好相反),即,同一時刻事件e1先執行完,在@e2處等待,同時呢,事件e2也被觸發,雖然在同一時刻,但由於e1早於e2被觸發,所以,後續e2的觸發是@e2繼續執行,但當到@e1時,由於此時事件e1已經被觸發,程序會堵在@e1處。呈現如上log中的結果。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章