fork…join、fork…join_none和fork…join_any都可用于实现并行块,下面详述其间差异,并用代码解释区别。
fork…join
在最后一条块内语句执行完毕后,fork…join块才执行完毕,程序才会继续执行后续代码
fork…join_none
在fork…join_none块执行的同时,父线程会继续执行。通俗的说就是如果代码是顺序执行,如begin…end,在fork…join_none块执行的同时,还会执行fork…join_none块之后的语句。
fork…join_any
在块中任一条语句执行结束时,就会执行父线程。也就是说,块中最先执行完的语句结束时,程序就会运行fork…join_any块之后的语句。
代码分析
class Test;//封装测试类
int a,b,c;
function new;
a = 0;b = 0;c =0;
endfunction
function int run0();
repeat(1) a++;
endfunction:run0
function int run1();
repeat(100) b++;
endfunction:run1
function int run2();
repeat(1000) c--;
endfunction:run2
endclass:Test
module tb;//定义测试模块
test t[2];//声明3个Test句柄
foreach(t[i]) t[i] = new();//创建3个Test对象
// 1. fork...join块
initial begin
fork
t[0].run0();//repeat(1)
t[1].run1();//repeat(100)
t[2].run2();//repeat(1000)
join
//等待run(3)执行完毕,fork...join执行完毕,才执行下面语句
$display("@%0d:我被执行啦",$time);
end
// 2. fork...join_none块
initial begin
fork
t[0].run0();//repeat(1)
t[1].run1();//repeat(100)
t[2].run2();//repeat(1000)
join_none
//不会等待fork...join_none块执行完,就会执行下面语句
$display("@%0d:我被执行了",$time);
end
// 3.fork...join_any块
initial begin
fork
t[0].run0();//repeat(1)
t[1].run1();//repeat(100)
t[2].run2();//repeat(1000)
join_any
//等待块中任一语句执行完,就会执行下面语句
//在这里run(0)会最先执行完,它执行完后,就会执行下面语句
$display("@%0d:我被执行了",$time);
end
endmodule:tb