systemverilog中fork..join, join_any, join_none的用法和解析

news2024/11/18 3:23:40

1、fork.. join, join_any以及join_none的用法进行总结

1.1、   fork..join

        fork..join: 必须等到statement1,statement2,statement3全部执行完之后,statement4才可以执行。fork…join内的所有语句都是并发执行(对于begin…end内部是顺序执行)
示例:

//---------fork...join-------------
initial begin
	$display("@ %0t: start fork...join example", $time);
    #10 $display("@ %0t: sequential after # 10", $time);
	fork
		$display("@ %0t: parallel start", $time);
		#50 $display("@ %0t: parallel start # 50", $time);
		#10 $display("@ %0t: parallel after #10", $time);
		begin
			#30 $display("@ %0t: sequential after # 30", $time);
			#10 $display("@ %0t: sequential after # 10", $time);
		end	
	join
	$display("@ %0t: after join", $time);
	#80 $display("@ %0t: finish after # 80", $time);
end

程序运行结果:

@ 0: start fork...join_any example
@ 10: sequential after # 10
@ 10: parallel start
@ 10: after join_any
@ 20: parallel after #10
@ 40: sequential after # 30
@ 50: sequential after # 10
@ 60: parallel start # 50
@ 90: finish after # 80

1.2、fork..join_any

        fork..join_any: 等到statement1,statement2,statement3之中任何一个执行完毕之后,statement4才可以执行。一旦fork…join_any内任何一个线程完成,父线程就会继续运行。fork…join_none块在调度其块语句时,父线程继续执行。

//---------fork...join_any-------------
initial begin
	$display("@ %0t: start fork...join_any example", $time);
    #10 $display("@ %0t: sequential after # 10", $time);
	fork
		$display("@ %0t: parallel start", $time);
		#50 $display("@ %0t: parallel start # 50", $time);
		#10 $display("@ %0t: parallel after #10", $time);
		begin
			#30 $display("@ %0t: sequential after # 30", $time);
			#10 $display("@ %0t: sequential after # 10", $time);
		end	
	join_any
	$display("@ %0t: after join_any", $time);
	#80 $display("@ %0t: finish after # 80", $time);
end

程序运行结果:

1.3、fork..join_none

        fork..join_none: statement4的执行与否不依赖于statement1,statement2和statement3,他们可以同步执行。子线程和父线程会同时执行。

//---------fork...join_none-------------
initial begin
	$display("@ %0t: start fork...join_none example", $time);
    #10 $display("@ %0t: sequential after # 10", $time);
	fork
		$display("@ %0t: parallel start", $time);
		#50 $display("@ %0t: parallel start # 50", $time);
		#10 $display("@ %0t: parallel after #10", $time);
		begin
			#30 $display("@ %0t: sequential after # 30", $time);
			#10 $display("@ %0t: sequential after # 10", $time);
		end	
	join_none
	$display("@ %0t: after join_none", $time);
	#80 $display("@ %0t: finish after # 80", $time);
end

运行结果如下:

@ 0: start fork...join_none example
@ 10: sequential after # 10
@ 10: after join_none
@ 10: parallel start
@ 20: parallel after #10
@ 40: sequential after # 30
@ 50: sequential after # 10
@ 60: parallel start # 50
@ 90: finish after # 80


 

在使用过程中经常需要多线程操作,多线程的正确写法为:

