前言
摘自绿皮书
1.1 fork…join
fork...join
块里的代码都是并发执行的,所以带短时延的语句执行得比带长时延的语句早。
语法很简单,没什么好讲的,但是和begin...end
结合的时候,则需要注意:
initial begin
A
#10 B
fork
C
#50 D
#10 E
begin
#30 F
#10 G
end
join
H
#80 I
end
0 : A
10: B
10: C
20: E
40: F
50: G // 注意这一点!!!!
60: D
60: H
140:I
本人在Modelsim SE10.7下跑的结果如下:
`timescale 1ns/1ps
module test;
initial begin
$display("@ %0t: A", $time);
#10 $display("@ %0t: B", $time);
fork
$display("@ %0t: C", $time);
#50 $display("@ %0t: D", $time);
#10 $display("@ %0t: E", $time);
begin
#30 $display("@ %0t: F", $time);
#10 $display("@ %0t: G", $time);
end
join
$display("@ %0t: H", $time);
#80 $display("@ %0t: I", $time);
end
endmodule
# @ 0: A
# @ 10000: B
# @ 10000: C
# @ 20000: E
# @ 40000: F
# @ 50000: G
# @ 60000: D
# @ 60000: H
# @ 140000: I
1.2 fork…join_none
fork...join_none
块在调度其块内语句时,父线程继续执行。:即注意下面的H
的执行!
initial begin
A
#10 B
fork
C
#50 D
#10 E
begin
#30 F
#10 G
end
join_none
H
#80 I
end
执行结果:
0 : A
10: B
10: H
10: C
20: E
40: F
50: G
60: D
90: I
1.3 fork…join_any
fork...join_any
块对块内语句进行调度,当第一个语句完成后,父线程才继续执行,其他停顿的线程也得以继续。
initial begin
A
#10 B
fork
C
#50 D
#10 E
begin
#30 F
#10 G
end
join_any
H
#80 I
end
执行结果:
0 : A
10: B
10: C
10: H
20: E
40: F
50: G
60: D
90: I