绿皮书笔记:System Verilog 验证 第七章 线程以及线程间的通信

fork........join 和 fork......join_none 和 fork......join_any

`timescale 1ns/1ps

program fork_test;

 initial begin
  #10 $display("the time is %t:start fork",$time); 
   fork
     #10 $display("the time is %t:first",$time);
     #50 $display("the time is %t:two",$time);
     #30 $display("the time is %t:three",$time);
   join  //修改为 join_none  join_any 分别进行仿真
     $display("the time is %t:four",$time);
     #20 $display("the time is %t:five",$time);
  end

endprogram

其结果为

fork   join的结果

fork   join_any的结果

fork   join_none的结果

       在上述的三种情况的反正过程中,发现只有join的线程全部仿真完成,而 join_any和 join_none的结果中都有部分线程未完成仿真,其中 join_any中缺了显示two的仿真, join_none缺少了two和three的仿真,为什么出现这种情况呢?

       最后,对其进行分析,判断是 initial begin end中的最后一条语句  #20 $display("the time is %t:five",$time)的仿真时间影响,在 join_any中执行完第一个线程时的仿真时间为20ns,则转到join_any的线程中执行     $display("the time is %t:four",$time);
     #20 $display("the time is %t:five",$time); 当执行完时,仿真时间才为 40ns,则此时仿真结束。

        这是因为initial中当执行完begin end中的最后一条语句时,自己会调用$finish进行仿真结束。所以为了让所有的线程全部仿真完成,需要对语句 #20 $display("the time is %t:five",$time)修改增加仿真时间,增加到线程two的仿真时间,比如#60即可,#60 $display("the time is %t:five",$time)

    修改完成之后的结果如下:

       图中显示总的仿真时间为80ns,并且所有的线程都仿真完成,因此可以看出是由于initial中begin end最后语句的仿真时间问题,导致部分线程没有仿真完成,增加仿真时间即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值