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;
    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
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值