我是靠谱客的博主 娇气金针菇,最近开发中收集的这篇文章主要介绍【System Verilog and UVM基础入门03】线程的用法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

学到的,要分享;赚到的,要回馈

关于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】线程的用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部