SystemVerilog基础:并行块fork-join、join_any、join_none(二)

相关阅读

SystemVerilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12517449.html


        在第一节中,我们讨论了并行块中的fork-join块和fork-join_any块,了解了它们的差异,本文将继续讨论fork-join_none块的使用。

        fork-join_none并行块拥有和普通的fork_join并行块一样的语句并行性质,即块内的语句在同一仿真时间执行,但它拥有一个特性,即完全不阻碍父线程的执行,下面是SystemVerilog标准中的解释。

         大意为fork-join_none并不会阻碍父线程的执行,也就是说父线程可以接着执行其他的语句,但标准仍然提供了一定的确定性,如上面的最后一句所说,fork-join_none块的语句不会执行,直到父进程遇到了一个阻塞语句或调度结束。

        上面的阻塞语句如何解释呢?是否是指阻塞赋值<=吗?其实不是的,这里的阻塞语句其实是指有过程语句前置时序控制的语句,即语句前有#,@或wait。在这里我们不讨论过程语句前置时序控制相关内容,它可以在以往的文章中找到(需要特别注意的是,这里的时序控制包括#0)。Verilog基础:延时模型_verilog延时模块-CSDN博客文章浏览阅读501次,点赞13次,收藏34次。Verilog基础专栏。_verilog延时模块https://blog.csdn.net/weixin_45791458/article/details/132579787?spm=1001.2014.3001.5502        下面我们来看几个例子,加深对fork-join_none块的理解。

例1
`timescale 1ns/1ns 
module test();
initial begin$display("Out of fork join_none1");$display("Out of fork join_none2");fork$display("In fork join_none1");$display("In fork join_none2");join_none$display("Out of fork join_none3");$display("Out of fork join_none4");
end
endmodule输出:
Out of fork join_none1
Out of fork join_none2
Out of fork join_none3
Out of fork join_none4
In fork join_none1
In fork join_none2

        例1的结果显示,fork-join_none并行块内的语句在最后才执行,因为当控制流执行到fork-join_none并行块时,会跳过fork-join_none并行块而查看后面的语句,直到遇到一个阻塞语句或begin-end块的结尾(调度结束),在例1中是指begin-end块的结尾(调度结束),才会去执行fork-join_none并行块内的语句。

        下面的例2展示了另一种情况,即遇到一个阻塞语句。

例2
`timescale 1ns/1ns 
module test();
initial begin$display("Out of fork join_none1");$display("Out of fork join_none2");fork$display("In fork join_none1");$display("In fork join_none2");join_none$display("Out of fork join_none3");#1 $display("Out of fork join_none4");
end
endmodule输出:
Out of fork join_none1
Out of fork join_none2
Out of fork join_none3
In fork join_none1
In fork join_none2
Out of fork join_none4

        当控制流执行到#1 $display("Out of fork join_none4");这个阻塞语句时,控制流会转去执行fork-join_none并行块内的语句。所以结果显示fork-join_none并行块内的语句在0ns仿真时间最后才被执行。

        现在出现了一个问题,当fork-join_none并行块的父线程是fork-join时,会出现什么情况?下面来看一个这样的例子。

