首页 > 其他分享 >sv fork_join

sv fork_join

时间:2023-09-25 10:13:44浏览次数:22  
标签:fork begin join sv 线程 执行 display

fork join

在systemverilog中可以用fork…… joinfork ……join_anyfork……join_none来实现多个线程的并发执行。

1、父线程、子线程

调用fork……join的线程为父线程,fork……join中并发执行的是子线程,子线程可有多个,父线程只有一个。

无延时情况下竞争问题:

  1. 无延时情况下,主线程无延时语句优先于子线程无延时语句先执行
  2. 无延时优先于#0(零延时),无延时语句优先于零延时语句先执行。

2、阻塞父线程

2.1 fork-join

调用fork……join会阻塞父线程,直到子线程全部结束,才会启动父线程。

program test;
    initial begin
        fork
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            #0 $display("child");  // fork下的子线程,并发执行
        join
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        #0 $display("father");    // begin块下的父线程,顺序执行
    end
endprogram

fork……join中有4个子线程,要执行完4个子线程后才会执行父线程,输出为:

img

2.2 fork-join_any

fork……join_any也会阻塞父线程,不过任意一个子线程结束后就执行父线程,且当父线程执行完所有的无延时语句后才会把权限交给子线程。遇到# N延时语句后子线程与父线程开始竞争。父线程有优先权,当父线程有权限后会优先执行完所有无延时语句,才会让子线程执行无延时语句。有延时语句父线程和子线程公开竞争。

program test;
    initial begin
        fork
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            #0 $display("child");  // fork下的子线程,并发执行
        join_any
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        #0 $display("father");    // begin块下的父线程,顺序执行
    end
endprogram

img

fork join_none

fork……join_none不会阻塞父线程,且执行完父线程无延时的语句后才会将权限交给子线程。遇到# N的延时语句后,子线程与父线程开始竞争。父线程有优先权,当父线程有权限后会优先执行完所有无延时语句,才会让子线程执行无延时语句。有延时语句父线程和子线程公开竞争。

program test;
    initial begin
        fork
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            #0 $display("child");  // fork下的子线程,并发执行
        join_none
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        #0 $display("father");    // begin块下的父线程,顺序执行
    end
endprogram

img

3、结束子线程

3.1 disable lable

disable lable结束lable所指定的线程和子线程。(可以结束fork,也可以结束begin)如果fork块进入多次,用disalbe lable的方式会结束所有的进程。比如一个task中有fork块,这个task调用多次,如果task中的某一次调用执行了disalbe语句,会disalbe掉多次调用的产生的所有线程。

program test;
    initial begin
        fork:fork1
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            $display("child");  // fork下的子线程,并发执行
            #0 $display("child");  // fork下的子线程,并发执行
            fork
                  $display("child");
            join
        join_none
        fork:fork2
              $display("child21");
              fork
                   #2 $dipslay("child22");
              join
              #2 display("child23");
        join_none
        #1 disable fork2;      // 1ns后,结束fork2下的子线程
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        #0 $display("father");    // begin块下的父线程,顺序执行
    end
endprogram 

img

3.2 disable fork

disable fork语句会结束disable fork所在进程所生成出的所以子线程,及子线程的子线程。

program test;
    initial begin
        fork:fork1
            $display("child");  // fork下的子线程,并发执行
            #2 $display("child");  // fork下的子线程,并发执行
            #2 $display("child");  // fork下的子线程,并发执行
            #2 $display("child");  // fork下的子线程,并发执行
            fork
                  #2 $display("child");
            join
        join_none
        fork:fork2
              $display("child21");
              fork
                   #2 $dipslay("child22");
              join
              #2 display("child23");
        join_none
        #1 disable fork;       // 1ns后,结束fork1和fork2下的子线程。
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        $display("father");    // begin块下的父线程,顺序执行
        #0 $display("father");    // begin块下的父线程,顺序执行
    end
endprogram 

img

4、等待进程结束

wait fork等待当前线程的所以子线程结束(不包括子线程的子线程。)