for(int i=0;i<3;i++)begin
    fork
        automatic idx = i
        begin
            `uvm_do(do[i]);
        end        
    join_none
end

        这样就完成了一个简单的多线程,这里为什么要用automatic关键字定义idx,可以参考下面的详细解释。

2、局部数据存储 automatic作用

        Verilog中由于任务中局部变量会使静态存储区,当在多个地方调用同一个任务时,不同线程之间会窜用这些局部变量。

        Systemverilog中,module和program块中,缺省使用静态存储;如果想使用自动存储,需加入automatic关键词。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浪涌保护器10/350us和8/20us是什么意思,两者有何区别?

在选择浪涌保护器的时候&#xff0c;浪涌保护器的防雷能力放电电流后面的单位一般是KA&#xff0c;KA后面还有个参数是10/350us或者8/20us&#xff0c;大家可能对这2个参数不太熟悉。 那么&#xff0c;浪涌保护器10/350us和8/20us是什么意思&#xff0c;两者有何区别呢&#x…

025 - max()函数

MAX() 函数: MAX 函数返回一列中的最大值。NULL 值不包括在计算中。 SQL MAX() 语法: SELECT MAX(column_name) FROM table_name; 注释&#xff1a;MAX 也可用于文本列&#xff0c;以获得按字母顺序排列的最高或最低值。 -- 实际操作&#xff08;查询salary的最大值&#x…

【十万个等保小知识】等保测评报告是在等保整改之后发吗?

等保2.0政策已经严格落地执行了一段时间&#xff0c;但大家对于等保2.0政策还存在很多疑问&#xff0c;例如等保测评报告是在等保整改之后发吗&#xff1f;今天我们小编就来为大家简单回答一下&#xff0c;仅供参考哦&#xff01; 等保测评报告是在等保整改之后发吗&#xff1f…

uniapp echarts 点击失效

这个问题网上搜了一堆&#xff0c;有的让你降版本&#xff0c;有的让你改源码。。。都不太符合预期&#xff0c;目前我的方法可以用最新的echarts。 这个方法就是由npm安装转为CDN&#xff0c;当然你可能会质疑用CDN这样会不稳定&#xff0c;那如果CDN的地址是本地呢&#xff1…

【数据库】将excel数据导入mysql数据库

环境&#xff1a;Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件&#xff0c;删除表头行并另存为并更改编码方式&#xff08;由于与数据库的编码不同&#xff0c;会导致导入报错&#xff09; 通过命令行登录数据库 winr cmd进入 进入装mysql的目录位…

css中的bfc是什么?

什么bfc&#xff1f; BFC&#xff08;Block Formatting Context&#xff09;块级 格式化 上下文。 BFC就是页面上的一个隔离的独立盒子&#xff0c;容器里面的子元素和外面的元素不会相互影响。 为什么要bfc? bfc是我们去主动触发的,并不是自动就存在的,它是帮助我们解决cs…

Zabbix报警机制、配置钉钉机器人、自动发现、主动监控概述、配置主动监控、zabbix拓扑图、nginx监控实例

day02 day02配置告警用户数超过50&#xff0c;发送告警邮件实施验证告警配置配置钉钉机器人告警创建钉钉机器人编写脚本并测试添加报警媒介类型为用户添加报警媒介创建触发器创建动作验证自动发现配置自动发现主动监控配置web2使用主动监控修改配置文件&#xff0c;只使用主动…

修改el-select或者el-input样式失效

下午改el-input和el-select这两个的样式真的烦&#xff0c;&#xff0c;&#xff0c;还不如写原生标签了。。 样式使用的是sass 我已经在样式器中挨着挨着去找了&#xff0c;把层级的类都写下来了 .select-wraper{//下拉框.el-select{.el-input .el-input__wrapper{backgrou…

复习之vsftp服务

一、vsftp服务简介 文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层 即应用层&#xff0c; 使用 TCP 传输而不是 UDP&#xff0c; 客户在和服务器建立连接前要经过…

浅说React-Dnd的使用

前言(学习原因) 近期在工作中遇到一个新的需求&#xff1a;具体大概效果看下面.gif 当时看到这个需求经师兄提醒知道了React-Dnd&#xff0c;想到了表格 Table - Ant Design里有一个可拖拽表格的效果&#xff0c;照搬到了项目里发现不太能满足我们的需求&#xff0c;就去搜了一…

逆波兰表达式求值

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

语义检索系统【全】:基于Milvus+ERNIE+SimCSE+IBN实现学术文献语义检索系统完整版

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

PCB添加二维码

PCB添加二维码 1、PCB上添加二维码 在PCB上添加二维码&#xff0c;可以清楚的展示PCB板子的信息&#xff0c;包括&#xff1a;制板人员、时间以及这个板子所用的仪器。 2、如何在PCB上添加二维码&#xff08;错误示例&#xff09; 首先说一种错误的方法&#xff0c;试了很多…

RS232转Profinet网关rs232串门转网门接法

在工业自动化领域&#xff0c;如何将扫码枪与PLC连接一直是一个重要的问题。而今天&#xff0c;我们将通过一个案例来展示如何通过RS232转Profinet网关&#xff0c;将X-9300扫码枪接入到PLC1200工业以太网总线上。在这个过程中&#xff0c;我们将会用到捷米的RS232自由协议转Pr…

文件系统的基本认知笔记

1.什么是文件系统 常规认知&#xff1a;Linux下的根目录文件系统是操作系统用于明确存储设备&#xff08;常见的是磁盘&#xff0c;也有基于NAND Flash的固态硬盘&#xff09;或分区上的文件的方法&#xff0c;即在存储设备上组织文件的方法&#xff0c;这种所谓的方法就是文件…

Linux【网络编程】之深入理解TCP协议

Linux【网络编程】之深入理解TCP协议 TCP协议TCP协议段格式4位首部长度---TCP报头长度信息 TCP可靠性&#xff08;确认应答&#xff09;&& 提高传输效率确认应答(ACK)机制32位序号与32为确认序号 16位窗口大小---自己接收缓冲区剩余空间的大小16位紧急指针---紧急数据处…

Unity 使用SharpZipLib解压时报错

报错信息&#xff1a; NotSupportedException: Encoding 936 data could not be found. Make sure you have correct international System.Text.Encoding.GetEncoding (System.Int32 codepage) ICSharpCode.SharpZipLib.Zip.ZipConstants.ConvertToString。 出现问题分析&…

三种简单易用的制作符合要求的证件照片的方法

在生活和学习中&#xff0c;我们经常需要上传一些证件照片。但是在准备上传之前&#xff0c;我们可能会发现底色不正确&#xff0c;这会导致无法通过审核。重新拍照既费时间又浪费金钱&#xff0c;这让人感到非常困扰。然而&#xff0c;我们可以借助一些方法和工具来轻松更改证…

Java作业1

1.编写程序数一下 1到 100 的所有整数中出现多少个数字9 十位 n/10 个位 n%10 public static void main(String[] args) {int count 0;for (int i 1; i < 100; i) {if(i / 10 9){count;}if(i%109){count;}}System.out.println(count);} 2.给定一个数字&#xff0c;判…

过滤器,监听器与拦截器的区别

过滤器&#xff0c;监听器与拦截器的区别 ​ 过滤器和监听器不是Spring MVC中的组件&#xff0c;而是Servlet的组件&#xff0c;由Servlet容器来管理。拦截器是Spring MVC中的组件&#xff0c;由Spring容器来管理 ​ Servlet过滤器与Spring MVC 拦截器在Web应用中所处的层次如…