事件触发控制_SystemVerilog线程控制与通信

01

线程控制

1.概述

线程,即独立运行的程序;

线程需要被触发执行,可以结束或者不结束;

  • 在module中的initial和always,都可以看作独立的线程,他们在仿真0时刻开始,而选择结束或者不结束;

  • 在硬件模块中都是always语句块,所以可以看成是独立运行的线程,而且会一直占用仿真资源,因为他们不会结束;

验证环境需要initial语句块,在仿真过程中,验证环境中的对象可以创建和销毁,故验证环境的资源是动态的;

  • 验证环境中的initial语句块有两种方式:begin……end或者fork……join;

Begin……end中语句顺序执行,而fork……join中语句并发执行;

与fork……join类似的并行语句有fork……join_any、fork……join_none;

  • 线程的执行轨迹是呈树状结构,即任何线程都应该有父线程;

  • 父线程可以开辟若干子线程,父线程可以暂停或者终止子线程;

  • 当子线程终止时,父线程可以继续执行;

  • 当父线程终止时,其子线程都终止执行;

2.并行线程

fork……join需要所有并行线程都结束才会继续执行;

fork……join_any其中任意一个线程结束就继续执行;

fork……join_none不等待子线程,直接继续执行;

  • 注意:

Fork……join_any和fork……join_none继续执行后,其一些未完成的子线程仍将继续在后台执行;

如果要等待或者停止这些子线程,可使用wait fork 或者disable fork;

task do_test;    fork        ……    join_any    fork        ……    join_none    wait fork;//等待所有子线程结束endtask
task get_first(output ubt adr);    fork        ……    join_any    disable fork;endtask

3.时序控制

  • SV可以通过延迟控制或者事件(event)等待来完成时序控制;

延迟控制即通过#来完成;

#100 clk2=clk1;

事件(event)控制即通过@来完成;

@a clk1=clk2;  //等待事件

@(posedge clk)a=b;//边沿触发

Wait语句可以与事件或者表达式结合使用;

Real AOR[];  

Initial wait(AOR,size()>0)  //wait语句完成电平触发

02

线程同步

1.概述

测试平台所有线程都需要同步并进行交换数据;

一个线程等待另一个线程;

2.事件event

  • 通过event声明一个event变量,并且触发;

  • event变量可以由一端去触发,再由另一端完成阻塞式的等待,即可以用来控制多个线程之间的同步;

  • 通过->来触发事件;

  • 其他等待该事件的线程可以通过@操作符或者wait()来检查事件触发状态来完成等待事件;

event done,blast;  //声明两个独立的事件event done_too=done;   //事件done赋值给done_tootask trigger(event ev);    ->ev;   //触发ev事件endtask……fork     @done_too;  //等待done_too    #1 trigger(done);  //触发done事件joinfork    ->blast;  //触发blast事件    wait(blast.triggered);  //电平触发等待join
  • wait_order() 可使得线程保持等待,直到在参数列表中的事件event按照顺序从左往右依次完成;

wait_order(a,b,c);

3.旗语(semaphore)

旗语是一个互斥体,使用旗语可以实现对同一资源的访问控制;

在创建旗语时,会为其分配固定的钥匙数量;

使用旗语的进程必须先获得钥匙,才可访问资源;

旗语的钥匙数量可以有多个,等待旗语的进程也可以有多个;

旗语的等待队列是先进先出(FIFO),即先排队等待旗语的将优先得到钥匙;

旗语操作

创建旗语

semaphore sm;//创建一个旗语

sm=new(1); //分配一个钥匙

创建一个固定钥匙数量的旗语:new

从旗语获取一个或多个钥匙(阻塞型):get

返回一个或多个钥匙:put

获取一个或多个钥匙而不被阻塞:try_get

task send;    sem.get(1)  ///获取钥匙        ……        sem.put(1);  //处理完成时把钥匙返回endtask

03

线程通信

1.信箱

用于收发信息,SV中信箱可以存放任何数据类型,也可以从信箱中读取这些数据,

创建信箱:new()

将信息写入信箱:put()

写入信箱但不会阻塞:try_put()

获取信息:get() 获取信息并取出数据:

                  peek()获取信息不会取出数据