例3
`timescale 1ns/1ns 
module test();
initial fork$display("Out of fork join_none1");$display("Out of fork join_none2");fork$display("In fork join_none1");$display("In fork join_none2");join_none$display("Out of fork join_none3");#1 $display("Out of fork join_none4");
join
endmodule

         为什么例3没有直接给出输出呢,因为它并没有一个确定的输出,fork-join块内语句的执行顺序是不定的,所以可能有多种情况发生。

1、如果fork-join_none并行块在#1 $display("Out of fork join_none4");后被调度,fork-join_none并行块内语句只有等到fork-end块调度结束时才会执行,体现的输出为

Out of fork join_none1 //前三个输出顺序是不定的
Out of fork join_none2
Out of fork join_none3
In fork join_none1     //这两个输出顺序是不定的
In fork join_none2    
Out of fork join_none4 //这个输出一定在最后(但它在fork-join_none并行块前调度)

2、如果fork-join_none并行块在#1 $display("Out of fork join_none4");前被调度,fork-join_none并行块内语句在等到#1 $display("Out of fork join_none4");被调度时就会执行,体现的输出为

Out of fork join_none1 //这五个个输出的顺序是不定的
Out of fork join_none2
Out of fork join_none3
In fork join_none1     
In fork join_none2    
Out of fork join_none4 //这个输出一定在最后(但它在fork-join_none并行块后调度)

       下面给出了几款常见的仿真器的输出结果。

对于Mentor Modelsim SE,输出结果为
Out of fork join_none1
Out of fork join_none2
In fork join_none1
In fork join_none2
Out of fork join_none3
Out of fork join_none4对于Aldec Riviera Pro,输出结果为
Out of fork join_none1
Out of fork join_none2
In fork join_none1
In fork join_none2
Out of fork join_none3
Out of fork join_none4对于Cadence Xcelium,输出结果为
Out of fork join_none1
Out of fork join_none2
In fork join_none1
In fork join_none2
Out of fork join_none3
Out of fork join_none4对于Mentor Questa,输出结果为
Out of fork join_none1
Out of fork join_none2
In fork join_none1
In fork join_none2
Out of fork join_none3
Out of fork join_none4对于Synopsys VCS,输出结果为
Out of fork join_none1
Out of fork join_none2
Out of fork join_none3
In fork join_none1
In fork join_none2
Out of fork join_none4

        从输出结果可以看出,Synopsys VCS似乎采取了情况1的处理方式,而其他仿真器使用了情况2的处理方式。这告诫了我们,不要写出这种令人费解的有不确定性的代码。

        下面展示了一个稍微复杂一些的例子作为题目,如果你看懂了上面的内容,你应该能预测它的输出。

例4
`timescale 1ns/1ns 
module test();
initial beginfor (int j=0; j<3; j++) begin fork$display(j);join_noneend
end
endmodule

        因为fork-join_none并行块需要等待父线程的调度结束后才执行,因此并不会在迭代时直接显示输出,而是等待for循环结束遇到begin-end块的结尾(调度结束)。

        输出结果为三个3。

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

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

相关文章

12.12_黑马数据结构与算法笔记Java

目录 079 优先级队列 无序数组实现 080 优先级队列 有序数组实现 081 优先级队列 堆实现 1 082 优先级队列 堆实现 2 083 优先级队列 堆实现 3 084 优先级队列 e01 合并多个有序链表1 084 优先级队列 e01 合并多个有序链表2 085 阻塞队列 问题提出 086 阻塞队列 单锁实…

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具&#xff0c;它能够帮助用户更好地了解和使用产品&#xff0c;提高用户体验。然而&#xff0c;创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法&#xff0c;帮助企业更好地为…

【JavaWeb学习笔记】10 - 手写Tomcat底层,Maven的初步使用

一、Maven 1.Maven示意图 类似Java访问数据库 2.创建Maven案例演示 配置阿里镜像 找到setting目录 但一开始配置不存在该文件 需要去Maven主目录下的conf拿到settings拷贝到上述目录 拷贝到admin/.m2后打开该settings 在<mirrors>内输入镜像地址 <mirror> …

Docker--Docker镜像仓库

一、搭建私有镜像仓库 搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址&#xff1a;https://hub.docker.com/_/registry &#xff08;一&#xff09;简化版镜像仓库 Docker官方的Docker Registry是一个基础版本的Docker镜像仓库&#xff0c;具备仓库…

线下实体门店引流,百万私域电商高手都在用的实战营销引流技巧!

线下实体门店引流&#xff0c;百万私域电商高手都在用的实战营销引流技巧&#xff01; 无论是初创公司还是已经在步入正轨的实体门店&#xff0c;有个现实的实例告诉你&#xff1a;互联网上90%的引流技巧告诉你的方法&#xff0c;其实都是不挣钱的&#xff0c;辛辛苦苦折腾一整…

大数据技术之Shell(超级详细)

大数据技术之Shell&#xff08;超级详细&#xff09; 第1章 Shell概述 Shell 是一种脚本语言&#xff0c;用于在操作系统的命令行界面&#xff08;CLI&#xff09;下执行命令和脚本。在大数据领域&#xff0c;Shell 脚本常用于编写数据处理和分析任务的自动化脚本&#xff0c…

Redis设计与实现之对象处理机制

