SystemVerilog - Event

2023-06-25
SystemVerilog

Event是靜態物件,用來同步兩個或更多個運行中的process,一個process會觸發Event,其他process等待(wait)這個event。

Event的宣告方式

1
2
3
Event evt;
Event evt2 = evt;
Event evt_empty = null;

Event的使用方式:

觸發Event: 用 ->->> 運算元
等待Event: 用 @ 運算元 或 .triggered

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module tb();
event evt;

initial begin
#10
->evt;
$display("1 t:%0t event triggered", $time);
end

initial begin
$display("2 t:%0t start to polling event", $time);
@evt;
$display("2 t:%0t reveived event trigger", $time);
end

initial begin
$display("3 t:%0t start to polling event", $time);
@evt;
$display("3 t:%0t reveived event trigger", $time);
end
endmodule

Output:

1
2
3
4
5
6
# 2 t:0 start to polling event
# 3 t:0 start to polling event
# 1 t:10 event triggered
# 3 t:10 reveived event trigger
# 2 t:10 reveived event trigger
# quit -f

@ 和 .triggered的差別

如果同一時間觸發event和等待event的話會有race condition的問題,如果是使用wait(event.triggered)可以避免發生問題

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
module tb();

event evt;

initial begin
#10
->evt;
$display("1 t:%0t event triggered", $time);
end

initial begin
$display("2 t:%0t start to polling event", $time);
#10
@evt;
// wait(evt.triggered);
$display("2 t:%0t reveived event trigger", $time);
end

initial begin
$display("3 t:%0t start to polling event", $time);
#10
// @evt;
wait(evt.triggered);
$display("3 t:%0t reveived event trigger", $time);
end
endmodule

Output:

1
2
3
4
5
6
# run 1000
# 2 t:0 start to polling event
# 3 t:0 start to polling event
# 1 t:10 event triggered
# 3 t:10 reveived event trigger
# quit -f

可以看見使用@evt的話,因為同一時間觸發Event和用@等待event,所以第二個initial block沒有收到event