fork........join 和 fork......join_none 和 fork......join_any
`timescale 1ns/1ps
program fork_test;
initial begin
#10 $display("the time is %t:start fork",$time);
fork
#10 $display("the time is %t:first",$time);
#50 $display("the time is %t:two",$time);
#30 $display("the time is %t:three",$time);
join //修改为 join_none join_any 分别进行仿真
$display("the time is %t:four",$time);
#20 $display("the time is %t:five",$time);
end
endprogram
其结果为
fork join的结果
fork join_any的结果
fork join_none的结果
在上述的三种情况的反正过程中,发现只有join的线程全部仿真完成,而 join_any和 join_none的结果中都有部分线程未完成仿真,其中 join_any中缺了显示two的仿真, join_none缺少了two和three的仿真,为什么出现这种情况呢?
最后,对其进行分析,判断是 initial begin end中的最后一条语句 #20 $display("the time is %t:five",$time)的仿真时间影响,在 join_any中执行完第一个线程时的仿真时间为20ns,则转到join_any的线程中执行 $display("the time is %t:four",$time);
#20 $display("the time is %t:five",$time); 当执行完时,仿真时间才为 40ns,则此时仿真结束。
这是因为initial中当执行完begin end中的最后一条语句时,自己会调用$finish进行仿真结束。所以为了让所有的线程全部仿真完成,需要对语句 #20 $display("the time is %t:five",$time)修改增加仿真时间,增加到线程two的仿真时间,比如#60即可,#60 $display("the time is %t:five",$time)。
修改完成之后的结果如下:
图中显示总的仿真时间为80ns,并且所有的线程都仿真完成,因此可以看出是由于initial中begin end最后语句的仿真时间问题,导致部分线程没有仿真完成,增加仿真时间即可。