program automatic test;

    initial begin
        fork
            #99 $display("#99");   // 等待这个子线程
            fork
                #100 $display("#100"); // 不等待子线程的子线程
            join_none
        joine_none
        wait fork;
        $display("after waite");
    end

endprogram

img

5、for-fork:多线程的变量问题

1、copy变量应该在fork内,且copy给automatic变量,线程例化后,先初始化这些变量后再例化其他线程。
2、for-fork有变种,比如function中有fork,for来调用function

class cbk;

    task run();
        for(int i=0; i<10; i++)begin
            fork
                int j = i; // class 中的都是默认是automatic变量
                begin
                    #10ns; 
                    $display(j); 
                end
            join_none
        end
    endtask

endclass

标签:fork,begin,join,sv,线程,执行,display
From: https://www.cnblogs.com/yuandonghua/p/17727266.html

相关文章

  • python教程:调用svn status命令对提交的文件进行add状态过滤(只保存新增加的文件)
    需求说明编写一段python程序,用于对svnadd状态的文件进行过滤,并用列表对这些文件进行保存。代码实现以下是一个示例的Python程序,用于对SVN的svnstatus命令中状态为“A”(新增)的文件进行过滤,并将它们存储在一个列表中:importsubprocessdefget_added_files():added_fi......
  • linux教程:centos7安装svn 1.10客户端(subversion指定版本安装)
    repotee/etc/yum.repos.d/wandisco-svn.repo<<-'EOF'[WandiscoSVN]name=WandiscoSVNRepobaseurl=http://opensource.wandisco.com/centos/7/svn-1.10/RPMS/$basearch/enabled=1gpgcheck=0EOF在线安装yumcleanallyuminstall-ysubversion离线安装从如下地址......
  • 【7.0】Pandas csv读写文件
    【一】PythonPandas读取文件当使用Pandas做数据分析的时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda提供了多种读取数据的方法:read_csv()用于读取文本文件read_json()用于读取json文件read_sql_query()读取sql语句的,【1】CSV文件读......
  • golang 把内容写到 csv 文件或者 xlsx 文件里
    内容来自对chatgpt的咨询csv格式csv格式的文件使用wps或者office打开后是一个excel表格的形式,很容易看到表格里的数据。csv格式跟markdown格式有点像,只需要按照固定的语法放置文本,保存后,用对应的渲染软件打开,就能得到想要的效果。比如下面这段json,用文本编辑器......
  • Python处理CSV文件
    python处理CSV文件CSV文件CSV(comma-separatedvalues)文件是一种文本文件格式,允许以表格结构保存数据。这是一种流行的格式,用于从数据库和电子表格导出和导入数据,CSV文件中的每条数据都用逗号(,)分隔,例如,第一行数据可以选择用作标题,标明其下方的每一列数据:处理CSV文件CSV......
  • 深入了解Java中的StringJoiner类
    在Java编程中,字符串的拼接是一个常见的操作。Java提供了多种方法来实现字符串拼接,其中之一就是StringJoiner类。本文将详细介绍StringJoiner的用法和功能。StringJoiner简介StringJoiner是Java8引入的一个用于拼接字符串的工具类。它允许我们以指定的分隔符将一组字符串连接成一个......
  • Eclipse 安装SVN
    https://blog.csdn.net/weixin_49343190/article/details/112518794这个更靠谱https://blog.csdn.net/qq_45305209/article/details/118354171......
  • Hive学习3(数据库操作DML、join、hive函数)
    1.对数据库操作数据定义语言(DataDefinitionLanguage,DDL),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database、table等。DDL核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作。1.1创建数据库created......
  • SVN 学习
    SVNSVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。SVN属于C/S结构软件,分为客户端和服务器端服务端软件:VisualSVN网址:https://www.visualsvn.com/客户端软......
  • SVN服务器安装与常用操作(超详细)
    SVN服务器安装与常用操作(超详细)服务器1、下载SVN服务器,地址:http://subversion.apache.org/packages.html进入网址后,滚动到浏览器最底部看到如下截图:  点击,下载 2、在服务器把下载的VisualSVNserver双击安装,文件名:(VisualSVN-Server-4.3.3-x64.msi) 3、点击Next 选择......