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

news2024/12/29 7:56:55

相关阅读

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


        有关Verilog中顺序块和并行块的相关内容已经在之前的Verilog基础的文章讲过,如下所示。

Verilog基础:块语句icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/132561861?spm=1001.2014.3001.5502        但在SystemVerilog中,并行块除了fork-join这种形式之外,还多出了两个变种,fork-join_any和fork-join_none,本文将对此进行讨论。

        下面是Verilog中并行块语法的BNF范式,有关BNF范式相关内容,可以之前的文章。

Verilog基础:巴科斯范式(BNF)icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/132567389?spm=1001.2014.3001.5502

        下面是SystemVerilog中并行块语法的BNF范式,可以看到其中变动较大的就是,并行块结尾的关键词可以是join、join_any、join_none之间的任何一个。

        SystemVerilog中的并行块具有以下几个性质:

1、块内的语句在进入并行块后同时执行(同时执行不代表连续执行,并行块执行过程中可能会发生进程挂起与切换,这点在之后说明)。

2、块内各语句的过程赋值延迟全部是相对于进入并行块时而言的(有关过程赋值延迟的内容,可以看Verilog基础:延时模型)。

3、块内各语句的过程赋值延迟可以提供语句赋值的时间顺序。

4、根据join keyword关键词的不同,控制流可能以不同的方式传出并行块(这与Verilog中的并行块不一样)。

        首先回顾一下Verilog中的并行块,在并行块开始执行时,块内语句同时执行(这个同时不是严格意义的同时,指的是同一个仿真时间),在被调度到仿真时间最后的语句执行完后,则并行块整体执行完毕。

        下面的代码片是一个例子,显示了并行块语句的执行情况。

