目录
fork join用来提起并行的线程,只能用于仿真验证,不可综合。
fork join 的三种用法:
1、fork join
同时提起所有线程,并等所有的线程都执行结束后再往下执行;
2、fork join_any
同时提起所有线程,有任何一个线程执行结束后就往下执行,不必等所有的线程都执行完;
3、fork join_none
同时提起所有线程,并立即往下执行,不会等任何一个线程执行完。
fork join基本用法:
task test();
fork:aaa //aaa 为fork的名字
begin
thead_1();
end
begin
thead_2();
end
begin
thead_3();
end
join
endtask:test
wait fork
等待当前进程所有子进程,但不包括子进程的子进程,执行完后才会往下执行。
disable fork
终止当前进程的所有子进程,包括子进程的子进程。
一道fork join的经典面试题:
现在有定义好的三个子线程do1,do2,do3,在task中并行运行这三个子线程,其中只要有任何一个线程结束,都退出并行运行块,并打印DONE。要求分别用fork-join、fork-join_any,fork-join_none来实现。
//用fork join实现
task test();
fork : tag
begin
sub1();
disable tag;
end
begin
sub2();
disable tag;
end
begin
sub3();
disable tag;
end
join
$display("done");
endtask : test
//用fork join_any实现
task test();
fork:tag
sub1();
sub2();
sub3();
join_any
disable tag;
$display("done");
endtask : test
//用fork join_none实现
task test();
event e;
fork : tag
begin
sub1();
-> e;
end
begin
sub2();
-> e;
end
begin
sub3();
-> e;
end
join_none
@ e;
disable tag;
$display("done");
endtask : test