概述
目录
学到的,要分享;赚到的,要回馈
关于fork ...join的用法理解:
关于fork...join_any的用法说明
关于fork…join_none的使用
关于fork ...join的用法理解:
需要等待线程全部结束,才能退出!
initial begin
$display("@%0t:start fork... join example", $time);
#10 $display("@%0t: sequential after #10", $time);
fork
$display("@%0t:parallel start", $time);
#50 $display("@%0t: parallel after #50", $time);
#10 $display("@%0t: parallel after #10", $time);
begin
#30 $display("@%0t: sequential after #30", $time);
#10 $display("@%0t: sequential after #10", $time);
end
join
$display("@%0t:
after
join", $time);
#80 $display("@%0t: finish after #80",$time);
end
仿真开始,首先是执行第一行代码,不消耗时间!
0ns时刻,执行 $display("@%0t:start fork... join example", $time);
10ns时刻,执行 $display("@%0t: sequential after #10", $time);
现在进入到fork ...join线程中。
10ns+0ns时刻,执行,$display("@%0t:parallel start", $time); 因为它没有延时。
10ns+10ns时刻,执行,$display("@%0t: parallel after #10", $time);为什么先执行这条语句,因为fork...join中都是并行执行,而且他的延时较短。
然后是begin ... end中,顺序执行,
10+10+30-10,执行,$display("@%0t: sequential after #30", $time);为什么要减去10ns的时间,是因为,执行,$display("@%0t: parallel after #10", $time); EDA仿真器已经消耗了10ns.
10+10+30+10-10,50ns时刻, 顺序执行,$display("@%0t: sequential after #10", $time);到目前为止已经消耗了50ns的时间;
接下来,执行
10+50ns,60ns时刻执行 $display("@%0t: parallel after #50", $time);并行执行
接下来,还是60ns时刻,执行$display("@%0t: after join", $time);
最后执行,60+80时刻, #80 $display("@%0t: finish after #80",$time);
关于fork...join_any的用法说明
fork..join_any中任意的一个子线程结束,退出线程,值得注意的是,其他的子线程继续执行。
initial begin
$display("@%0t:hi,tommi wei, please start fork... join_any example", $time);
#10 $display("@%0t: sequential after #10", $time);
fork
$display(
"@%0t: parallel start
", $time);
#50 $display("@%0t: parallel after #50", $time);
#10 $display("@%0t: parallel after #10", $time);
begin
#30 $display("@%0t: sequential after #30", $time);
#10 $display("@%0t: sequential after #10", $time);
end
join_any
$display("@%0t:
after fork
join_any", $time);
#80 $display("@%0t: finish after #80",$time);
end
0时刻,执行$display("@%0t:hi,tommi wei, please start fork... join_any example", $time);
10时刻,$display("@%0t: sequential after #10", $time);
进入到fork...join_any
10ns+0时刻,$display( "@%0t: parallel start ", $time);
退出fork...join_any
10+0+0,$display("@%0t: after fork join_any", $time);但是fork...join_any中还没有完成的子线程还需要努力工作,不,努力吃饭。
10+10,$display("@%0t: parallel after #10", $time);其实需要注意的是,fork...join_any进程是并行执行的!
进入begin ...end
10+10+30-10, 切记,并行执行,所有的子线程已经消耗了10ns,
执行#30 $display("@%0t: sequential after #30", $time);
10+30+10,执行 $display("@%0t: sequential after #10", $time);
最后,10+80时刻,因为initial语句中是顺序执行,所以,前面消耗的时间,并不影响最后一条语句的执行。$display("@%0t: finish after #80",$time);
关于fork…join_none的使用
就想是点火装置一样,一旦触发fork...join_none,就立即执行join_none 以后的话。
initial begin
$display("@%0t:hi,tommi wei, please start fork... join_none example", $time);
#10 $display("
@%0t: sequential after #10", $time);
fork
$display(
" @%0t: parallel start
", $time);
#50 $display(" @%0t: parallel after #50", $time);
#10 $display(" @%0t: parallel after #10", $time);
begin
#30 $display("@%0t: sequential after #30", $time);
#10 $display("@%0t: sequential after #10", $time);
end
join_none
$display(
"@%0t:
after fork
join_none", $time);
#80 $display(
"@%0t: finish after #80",$time);
end
0ns时刻,执行
$display("@%0t:hi,tommi wei, please start fork... join_none example", $time);
10时刻,执行,$display(" @%0t: sequential after #10", $time);
注意,细节!
10执行, $display( "@%0t: after fork join_none", $time);退出fork...join_none,执行的是fork...join_none之外的延迟语句!由于#80时间太长,先不管了。
10ns时刻,执行, $display( " @%0t: parallel start ", $time);
10+10,执行,$display(" @%0t: parallel after #10", $time);
进入begin...end
10+10+30-10ns, $display("@%0t: sequential after #30", $time);
10+30+10 $display("@%0t: sequential after #10", $time);
10+50 时刻,并行执行,所以执行$display(" @%0t: parallel after #50", $time);
10+80时刻,最后执行,$display( "@%0t: finish after #80",$time);
最后
以上就是娇气金针菇为你收集整理的【System Verilog and UVM基础入门03】线程的用法的全部内容,希望文章能够帮你解决【System Verilog and UVM基础入门03】线程的用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复