//例1
`timescale 1ns/1ns
initial begin
    #2 $display("Enter fork at %t", $time);
    fork
       #1 $display("Statement1 execute at %t", $time);
       #2 $display("Statement2 execute at %t", $time);
       #3 $display("Statement3 execute at %t", $time); 
    join
    $display("Exit fork at %t", $time);
end


输出
Enter fork at                   2
Statement1 execute at           3
Statement2 execute at           4
Statement3 execute at           5
Exit fork at                    5

        但是要注意的是,对于有内嵌延迟的过程赋值语句,一旦右端的表达式的值计算完毕,即视作此表达式执行完毕,详细请看下面的例子。 

//例2
reg [1:0]a;
initial begin
    #2 $display("Enter fork at %t", $time);
    $monitor("a = %d at %t", a, $time);
    fork
        a <= #1 1;
        a <= #2 2;
        a <= #3 3;
    join
    $display("Exit fork at %t", $time);
end

输出:
Enter fork at               2
Exit fork at                2
a = x at                    2
a = 1 at                    3
a = 2 at                    4
a = 3 at                    5

         可以看到进入并行块和退出并行块的仿真时间是相同的,因为非阻塞赋值的内嵌延迟并不会阻塞控制流执行并行块内的其他非阻塞赋值语句,而真正的赋值需要等到3、4、5ns时。

        将上例中的非阻塞赋值改为阻塞赋值后会发生什么?下面给出了这种情况下的输出。

//例3
reg [1:0]a;
initial begin
    #2 $display("Enter fork at %t", $time);
    $monitor("a = %d at %t", a, $time);
    fork
        a = #1 1;
        a = #2 2;
        a = #3 3;
    join
    $display("Exit fork at %t", $time);
end

输出:
Enter fork at               2
a = x at                    2
a = 1 at                    3
a = 2 at                    4
Exit fork at                5
a = 3 at                    5

        尽管并行块内各个阻塞赋值语句在同一仿真时间的执行顺序不同,但有内嵌延迟的阻塞赋值必须等待延迟时间后才视为执行完毕,三条阻塞赋值语句同时执行,则延迟最长的那条阻塞赋值语句执行完毕后退出并行块,即2+3=5ns时退出并行块。

        对于fork-join的讨论到此为止,下面是对于fork-any的讨论。当并行块末尾关键词使用fork-any时,当并行块中有任意一条语句执行完毕,控制便可以跳出并行块执行之后的语句(当然,对于并行块中其他尚未执行的语句,它们仍然会在被调度的仿真时间执行),下面举例说明。

//例4
reg [1:0]a;
initial begin
    #2 $display("Enter fork at %t", $time);
    $monitor("a = %d at %t", a, $time);
    fork
       #1 a = 1;
       #2 a = 2;
       #3 a = 3;
    join_any
    $display("Exit fork at %t", $time);
end

输出:
Enter fork at               2
a = x at                    2
Exit fork at                3
a = 1 at                    3
a = 2 at                    4
a = 3 at                    5

        可以看到,如果fork-join_any块中的任何一个语句执行完毕,控制就可以跳出并行块了,即在3ns时就退出并行块了,但并行块内部的后两个赋值仍然会在其被调度的时间执行,所以在4ns和5ns时,a的值发生了改变。

        这样就会出现一种问题:当fork-join块内的语句和块后的语句被调度到同一时间执行时,它们的执行顺序有保证吗?我们知道begin end块能保证顺序块内语句依次执行,但fork-join_any块使得在结束一个并行块前,可以执行后面的语句,下面看一个例子。

//例5
reg [1:0]a;
initial begin
    #2 $display("Enter fork at %t", $time);
    $monitor("a = %d at %t", a, $time);
    fork
       #1 a = 1;
       #2 a = 2;
    join_any
    $display("Exit fork at %t", $time);
    #1 a = 0;
end

输出:
Enter fork at               2
a = x at                    2
Exit fork at                3
a = 1 at                    3
a = 0 at                    4

         上例中,当a=1在3ns时执行完毕后,控制即可跳出并行块,但在随后1ns,仿真器就要面临一个选择,是先执行a=2还是a=0,begin-end块的性质是否能保证a=2一定在a=0之前执行?答案是否定的,虽然结果表明a=2在a=0之前执行(最终结果为0),但这不是一定的,比如下面的反例。

//例6
reg [1:0]a;
initial begin
    #2 $display("Enter fork at %t", $time);
    $monitor("a = %d at %t", a, $time);
    fork
       a = 1;
       #1 a = 2;
    join_any
    $display("Exit fork at %t", $time);
    #1 a = 0;
end

输出:
Enter fork at               2
Exit fork at                2
a = 1 at                    2
a = 2 at                    3

        由输出可以清晰地看出,a=2时在a=0后发生(最终结果为2)。即begin-end块只能保证在同一仿真时间,fork块中的第一条执行的语句是在fork块后语句之前的,而无法保证其他同一仿真时间的语句的执行顺序。

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

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

相关文章

Linux进程通信——内存映射mmap

Linux进程通信——内存映射mmap 1、创建内存映射区2、进程间通信2.1 有血缘关系2.2 没有血缘关系 3、拷贝文件 原文链接 1、创建内存映射区 如果想要实现进程间通信&#xff0c;可以通过函数创建一块内存映射区&#xff0c;和管道不同的是管道对应的内存空间在内核中&#xf…

知识点滴 - 什么是半透膜和渗透压

半透膜和渗透作用 1748年的一天&#xff0c;法国物理学家诺勒为了改进酒的制作水平&#xff0c;设计了这样一个试验&#xff1a;在一个玻璃圆筒中装满酒精&#xff0c;用猪膀胱封住&#xff0c;然后把圆筒全部浸在水中。当他正要做下一步的工作时&#xff0c;突然发现&#xff…

MySQL 的 NULL 是怎么存储的?

目录 一、MySQL介绍 二、什么是NULL 三、MySQL 的 NULL 是怎么存储的 一、MySQL介绍 MySQL是一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种开源软件&#xff0c;由瑞典MySQL AB公司开发&#xff0c;后被Sun Microsystems收购&#xff0c;现在…

【电机控制】PMSM无感foc控制(六)相电流检测及重构 — 双电阻采样、三电阻采样

0. 前言 目前&#xff0c;永磁同步电机的电流信号采样方法应用较多的是分流电阻采样&#xff0c;包括单电阻、双电阻以及三电阻采样法。其中&#xff0c;单电阻采样上一章节已经讲解&#xff0c;这章讲双电阻以及三电阻电流采样法。 1. 双电阻采样 1.1 双电阻采样原理 双电阻采…

CRM管理系统:让你的业务运行更流畅

是客户关系管理系统的缩写。现代企业利用网络技术协调企业和客户之间在销售和服务上的对接&#xff0c;提升企业核心竞争力的一种手段。那么CRM管理系统一般包含哪些功能模块呢&#xff1f;今天小编为大家介绍一下。 一、好的CRM管理系统有哪些功能特性 1、有全方位的客户视图…

【开源】基于Vue.js的河南软件客服系统

文末获取源码&#xff0c;项目编号&#xff1a; S 067 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S067。} 文末获取源码&#xff0c;项目编号&#xff1a;S067。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、…

Elasticsearch高级

文章目录 一.数据聚合二.RestAPI实现聚合三.ES自动补全(联想)四.数据同步五.elasticsearch集群 一.数据聚合 在ES中的数据聚合&#xff08;aggregations&#xff09;可以近似看做成mysql中的groupby分组,聚合可以实现对文档数据的统计、分析、运算,常见的聚合的分类有以下几种…

ArcGIS提示当前许可不支持影像服务器

1、问题&#xff1a; 在用ArcGIS上处理影像栅格数据时&#xff08;比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等&#xff09;经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…

计算机组成学习-指令系统总结

复习本章时&#xff0c;思考以下问题&#xff1a; 1)什么是指令&#xff1f;什么是指令系统&#xff1f;为什么要引入指令系统&#xff1f;2)一般来说&#xff0c;指令分为哪些部分&#xff1f;每部分有什么用处&#xff1f;3)对于一个指令系统来说&#xff0c;寻址方式多和少…

CDA level-2 备考经验分享 转数据分析师CDA证书备考 考试相关说明

抓住了23年的尾巴&#xff0c;正好给我考过了CDA level-2 &#xff0c;虽然今年只有这几个小收获&#xff0c;但是还是很开心了&#xff0c;毕竟知足常乐嘛。 由于工作原因&#xff0c;因此复习都是间断性的&#xff0c;勉勉强强给通过了&#xff0c;只得了个C。 考试注册报名与…

HT78621 3.5A开关限流降压变换器基本参数信息

HT78621是一款高压降压开关稳压器&#xff0c;可向负载提供高达2A的连续电流。 HT78621 特性&#xff1a; ・宽输入电压: 5V – 60V ・峰值开关电流限值典型3.5A ・Z高1MHz开关频率 ・支持PWM调光控制输入&#xff0c;应用于LED ・集成G端MOSFET的短路保护 ・200μA静态电…

【眼界 | 每日技术】日常生活中的那些技术,增长眼界系列(一)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

备忘录怎么传到电脑?备忘录手机电脑互传方法

对于那些记性不好的人来说&#xff0c;手机上的备忘录简直是个不可或缺的好帮手。可是有时候&#xff0c;我们在手机上记录的内容需要在电脑上查看&#xff0c;这时候该怎么办呢&#xff1f; 曾经&#xff0c;我也为备忘录的手机电脑互传问题头疼不已。手机上记录的事项&#…

智能锁-SI522TORC522方案资料

南京中科微这款SI522目前完全PinTOPin兼容的NXP&#xff1a;RC522、CV520 复旦微&#xff1a;FM17520、FM17522/FM17550 瑞盟&#xff1a;MS520、MS522 国民技术:NZ3801、NZ3802 SI522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对&quo…

涵盖多种功能,龙讯旷腾Module第三期:光、磁、力学和极化性质

Module是什么 在PWmat的基础功能上&#xff0c;我们针对用户的使用需求开发了一些顶层模块&#xff08;Module&#xff09;。这些Module中的一部分是与已有的优秀工具的接口&#xff0c;一部分是以PWmat的计算结果为基础得到实际需要的物理量&#xff0c;一部分则是为特定的计…

OpenCV介绍及安装

目录 1.OpenCV简介 2.OpenCV安装 3.检查OpenCV是否安装成功 4.OpenCV模块 5.学习技巧 1.OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个基于开源发行的跨平台计算机视觉库&#xff0c;主要用于图像处理、计算机视觉和机器学习等领域…

OpenGL 和 OpenGL ES 2.0/3.X 一致性测试说明(CTS)

本文档介绍如何构建、移植和运行 OpenGL 和 OpenGL ES 2.0/3.X 一致性测试&#xff0c;以及如何验证和提交测试结果。 [TOC]目录 测试环境要求 一致性测试需要文件系统。文件系统需要支持长文件名&#xff08;即 > 8.3 名称格式&#xff09;。一致性测试中的源文件使用大…

全部免费!6个宝藏级别的AI网站!

专注AIGC领域的专业社区&#xff0c;关注百度文心一言等大语言模型&#xff08;LLM&#xff09;的发展和应用落地&#xff0c;关注LLM的基准评测和市场研究&#xff0c;欢迎关注&#xff01; 前两天给大家介绍了一款AI绘图工具fooocus&#xff0c;帮大家把AI绘画的使用门槛大幅…

MQ - KAFKA 高级篇

kafak是一个分布式流处理平台,提供消息持久化,基于发布-订阅的方式的消息中间件&#xff0c;同时通过消费端配置相同的groupId支持点对点通信。 ##适用场景&#xff1a; 构造实时流数据管道,用于系统或应用之间可靠的消息传输.数据采集及处理,例如连接到一个数据库系统,捕捉表…

12-2 Mybatis-Plus与Spring整合

user-springboot programming 实体类 ## 链接数据源 C3p0&#xff08;原始化&#xff09; 连接池的数据源 引入mysql 自动配置类DataSource会生效 需要你去配置相关的数据库参数 需要用到连接池 数据源的配置类 SpringBoot的测试类 SpringBootTest 原先是RunWith和Conf…