分析下面的程序,正确的打印结果是( )
fork
begin
#20
$display("A");
end
begin
#10
$display("B");
end
join_none
#5 $display("C");
解析:
fork...join结构提供了创建并行进程的能力。在Systemverilog里主要有三种版本:
- fork...join (join all)
- fork...join_none
- fork...join_any
fork-join:同verilog中的fork-join一样,要等到最后一个进程退出才返回
fork-join_none:直接返回,没有等任何进程完成
fork-join_any:在第一个进程完成后就返回了
例如,在下面代码中,
module fork_join_tests; integer out_val ; initial begin fork begin //First process #5 $display(“exit first process at t = %0d”,$time) ; end begin //Second process #10 $display(“exit second process at t = %0d”,$time) ; end join $display(“exit fork join at t = %0d”,$time) ; end endmodule //fork_join_tests输出结果为:
exit first process at t = 5 exit second process at t = 10 exit fork join at t = 10当上面的代码中的join被join_any替换时,则显示输出:
exit first process at t = 5 exit second process at t = 10 exit fork join at t = 5
fork-join_any在第一个进程完成后退出,也就是说,在5个时间单位退出。
当join_none替换join时,则显示以下输出:
exit first process at t = 5 exit second process at t = 10 exit fork join at t = 0fork-join_none不同等待其中任何一个进程完成,也就是说,在时间单位0时退出。
上述题用了fork...join_none,因此不用等待任何一个进程,在时间单位0直接退出,所以打印顺序为:CBA
summary
总体来说,三种形式各有用处,但在绝大多数情况下又可以用其中一种实现其他两种。 但在fork-join_none的应用范畴更广一些,在并行进程数不定的情况下需要用它才能实行并行。
参考:
全部评论
(1) 回帖