一、线程
1、fork.....join:里面的线程并行执行,以begin...end为界线,当fork.....join里面所有的线程执行完之后才跳出fork.....join,执行后面的语句(主线程),begin...end里面的语句并行执行
示例:
module test;
initial begin
$display ("%t:AAAA",$time);
#10 $display ("%t:BBBB",$time);
fork
$display ("%t:CCCC",$time);
#50 $display ("%t:DDDD",$time);
#10 $display ("%t:EEEE",$time);
begin
#30 $display ("%t:FFFF",$time);
#10 $display ("%t:GGGG",$time);
end
join
$display ("%t:HHHH",$time);
#80 $display ("%t:IIII",$time);
end
endmodule
打印结果:
0:AAAA
10:BBBB
10:CCCC
20:EEEE
40:FFFF
50:GGGG
60:DDDD
60:HHHH
140:IIII
说明:
- fork...join中有4个并行的线程
2、fork...join_any:fork...join_any中任何一个线程结束,则会继续执行主线程,fork...join_any中还没执行完的线程会继续执行。
示例:
module test;
initial begin
$display ("%t:AAAA",$time);
#10 $display ("%t:BBBB",$time);
fork
$display ("%t:CCCC",$time);
#50 $display ("%t:DDDD",$time);
#10 $display ("%t:EEEE",$time);
begin
#30 $display ("%t:FFFF",$time);
#10 $display ("%t:GGGG",$time);
end
join_any
$display ("%t:HHHH",$time);
#80 $display ("%t:IIII",$time);
end
endmodule
打印结果:
0:AAAA
10:BBBB
10:CCCC
10:HHHH
20:EEEE
40:FFFF
50:GGGG
60:DDDD
90:IIII
3、fork_join_none:fork_join_none中的线程和主线程同时执行,不需要fork_join_none中任何一个线程完成。
示例:
module test;
initial begin
$display ("%0t:AAAA",$time);
#10 $display ("%0t:BBBB",$time);
fork
$display ("%0t:CCCC",$time);
#50 $display ("%0t:DDDD",$time);
#10 $display ("%0t:EEEE",$time);
begin
#30 $display ("%0t:FFFF",$time);
#10 $display ("%0t:GGGG",$time);
end
join_none
$display ("%0t:HHHH",$time);
#80 $display ("%0t:IIII",$time);
end
endmodule
打印结果:
0:AAAA
10:BBBB
10:HHHH
10:CCCC
20:EEEE
40:FFFF
50:GGGG
60:DDDD
90:IIII
说明:
- wait fork;该语句会等待前面的所有fork语句(包含前三种fork类型)执行完毕后才会继续执行后面的语句 。
-
disable fork;停止当前fork线程中未被执行的所有子线程,如果是fork...join_nany、fork...join_none后接disable fork,里面的线程会全部被杀掉。