从信箱获取数据但不会阻塞:try_get()/try_peek()

获取信箱信息数目:num()

2.信箱和队列区别

  • 信箱必须通过new()例化,队列只需要声明

  • 信箱的存取方法put()和get()是阻塞方法,不一定会立即返回;队列的存取方法push_back和pop_front()是非阻塞方法,会立即返回;

  • 传递形式参数时,如果是input方向,则信箱类型传递的是句柄,队列类型完成的是队列内容的拷贝;

3.总结

  • event:最小信息量的触发,即单一的通知单元,用来做事件的触发,也可多个事件组合起来作线程之间的同步;

  • semaphore:共享资源安全,用于多线程间需要对某一公共资源做访问;

  • mailbpx:SV类似FIFO,在线程之间做数据通信或者内部数据缓存;

END

往期相关(?猛戳可查看)

  • SystemVerilog

  • SystemVerilog两态数据类型

  • SystemVerilog自定义、枚举、结构体类型

  • SystemVerilog数组操作

  • SystemVerilog数组类型

  • SystemVerilog函数和任务

  • SystemVerilog覆盖率

ef7fa2254149413a22da1be6a97703a9.png

$display("点个在看吧!")3df2f8af92c375993e18f9f09dac5589.gif

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

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

相关文章

java必读书籍_最佳5本Java性能调优书籍–精选,必读

java必读书籍为什么Java开发人员应该阅读有关性能调优的书? 当我很久以前第一次面对这个问题时,我以为以后会做,但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&a…

成为Java流大师–第4部分:数据库流

SQL一直是一种声明性语言,而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需编写任何SQL代码。 您会发现,Java流和SQL命令的动词之间有着惊人…

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至,Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难,有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容,误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给…

使用测微计收集应用程序指标

什么是千分尺? 千分尺是一个简单的外观,用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持,包括Atlas,Datadog,Elastic,JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于read副本进行读操作。 为了模拟这种环境,我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要:本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com (同时使用HTTP(S)和JSON)管理数据的分步过程。 在此示例中,我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中,这个问题被提及的比例是相当高的,这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数?“我应该选择几个分区?”——如果你在Kaf…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:(1) 插入排…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后,充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格,而且型号也是一样的。那么,我们先一起来看看比亚迪版华为…

JMetro版本11.5.10和8.5.10发布

在这里,我们再次使用JMetro的另一个版本。 此版本中的新增功能: 工具栏内控件的新样式 新的可编辑组合框样式 对其他样式的一些调整 一些修复 继续阅读以获取详细信息。 可编辑的ComboBox新样式 JMetro早期版本的可编辑ComboBox看起来非常糟糕&am…

1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者:NanBox保活现状我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低功耗,也避免…

wordpress致命错误怎么解决_pppoe错误是什么意思 pppoe错误怎么解决

最近有网友反应无线路由器上设置PPPoE拨号上网后,发现PPPoE连接不上,显示pppoe错误是什么意思呢?pppoe错误怎么解决呢?接下来详细为大家介绍:pppoe错误怎么解决无线路由器设置PPPoE拨号后,PPPoE拨号连接不上,不能够上…

java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...

上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名密码实现OAuth2.0的登录认证):上面的图很清楚的描述了当前登录…

几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...

西湖区成立115个“项目制首席教师工作室”,建立中小学、幼儿园学科联动机制,以专业发展为目标,以教育问题为导向,整合发挥学科教研员、学科带头人和名师工作室领衔人的智力资源,助推教师的专业成长及区域的学科建设。西…

通过这些简单的步骤从头开始学习Java

Java是用于软件开发的最流行的编程语言之一。 无论您的最终目标或技能水平如何,学习和掌握Java都将为您作为开发人员打开大门。 今天,我们将讨论一些原因,我们认为您应该开始学习Java,然后提供有关入门的深入路线图。 为什么要学…

vs 服务容器中已存在服务_敏捷基础设施和公共基础服务

敏捷基础设施和公共基础服务敏捷基础设施和公共基础服务是微服务架构的有力支撑;能够简化业务开发,提升架构能力的基线。Cloud Native的基石是微服务架构、敏捷基础设施和公共基础服务。敏捷基础设施 - 通过容器封装环境,开发人员可以直接将所…