本文主要是介绍fork...join、fork...join_none和fork...join_any的区别——systemverilog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;endfunctionfunction int run0();repeat(1) a++; endfunction:run0function int run1();repeat(100) b++;endfunction:run1function int run2();repeat(1000) c--;endfunction:run2
endclass:Testmodule tb;//定义测试模块test t[2];//声明3个Test句柄foreach(t[i]) t[i] = new();//创建3个Test对象// 1. fork...join块 initial beginforkt[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 beginforkt[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 beginforkt[0].run0();//repeat(1)t[1].run1();//repeat(100)t[2].run2();//repeat(1000)join_any//等待块中任一语句执行完,就会执行下面语句//在这里run(0)会最先执行完,它执行完后,就会执行下面语句$display("@%0d:我被执行了",$time);end
endmodule:tb
这篇关于fork...join、fork...join_none和fork...join_any的区别——systemverilog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!