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

1、父线程、子线程

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

无延时情况下竞争问题:

  1.无延时情况下,主线程无延时语句优先于子线程无延时语句先执行

  2.无延时优先于#0(零延时),无延时语句优先于零延时语句先执行。

2、阻塞父线程

(1)调用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个子线程后才会执行父线程,输出为:

(2)、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

(3)、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

 3、结束子线程

(1)、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

(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

 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

 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

x

fork_join的更多相关文章

  1. FPGA学习

    (一)Verilog HDL语法 一.模块 1.定义:一个电路模块/一种逻辑功能: 2.命名规则:只能是字母,数字,"$",或者'_',且开头必须是字母或者"_" ...

  2. 对Verilog 初学者比较有用的整理(转自它处)

    *作者: Ian11122840    时间: 2010-9-27 09:04                                                              ...

  3. conductor Kitchensink示例

    一个示例的厨房工作流程,演示了所有模式构造的使用. 定义 { "name": "kitchensink", "description": & ...

  4. conductor 系统任务

    动态任务: 参数: dynamicTaskNameParam:来自任务输入的参数的名称,其值用于调度任务. 例如 如果参数的值为ABC,则调度的下一个任务类型为“ABC”. Example { &qu ...

  5. Verilog_Day2_Plus

    内容为书中第4章 等式运算符 “==” 与 “===” 的区别 Verilog中存在4种等式运算符: == (等于); != (不等于); === (等于); !== (不等于). “==”与&quo ...

  6. Java7 Fork-Join 框架:任务切分,并行处理

    概要 现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多.虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并 ...

  7. Verilog笔记.1.基本语法

    0.前 抽象模型分级: • 系统级(system):用高级语言结构实现设计模块的外部性能的模型.• 算法级(algorithm):用高级语言结构实现设计算法的模型.• RTL级(Register Tr ...

  8. verilog behavioral modeling--sequential and parallel statements

    1.Sequential statement groups the begin-end keywords: .group several statements togethor .cause the ...

  9. Verilog学习笔记基本语法篇(四)·········块语句

    块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...

随机推荐

  1. nuxt中iview按需加载配置

    在plugins/iview.js中修改 初始代码如下 import Vue from 'vue' import iView from 'iview' import locale from 'ivie ...

  2. Linux下Julia安装

    1.找到官网,执行 wget https://julialang-s3.julialang.org/bin/linux/x64/1.4/julia-1.4.0-linux-x86_64.tar.gz ...

  3. 《剑指offer》面试题67. 把字符串转换成整数

    问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数.   首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...

  4. 【Android】安卓四大组件之Activity(一)

    [Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...

  5. Rust 实现Netty HashedWheelTimer时间轮

    目录 一.背景 二.延迟队列-时间轮 三.Netty 时间轮源码分析 四.Rust实现HashedWheelTimer 五.总结思考 一.背景 近期在内网上看到一篇文章,文中提到的场景是 系统自动取消 ...

  6. Vue.js的指令、生命周期钩子与数据选项

    vue.js官网:https://cn.vuejs.org/v2/guide/components-registration.html 一.常用指令 v-if ... v-else: 作用:控制元素是 ...

  7. linux 常用命令。

    /* Linux常用命令? 1 查看 ls             展示当前目录下的可见文件   ls -a         展示当前目录下所有的文件(包括隐藏的文件)   ls -l(ll)     ...

  8. C++读写图片文件

    1.C方式 string sourcefilename = "D:\\Logo.jpg"; string destfilename="D:\\Logo1.jpg" ...

  9. 写程序时try,catch查看报错的行号

    try {    ////////////////    代码段   //////////////// }catch(Exception ex) {     MessageBox.Show(ex.St ...

  10. 做开源界的MATLAB,PyMiner 需要更多热爱开源的你加入

    MATLAB 和 Mathematica.Maple 并称为三大数学软件.它在数学类科技应用软件中在数值计算方面首屈一指.MATLAB 可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其 ...