fork_join
在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的更多相关文章
- FPGA学习
(一)Verilog HDL语法 一.模块 1.定义:一个电路模块/一种逻辑功能: 2.命名规则:只能是字母,数字,"$",或者'_',且开头必须是字母或者"_" ...
- 对Verilog 初学者比较有用的整理(转自它处)
*作者: Ian11122840 时间: 2010-9-27 09:04 ...
- conductor Kitchensink示例
一个示例的厨房工作流程,演示了所有模式构造的使用. 定义 { "name": "kitchensink", "description": & ...
- conductor 系统任务
动态任务: 参数: dynamicTaskNameParam:来自任务输入的参数的名称,其值用于调度任务. 例如 如果参数的值为ABC,则调度的下一个任务类型为“ABC”. Example { &qu ...
- Verilog_Day2_Plus
内容为书中第4章 等式运算符 “==” 与 “===” 的区别 Verilog中存在4种等式运算符: == (等于); != (不等于); === (等于); !== (不等于). “==”与&quo ...
- Java7 Fork-Join 框架:任务切分,并行处理
概要 现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多.虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并 ...
- Verilog笔记.1.基本语法
0.前 抽象模型分级: • 系统级(system):用高级语言结构实现设计模块的外部性能的模型.• 算法级(algorithm):用高级语言结构实现设计算法的模型.• RTL级(Register Tr ...
- verilog behavioral modeling--sequential and parallel statements
1.Sequential statement groups the begin-end keywords: .group several statements togethor .cause the ...
- Verilog学习笔记基本语法篇(四)·········块语句
块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...
随机推荐
- test_6 python的列表去重
1.使用内置函数set() set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 2.创建一个空的列表进行比较,把不重复的元素添加到新的列表中 #co ...
- python实现掘金定时签到抽奖
python实现掘金定时签到抽奖 一. 概述 这里记录一下使用 python 实现掘金定时签到抽奖.首先需要登录掘金,进入签到页面,按 F12 打开浏览器的调试面板,选择 Network,选择 XHR ...
- Ubuntu 18.04 server安装+搭建Seacms v10.1网站
0x00 写在前面 以前我天真的认为,ubuntu Desktop会安装了,server就无所谓了,其实完全不然,server还是有一些坑点的. 之所以选择Seacms搭建网站,是因为这个SeaCMS ...
- 《剑指offer》面试题63. 股票的最大利润
问题描述 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = ...
- 字节一面:事务还没提交的时候,redolog 能不能被持久化到磁盘呢?
又是被自己菜醒的一天,总结面经看到这题目听都没听过,打开百度就像吃饭一样自然 老规矩,背诵版在文末.点击阅读原文可以直达我收录整理的各大厂面试真题 首先,咱需要明白的是,啥是持久化? 听起来高大上,换 ...
- Android开发 定时任务清理数据
原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...
- IoC容器-Bean管理(bean作用域)
IoC操作Bean管理(bean作用域) 1,在Spring里面,设置创建bean实例是单实例还是多实例 2,在Spring里面,默认情况下,bean是单实例对象 3,如何设置单实例还是多实例 (1) ...
- 解决for循环中空格的问题
[root@node-01 ~]# cat 1 a b c ab cd 如果想按行循环遍历出文件中内容,直接使用for是有问题的,第一行按空格分隔的会有问题 [root@node-01 ~]# for ...
- bom案例1-div拖拽
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 隐式意图&显示意图
1 隐式意图 通过指定一组动作或者数据 开启activity 2 显示意图 通过指定具体包名和类名 开启activity 总结 (1)显示意图更加安全一些 ( ...