目录 一、前言 二、对象处理机制 1、redisObject 数据结构&#xff0c;以及 Redis 的数据类型 2、 命令的类型检查和多态 3、对象共享 4、引用计数以及对象的销毁 三、对象的处理 1、Redis是如何处理字符串对象的&#xff1f; 2、Redis是如何处理列表对象的&#xff1f…

十九)Stable Diffusion使用教程:ai室内设计案例

今天我们聊聊如何通过SD进行室内设计装修。 方式一:controlnet的seg模型 基础起手式: 选择常用算法,抽卡: 抽到喜欢的图片之后,拖到controlnet里: 选择seg的ade20k预处理器,点击爆炸按钮,得到seg语义分割图,下载下来: 根据语义分割表里的颜色值,到PS里进行修改: 语…

制作一个简单 的maven plugin

流程 首先&#xff0c; 你需要创建一个Maven项目&#xff0c;推荐用idea 创建项目 会自动配置插件 pom.xml文件中添加以下配置&#xff1a; <project> <!-- 项目的基本信息 --> <groupId>com.example</groupId> <artifactId>my-maven-plugi…

深入理解JVM设计的精髓与独特之处

这是Java代码的执行过程 从软件工程的视角去深入拆解&#xff0c;无疑极具吸引力&#xff1a;首个阶段仅依赖于源高级语言的细微之处&#xff0c;而第二阶段则仅仅专注于目标机器语言的特质。 不可否认&#xff0c;在这两个编译阶段之间的衔接&#xff08;具体指明中间处理步…

javacv的视频截图功能

之前做了一个资源库的小项目&#xff0c;因为上传资源文件包含视频等附件&#xff0c;所以就需要时用到这个功能。通过对视频截图&#xff0c;然后作为封面缩略图&#xff0c;达到美观效果。 首先呢&#xff0c;需要准备相关的jar包&#xff0c;之前我用的是低版本的1.4.2&…

极简Excel公式拆分合并单元格并自动填充

例如这个表格&#xff1a; 我们希望拆分合并单元格&#xff0c;并填充到E列。结果如&#xff1a; 步骤 1&#xff09;在E2输入公式如下&#xff1a; LOOKUP(2,1/($B$2:B2<>""),$B$2:B2) 2&#xff09;下拉E2至E9将公式填充即可 注意&#xff1a;公式中的$…

基于ssm游戏美术外包管理信息系统源码和论文

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;线下管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

[Linux] Apache的配置与运用

一、web虚拟主机的构台服务器上运行多个网站&#xff0c;每个网站实际上并不独立占用整个服务器&#xff0c;因此称为"虚拟"虚拟主机的虚拟主机服务可以让您充分利用服务器的硬件资源&#xff0c;大大降低了建立和运营网站的成本 Httpd服务使构建虚拟主机服务器变得容…

基于SSM的志愿者管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

6.23删除二叉搜索树中的节点(LC450-M)

算法&#xff1a; 一共有五种可能的情况&#xff1a; 第一种情况&#xff1a;没找到删除的节点&#xff0c;遍历到空节点直接返回了找到删除的节点 第二种情况&#xff1a;左右孩子都为空&#xff08;叶子节点&#xff09;&#xff0c;直接删除节点&#xff0c; 返回NULL为根…

基于springboot乐器视频学习网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

讲座 | 颠覆传统摄像方式乃至计算机视觉的“脉冲视觉”

传统相机拍摄视频时其实是以一定帧率进行采样&#xff0c;视频其实还是一串图片的集合&#xff0c;因此低帧率时会觉得视频卡&#xff0c;拍摄高速运动物体时会有运动模糊等等问题。然而你能想象这一切都可以被“脉冲视觉”这一前沿技术改变吗&#xff1f; 今天下午听了北京大学…

【从零开始学习JVM | 第七篇】深入了解 堆回收

前言&#xff1a; Java堆作为内存管理中最核心的一部分&#xff0c;承担着对象实例的存储和管理任务。堆内存的高效使用对于保障程序的性能和稳定性至关重要。因此&#xff0c;深入理解Java堆回收的原理、机制和优化策略&#xff0c;对于Java开发人员具有重要的意义。 本文旨在…

C++相关闲碎记录(16)

1、正则表达式 &#xff08;1&#xff09;regex的匹配和查找接口 #include <regex> #include <iostream> using namespace std;void out (bool b) {cout << ( b ? "found" : "not found") << endl; }int main() {// find XML/H…