• systemverilog学习 ---- 进程


    fork join

    fork join语句可以多个线程同时并发执行,最后要等待所有的线程完成。如下图所示:
    在这里插入图片描述
    只有当进程3执行完成后,才会跳转到statement-3执行。

    module fork_join;
    
    initial begin
        $display("------------------------------------------");
        fork
            //process 1
            begin
                $display($time,"\t Process 1 Started");
                #5;
                $display($time,"\t Process 1 Finished");
            end 
    
            //process 2
            begin
                $display($time, "\t Process 2 Started");
                #20;
                $display($time, "\t Process 2 Finished");
            end
        join
        $display($time, "\t Outside Fork-Join");
        $display("------------------------------------------");
        $finish;
    end
    
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    其仿真输出结果为:
    在这里插入图片描述

    fork join_any

    语句的并行执行,但是当其中任意一个进程结束后,都会执行fork join_any后面的语句。如下图示,当process -2 执行完成之后,就会执行statement - 3。但是没有执行完的进程还是会继续执行。

    在这里插入图片描述

    module fork_join;
    
    initial begin
        $display("------------------------------------------");
        fork
            //process 1
            begin
                $display($time,"\t Process 1 Started");
                #5;
                $display($time,"\t Process 1 Finished");
            end 
    
            //process 2
            begin
                $display($time, "\t Process 2 Started");
                #20;
                $display($time, "\t Process 2 Finished");
            end
        join_any
        $display($time, "\t Outside Fork-Join");
        $display("------------------------------------------");
        $finish;
    end
    
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    仿真输出结果是:
    在这里插入图片描述

    fork join_none

    在这里插入图片描述

    module fork_join_none;
      initial begin
        $display("-----------------------------------------------------------------");
        fork
          //Process-1
          begin
            $display($time,"\tProcess-1 Started");
            #5;
            $display($time,"\tProcess-1 Finished");
          end
          //Process-2
          begin
            $display($time,"\tProcess-2 Startedt");
            #20;
            $display($time,"\tProcess-2 Finished");
          end
        join_none
      
        $display($time,"\tOutside Fork-Join_none");
        $display("-----------------------------------------------------------------");
      end
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    其输出结果为:

    0 Outside Fork-Join_none
    -----------------------------------------------------------------
    0 Process-1 Started
    0 Process-2 Startedt
    5 Process-1 Finished
    20 Process-2 Finished
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    wait fork

    通过fork-join_any,我们执行完其中一个进程就能执行fork-join_any后面的语句,同时没完成的进程也会继续执行。问题是,当后面的语句出现如结束仿真的系统函数$finish时,很可能fork内部的进程没做完,就会结束仿真。

    module wait_fork;
     
      initial begin
        $display("-----------------------------------------------------------------");
        fork
          //Process-1
          begin
            $display($time,"\tProcess-1 Started");
            #5;
            $display($time,"\tProcess-1 Finished");
          end
     
          //Process-2
          begin
            $display($time,"\tProcess-2 Started");
            #20;
            $display($time,"\tProcess-2 Finished");
          end
        join_any
        $display("-----------------------------------------------------------------");
        $finish; //ends the simulation
      end
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    仿真结果如下:

    -----------------------------------------------------------------
    0 Process-1 Started
    0 Process-2 Started
    5 Process-1 Finished
    -----------------------------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这应该避免,为了解决这样的问题,我们可以使用wait fork。示例如下:

    module wait_fork;
    
    initial begin
    
    $display("----------------------------------------------------------");
    fork
        //process 1
        begin
            $display($time, "\t Process-1 Started");
            #5;
            $display($time, "\t Process 1 Finished");
        end
    
        //process 2
        begin
            $display($time, "\t Process 2 Started");
            #20;
            $display($time, "\t Process 2 Finshed");
        end
    join_any
    //wait fork;  // waiting for the completion of active fork threads
    
    $display("----------------------------------------------------------");
    $finish;   // ends the simulation
    end
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    其输出结果为:

    在这里插入图片描述

    disable fork

    在fork的block中,杀死或者终止一些活跃的进程。

    module  disable_fork;
    
    initial begin
        $display("----------------------------------------------------------");
        
        //fork-1
        fork
            //process-1
            begin
                $display($time,"\t Process-1 of fork-1 started");
                #5;
                $display($time,"\t Process-1 of fork-1 Finished");
            end
    
            //process-2
            begin
                $display($time, "\t Process-2 of fork-1 started");
                #20;
                $display($time, "\t Process-2 of fork-1 Finished");
            end
        join_any
    
        //fork-2
        fork
            //process-1
            begin
                $display($time,"\t Process-1 of fork-2 started");
                #5;
                $display($time,"\t Process-1 of fork-2 Finished");
            end
    
            //process-2
            begin
                $display($time, "\t Process-2 of fork-2 started");
                #20;
                $display($time, "\t Process-2 of fork-2 Finished");
            end
        join_none
        disable fork;
        $display("----------------------------------------------------------");
        $display($time,"\t After disable-fork");
        $display("----------------------------------------------------------");
    end
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    其输出结果为:
    在这里插入图片描述

  • 相关阅读:
    工程师常用的6种最佳实践
    基于惯性权值非线性递减的改进粒子群算法 - 附代码
    一文全面了解:react-antd-admin 如何封装 axios
    go经典知识及总结
    深信服AC流量管理技术
    全屋灯具选购指南,如何选择合适的灯具。福州中宅装饰,福州装修
    怎样自学黑客技术_黑客/网络安全入门资料
    Pandas数据处理分析系列3-数据如何预览
    c语言实现内存池
    11月5日 OpenCV 实战基础学习笔记——图像金字塔、轮廓、模板匹配
  • 原文地址:https://blog.csdn.net/weixin_45614076/article/details/126234950