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

news2024/9/22 15:06:16

相关阅读

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 begin
    for (int j=0; j<3; j++) begin 
        fork
            $display(j);
        join_none
    end
end
endmodule

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

        输出结果为三个3。

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

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

相关文章

Ubuntu 常用命令之 ll 命令用法介绍

ll是ls -l的别名&#xff0c;用于在Ubuntu系统中列出目录的详细信息。ls命令用于列出目录内容&#xff0c;-l选项则以长格式显示&#xff0c;包括文件类型、权限、链接数、所有者、组、大小、最后修改时间以及文件或目录名。 这是ll命令的基本格式 ll [选项]... [文件]...这是…

《地理信息系统原理》笔记/期末复习资料(9. 网络地理信息系统)

目录 9. 网络地理信息系统 9.1. 概述 9.1.1. 网络GIS概念 9.1.2. 网络GIS体系结构 9.1.3. 网络GIS内容体系 9.2. 分布式网络GIS 9.2.1. 分布式网络GIS概念 9.2.2. 分布式主要技术 9.3. WebGIS 9.3.1. WebGIS概念 9.3.2. WebGIS分类与特点 9.3.3. WebGIS技术框架 9…

Graphics Profiler 使用教程

GraphicsProfiler 使用教程 1.工具简介&#xff1a;2.Navigation介绍2.1.打开安装好的Graphics Profiler。2.2.将手机连接到计算机&#xff0c;软件会在手机中安装一个GraphicsProfiler应用(该应用是无界面的&#xff09;。2.3.Show files list2.4.Record new trace2.4.1.Appli…

Kotlin ArrayList类型toTypedArray转换Array

Kotlin ArrayList类型toTypedArray转换Array data class Point(val x: Float, val y: Float)fun array_test(points: ArrayList<Array<Point>>) {points.forEachIndexed { idx, ap ->ap.forEach {print("$idx $it ")}println()} }fun main(args: Arra…

第二届“奇安信”杯网络安全技能竞赛Reverse | pyre(需要用到反编译工具 pyinstxtractor.py)

赛题描述 这种exe文件怎么调用py的库&#xff1f; 题目附件&#xff1a;&#xff08;下载可能会有问题&#xff0c;记得直接跳过下载就可以了&#xff09; 抱歉无法处理您这个问题哦&#xff0c;您可以换个问题 PyInstaller Extractor 解包 适用场景 制作exe后丢失源代码 前…

基于中小微企业_个体工商户的信贷评分卡模型和用户画像(论文_专利_银行建模_企业调研)

背景介绍 信用贷款是指由银行或其他金融机构向中小微企业和个体工商户提供的一种贷款产品。该贷款的特点是无需提供抵押品或担保&#xff0c;主要依据借款人的信用状况来进行评估和审批。 中小微企业和个体工商户信用贷款的申请流程相对简单&#xff0c;申请人只需要提供个人…

Zebec 推出由 Visa、万事达网络支持的即时支付卡

“Zebec 现已推出全新的加密支付卡&#xff0c;该卡由 Visa、万事达网络支持&#xff0c;具备即时、多链、非托管、无需 KYC、免费等特性&#xff0c;其能够通过加密钱包与多条主流公链链接并直接调用支付&#xff0c;这将是加密支付领域的里程碑事件。” 在 2023 年的 12 月 8…

冗余备份组网——HSRP和GLBP协议

目录 HSRP&#xff08;思科私有协议&#xff09; HSRP基本概念 HSRP工作过程 HSRP的状态 HSRP的可靠性 HSRP相关配置 GLBP协议 HSRP&#xff08;思科私有协议&#xff09; HSRP基本概念 HSRP&#xff08;Host Standby Router Protocol&#xff09;为主机备份路由协议 …

B037-Mybatis基础

目录 为什么需要Mybatis&#xff1f;mybatis简介入门案例其余见代码查询流程增删改流程 - 变动数据要加事务去持久化抽取公共类 mapper接口开发规则概述代码 mapper.xml引入本地约束文件别名日志管理作用log4j的使用规范 井大括号与dollar大括号的区别 框架&#xff1a;半成品&…

C# OpenVINO 直接读取百度模型实现图片旋转角度检测

目录 效果 模型信息 代码 下载 C# OpenVINO 直接读取百度模型实现图片旋转角度检测 效果 模型信息 Inputs ------------------------- name&#xff1a;x tensor&#xff1a;F32[?, 3, 224, 224] --------------------------------------------------------------- Ou…

[RTOS移植]--STM32F767移植RTThread

文章目录 通过STM32cube创建一个工程选择要移植的RTOS源下载到本地如果没有重启软件选择对应配置后续补充 通过STM32cube创建一个工程 选择要移植的RTOS源 下载到本地 如果没有重启软件 选择对应配置 Build started: Project: STM32F767 *** Using Compiler V5.06 update 7 (b…

Self-Attention的学习

文章目录 Self-Attention模型的输入与输出1.为什么引入Self-Attention&#xff1f;2.Self-attention&#xff08;重点&#xff09;2.1 整体架构2.2 计算单个输出的原理2.3 整体的矩阵计算 3.Multi-head Self-attention4.Self-attention的缺点5.Self-attention与CNN的对比6.Self…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装&#xff0c;主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

msvcr100.dll丢失的多种解决方法,哪个方法更合适你呢

我们打开电脑程序的时候&#xff0c;系统提示电脑丢失msvcr100.dll&#xff0c;无法启动此程序&#xff0c;这该怎么办&#xff1f;msvcr100.dll是电脑一个重要的文件&#xff0c;丢失了就会导致一些应用程序打不开。下面我们就来看看详细的解决步骤。 msvcr110.dll为Visual St…

IS-IS原理与配置

IS-IS原理与配置 • IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP &#xff08;ConnectionL…

MySQL——库,表基础操作

目录 一.库的操作 1.显示当前的数据库列表 2.创建数据库 3.字符集和校验规则 4.操纵数据库 5.删除数据库 6.数据库备份与还原 7.查看连接情况 二.表的操作 1.创建表 2.查看表结构 3.修改表 4.删除表 一.库的操作 1.显示当前的数据库列表 show databases; 2.创建数…

PyQt6 QSpacerItem弹簧控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

QT案例 使用WMI获取win_32类的属性值,包括Win32提供程序类中的属性

最近涉及到读取WINDOWS 系统电脑设备的各种信息&#xff0c;在一些特殊的PE或者简化系统中是没有WMI查询工具的&#xff0c;所以就自己写了个查询大部分WMI属性值的工具&#xff0c;免去了查网站的功夫。涉及到的方法内容就汇总做个总结。 PS:因为工作中软件基本都是我一个人开…

关于react native项目中使用react-native-wechat-lib@3.0.4

关于react native项目中使用react-native-wechat-lib3.0.4 插件官网安装依赖包&#xff08;Android和iOS下载插件完成后记得更新依赖&#xff0c;&#xff09;Android中配置1.在项目文件夹下面创建文件夹wxapi&#xff08;如上图&#xff09;2.在文件MainApplication.java中如下…

软件设计师——法律法规(三)

&#x1f4d1;前言 本文主要是【法律法规】——软件设计师——法律法规的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…