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

相关阅读

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块后语句之前的,而无法保证其他同一仿真时间的语句的执行顺序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11、pytest断言预期异常

官方用例 # content of test_exception_zero.py import pytestdef test_zero_division():with pytest.raises(ZeroDivisionError):1/0# content of test_exception_runtimeerror.py import pytestdef test_recursion_depth():with pytest.raises(RuntimeError) as excinfo:def…

MySQL基础『数据类型』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.数据类型一览2.整型2.1.INT2.2.BIT 3.浮点数3.1.FLOAT3.2.DECIMAL3…

紫龙游戏解锁Jira与Perforce的游戏开发行业实践

近日&#xff0c;在龙智携手Atlassian与JFrog共同举办的“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”的线下研讨会中&#xff0c;紫龙游戏上海研发中心高级项目管理主管叶凯威为大家带来了精彩演讲&#xff0c; 分享紫龙游戏的项目管理工具与流程&#xff0c;以…

将数据库配置迁移nacos报错:Request nacos server failed:

网上查了很久大部分都是版本不一致导致造成&#xff0c;但是没迁移的时候就可以&#xff0c;为啥迁移了就不行了呢&#xff1f; 最后排查发现&#xff1a;application.yml文件我注释掉的数据库配置 多注释了一个Spring开头

学SQL JOINS看这一篇文章就够了

目录 下面以实例进行分析 内连接 inner join 或者join&#xff08;等同于inner join&#xff09; 外连接 left join 或者left outer join(等同于left join) [ left join 或者left outer join(等同于left join) ] [ where B.column is null ] right join 或者right outer…

【有ISSN、ISBN号!往届均已完成EI检索】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2024&#xff09; 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;…

广告公司选择企业邮箱的策略与技巧

对于广告公司而言&#xff0c;选择一款适合的企业邮箱不仅能提升工作效率&#xff0c;更能维护并强化公司的品牌形象。以下是在选择企业邮箱时需关注的关键因素和注意事项。 1、邮件服务商的安全性。 邮件服务商应具备严密的安全防护措施&#xff0c;包括反垃圾邮件、防病毒、防…

macOS安装JDK8

在这篇博客的基础上进行补充。 https://blog.csdn.net/Sarah_luxy/article/details/128797756 百度搜索jdk8&#xff0c;选择官网进入 下载需要注册账户&#xff0c;提前注册登录 进入到Java SE中 选择下载 选择java归档&#xff0c;在历史版本里找jdk8 下拉找到jdk8 选…

老化房设备材料选型要素

一&#xff1a;选择高温老化试验设备时&#xff0c;需要考虑以下几个因素&#xff1a; 温度范围&#xff1a;根据待测材料或产品的使用环境和需求&#xff0c;选择合适的温度范围。确保试验设备的最高和最低温度能够满足需求。控温精度&#xff1a;控温精度越高&#xff0c;试…

Flink运行时架构核心概念

Flink运行时架构 JobManager&#xff1a;协调&#xff0c;决定何时调度下一个task&#xff0c;对失败任务做恢复。 ResourceManager: 负责Flink集群中的资源提供、回收、分配&#xff0c;它负责管理task slot。standalone模式下&#xff0c;不能自行启动新的taskmanagerDispatc…

Linux DataEase数据可视化分析工具本地部署与远程访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

新书推荐——《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》

《Copilot和ChatGPT编程体验&#xff1a;挑战24个正则表达式难题》呈现了两方竞争的格局。一方是专业程序员David Q. Mertz&#xff0c;是网络上最受欢迎的正则表达式教程的作者。另一方则是强大的AI编程工具OpenAI ChatGPT和GitHub Copilot。 比赛规则如下&#xff1a;David编…

Spring Security6 快速实战

Spring Security 介绍 官网&#xff1a;https://spring.io/projects/spring-security Spring Security 定义 Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。Spring Security 主要实现了认证和授权&#xff0c;SpringSe…

多波束EM2040D甲板单元更换CPU主板记录

前段时间多波束EM2040D甲板单元的CPU主板到货了。趁着船刚好靠港避风&#xff0c;我们带着这块主板去替换之前借来EM2040C的CPU主板。 1、CF卡替换问题 老主板有个CF卡&#xff0c;见下图。最好的解决方法就是将老CF卡替换新CPU主板上的新CF卡&#xff0c;因为这样改动最小。…

单目相机测距(3米范围内)二维码实现方案(python代码 仅仅依赖opencv)

总体思路:先通过opencv 识别二维码的的四个像素角位置,然后把二维码的物理位置设置为 cv::Point3f(-HALF_LENGTH, -HALF_LENGTH, 0), //tl cv::Point3f(HALF_LENGTH, -HALF_LENGTH, 0), //tr cv::Point3f(HALF_LENGTH, HALF_LENGTH, 0), //br cv::P…

SAAS版专业级条码标签打印软件解决方案

一。新一代互联网打印模式 saas云标签打印软件支持条码、二维码、表格等模式组合打印&#xff0c;支持批量打印标签、表格模拟数据 、在线预览二维码打印 、在线条码生成打印标签 ● 条码/二维码/标签打印&#xff0c;支持表格批量打印标签&#xff1b; ● 条码/二维码尺寸…

呼叫系统的客服的计费模式有哪些?

大家都已经了解呼叫总的区分为两种呼入和呼出。呼入就是建立客服呼叫中心&#xff0c;呼出就是电销回访外呼中心。那么相应的计费模式也是有不同的。下面看看以下几种收费模式 &#xff1a; 一、按月收费模式 也叫固定客服模式&#xff0c;是根据上月结算的费用&#xff0c;企业…

C++11--右值引用

目录 基本概念 左值和右值 左值引用和右值引用 右值引用使用场景和意义 左值引用使用场景 左值引用的短板 右值引用和移动语义 右值引用引用左值 右值引用的其他使用场景 完美转发 万能引用 完美转发保持值得属性 完美转发使用得场景 基本概念 左值和右值 什么…

二维码智慧门牌管理系统升级:轻松解决重新制牌问题

文章目录 前言一、更便捷的申请方式二、系统优势 前言 随着科技的快速发展&#xff0c;智能化管理已经成为我们日常生活的一部分。最近&#xff0c;为了满足人们对门牌类型更换、门牌丢失等需要重新制牌的需求&#xff0c;二维码智慧门牌管理系统升级了解决方案&#xff0c;为…

网络安全卫士:上海迅软DSE的员工上网管理策略大揭秘!

在日常办公中&#xff0c;企业员工可能会在互联网上有意或无意的将一些包含内部重要信息的内容发布出去&#xff0c;从而造成不必要的违规及泄密风险&#xff0c;因此对终端用户进行规范的上网行为管理&#xff0c;既能有效预防重要数据泄密&#xff0c;同时也能提高员工办公效…