SystemVerilog学习 (10)——线程控制

一、概述

        在实际硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出则随着输人的变化而变化。所有这些并发的活动在Verilog 的寄存器传输级上是通过initial和 always块语句、实例化和连续赋值语句来模拟的。为了模拟和检验这些语句块,测试平台使用许多并发执行的线程。在测试平台的环境里,大多数语句块被模拟成事务处理器,并运行在各自的线程里。
        SystemVerilog 的调度器就像一个交通警察,总是不停地选择下一个要运行的线程。
        每个线程总是会跟相邻的线程通信。在下图中,发生器把激励传递给代理。环境类需要知道发生器什么时候完成任务,以便及时终止测试平台中还在运行的线程。这个过程需要借助线程间的通信(IPC)来完成。常见的线程间通信有标准的Verilog事件、事件控制、wait语句、SystemVerilog信箱和旗语等。

二、线程的使用

        虽然所有的线程结构都可以用在模块和程序块中,但实际上测试平台隶属于程序块。结果是,我们的代码总是以initial块启动,从时刻0开始执行。虽然 always 块不能被放在程序块中,但是,通过在initial块内引入forever循环便可轻松地解决这个问题。
        标准的 Verilog对语句有两种分组方式——使用begin...end或fork...join。begin. ..end中的语句以顺序方式执行,而fork...join中的语句则以并发方式执行。后者的不足是必须等fork...join内的所有语句都执行完后才能继续块内后续的处理。因此,在 Verilog的测试平台中很少用到它。
        SystemVerilog引人了两种新的创建线程的方法——使用fork...join_none 和fork...join_any语句,如图下图所示:

  • fork...join需要所有并行的线程都结束以后才会继续执行
  • fork...join_any则会等到任何一个线程结束以后就继续执行
  • fork...join_none则不会等待其子线程而继续执行

三、进程间同步与通信

         测试平台中的所有线程都需要同步并交换数据。 一个线程等待另外一个,例如验证环境需要等待所有激励结束、比较结束才可以结束仿真。 比如监测器需要将监测到的数据发送至比较器,比较器又需要从不同的缓存获取数据进行比较。

1、事件event

        Verilog事件可以实现线程的同步。就像在打电话时一个人等待另一个人的呼叫,在Verilog中,一个线程总是要等待一个带@操作符的事件。这个操作符是边沿敏感的,所以它总是阻塞着,等待事件的变化。其他的线程可以通过->操作符来触发事件,解除对第一个线程的阻塞。

        System Verilog 从几个方面对 Verilog事件做了增强。事件现在成为了同步对象的句柄,可以传递给子程序。这个特点允许你在对象间共享事件,而不用把事件定义成全局的。最常见的方式是把事件传递到一个对象的构造器中。

        在Verilog中,当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争的可能性便出现了。如果触发线程先于阻塞线程执行,则触发无效。SystemVerilog引A triggered ()函数,可用于查询某个事件是否已被触发,包括在当前时刻。线程可以等待这个函数的结果,而不用在@操作符上阻塞。

        可以通过event来声明一个命名event变量,并且去触发它,这个命名event可以用来控制进程的执行;可以通过->来触发事件,其它等待该事件的进程可以通过@操作符或者wait()来检查 event触发状态来完成。

event done, blast; // declare two new events 
event done_too = done; // done_too as alias to done 
task trigger( event ev ); -> ev; 
endtask 
... fork @ done_too; // wait for done through done_too #1 trigger( done ); // trigger done 
join fork -> blast; wait ( blast.triggered ); 
join

2、wait_order()

         wait_order可以使得进程保持等待,直到在参数列表中的事件event按照顺序从左到右依次完成。 如果参数列表中的事件被触发但是没有按照要求的顺序,那么会使得等待操作失败

3、旗语(semaphore)

         使用旗语可以实现对同一资源的访问控制。想象一下你和你爱人共享一辆汽车的情形。显然,每次只能有一个人可以开车。为应对这种情况﹐你们可以约定谁持有钥匙谁开车。当你用完车以后,你会让出车子以便对方使用。车钥匙就是旗语,它确保了只有一个人可以使用汽车。在操作系统的术语里,这就是大家所熟知的“互斥访问”,所以旗语可被视为一个互斥体,用于实现对同一资源的访问控制。

        当测试平台中存在一个资源,如一条总线,对应着多个请求方,而实际物理设计中又只允许单一驱动时,便可使用旗语。在SystemVerilog 中,一个线程如果请求“钥匙”而得不到,则会一直阻塞,多个阻塞的线程会以先进先出(FIFO)的方式进行排队。

        旗语从概念上讲,是一个容器, 在创建旗语的时候,会为其分配固定的钥匙数量, 使用旗语的进程必须先获得其钥匙,才可以继续执行。旗语的钥匙数量可以有多个,等待旗语钥匙的进程也可同时有多个,旗语通常用于互斥,对共享资源的访问控制,以及基本的同步。

  • 创建旗语,并为其分配钥匙的方式如下: semaphore sm; sm = new();
  • 创建一个具有固定钥匙数量的旗语:new(N = 0)
  • 从旗语那里获取一个或多个钥匙(阻塞型):get(N = 1)​​​​​​​
  • 将一个或多个钥匙返回到旗语中:put(N = 1)
  • 尝试获取一个或多个钥匙而不会阻塞(非阻塞型):try_get(N = 1)

4、信箱(mailbox)

        如何在两个线程之间传递信息呢?考虑发生器需要创建很多事务并传递给驱动器的情况。你可能会认为仅仅使用发生器线程去调用驱动器中的任务便可以了。但如果这样做,发生器需要知道到达驱动器任务的层次化路径,这会降低代码的可重用性。此外,这种代码风格还会迫使发生器与驱动器以同一速率运行,在一个发生器需要控制多个驱动器的情况下会引发同步问题。

        解决的办法是使用SystemVerilog 中的信箱。从硬件角度出发,对信箱的最简单的理解是把它看成一个具有源端和收端的FIFO。源端把数据放进信箱,收端则从信箱中获取数据。信箱可以有容量上的限制,也可以没​​​​​​有。当源端线程试图向一个容量固定并且已经饱和的信箱里放入数值时,会发生阻塞直到信箱里的数据被移走。同样地,如果收端线程试图从一个空信箱里移走数据,它也会被阻塞直到有数据放入信箱里。下图展示了一个连接了发生器和驱动器的信箱。

  • 创建信箱:new()
  • 将信息写入信箱:put()
  • 试着写入信箱但不会阻塞:try_put()
  • 获取信息:get()同时会取出数据,peek()不会取出数据
  • 试着从信箱取出数据但不会阻塞:try_get()/try_peek()
  • 获取信箱信息的数目:num()

四、总结

        你的设计可以用很多并发运行的独立块来建模,所以测试平台也必须能够产生很多激励流并检验并发线程的反应。所有这些都被组织在一个层次化的测试平台中,并在顶层环境里得到统一。SystemVerilog在标准的fork...join 之外,引人了诸如fork...join_none和fork...join_any这些用于动态创建线程的功能强大的结构。线程间可以使用事件,旗语、信箱,以及经典的@事件控制和 wait语句来实现通信和同步。最后,disable命令可以用来中止线程。

        这些线程和相关的控制结构对OOP(面向对象编程)的动态特性形成了很好的补充。由于对象可以被创建和删除,所以它们可以运行在独立的线程里,这使得你能够构筑强大而灵活的测试平台环境。

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

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

相关文章

11988 - Broken Keyboard (a.k.a. Beiju Text) (UVA)

题目链接如下: Online Judge 这道题折磨了我不少时间,开始比较直观的想法超时,后来看了下别人的思路修改后才AC。 刘汝佳的代码很简洁,UVa 11988 悲剧文本(四种方法)_uva11988-CSDN博客 这里有。 还有下…

websocket实现实时数据推送,发布订阅重连单点登录功能

需求:使用websocket不借助插件实现发布,订阅,网络断开重连,单点登录后挤号的功能 1.单点登录(同一账号同一时间只有一个在线,禁止多用户登录) 实现:在用户登录之后获取到token令牌并…

软考 系统架构设计师系列知识点之云计算(3)

接前一篇文章:软考 系统架构设计师系列知识点之云计算(2) 所属章节: 第11章. 未来信息综合技术 第6节. 云计算和大数据技术概述 4. 云计算的发展历程 根据云计算的定义和内涵,这里将从虚拟化技术、分布式技术和软件应…

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云, 一部分云原生的,一部分是实体的 业务上云期间逐步实现上云,保证各个模块之间的解耦性 比如使…

C/C++轻量级并发TCP服务器框架Zinx-框架开发003:转大写字母输出+责任链模式+代码重构思路及实现

文章目录 1 添加转大写字母输出功能2 责任链模式2.1 责任链的设计2.2 责任链的实现2.3 责任链的测试 3 代码重构3.1 类图设计3.2 重构设计 - 头文件3.3 重构实现 1 添加转大写字母输出功能 功能流程: stdin通道类中包含一个功能处理类对象功能处理类中包含一个stdo…

endnote20如何导入已经下载好的ris和pdf文件

查看此链接 1 文献导入 1.1 PDF导入 (1)方法一 打开:菜单栏–>Import–>FIle或folder 单个导入PDF或导入一个文件夹的PDF或通过拖曳多个PDF进入空白处完成导入 1.3 导入已经整理好的文献资料 已有的ris文件 打开:菜单栏–…

Python武器库开发-flask篇之路由和视图函数(二十二)

flask篇之路由和视图函数(二十二) 通过创建路由并关联函数,实现一个基本的网页: #!/usr/bin/env python3 from flask import Flask# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容 app Flask(__name__)#程序实例需…

ubuntu访问github慢

https://juejin.cn/s/github%E6%89%93%E5%BC%80%E6%85%A2%E6%80%8E%E4%B9%88%E5%8A%9Eubuntu https://cloud.tencent.com/developer/article/2055030 亲测可用

【c++STL算数仿函数,关系仿函数,逻辑仿函数】

文章目录 C STL中的算数、关系和逻辑仿函数1. 算数仿函数2. 关系仿函数3. 逻辑仿函数 C STL中的算数、关系和逻辑仿函数 STL(Standard Template Library)是C标准库的一部分,提供了许多强大的工具和功能,其中包括仿函数&#xff0…

软文推广中媒体矩阵的优势在哪儿

咱们日常生活中是不是经常听到一句俗语,不要把鸡蛋放在同一个篮子里,其实在广告界这句话也同样适用,媒介矩阵是指企业在策划广告活动时,有目的、有计划的利用多种媒体进行广告传播,触达目标用户。今天媒介盒子就来和大…

pipeline jenkins流水线

Pipeline 是 Jenkins 中一种灵活且强大的工作流机制,它允许您以代码的形式来定义和管理持续集成和持续交付的流程。 Pipeline 的作用主要体现在以下几个方面: 可编排的构建流程:使用 Pipeline,您可以将一个或多个阶段&#xff08…

C#设置数据库索引

C#设置数据库索引 C# ASP.NET Core微服务设置数据库索引 C# ASP.NET Core微服务 设置数据库索引 设置数据库索引时,无需将.OnDelete(DeleteBehavior.Cascade)改为 .OnDelete(DeleteBehavior.NoAction)改变删除行为,向数据库添加索引的方法 modelBuild…

微信抽奖活动怎么做

微信抽奖活动:打破传统,创新互动,带给你超乎想象的惊喜体验! 随着互联网的飞速发展,人们越来越热衷于参与各种线上活动。而微信,作为中国最大的社交平台之一,自然成为了各种活动的聚集地。今天…

Android设计模式--状态模式

真知即所以为行,不行不足谓之知 一,定义 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 这么说可能很难理解,通俗来讲就是当一个对象它有多种状态的时候,把每一种状态的行为…

集合的removeIf方法

删除单个指定元素 如下:删除list中的字符串 “123” list.removeIf("123"::equals);删除另一个集合内包含的元素 即删除交集元素。 如:listA删除在listB中同样存在的元素: listA.removeIf(listB::contains);

大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

本地MQTT协议消息服务远程连接教程介绍

Mosquitto是一个开源的消息代理,它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行,包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景,提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递…

高标准农田数字孪生

高标准农田是指通过土地整治、土壤改良、水利设施、农电配套、机械化作业等措施,提升农田质量和生产能力,达到田块平整、集中连片、设施完善、节水高效、宜机作业、土壤肥沃、生态友好、抗灾能力强、与现代农业生产和经营方式相适应的旱涝保收、稳产高产…

office2010图标显示不正常

问题:安装office2010软件后,.doc文件图标不正常,而.docx文件图标正常 ! 解决方法:亲测有效 1、使用快捷键WinR,打开“运行”,输入regedit,按回车键。 2、对于 Word 2007/Word 2010…

【docker启动的Jenkins时,遇到时区问题处理】

1、查看容器中的时区 [rootlocalhost jenkins]# docker exec -it jenkins cat /etc/timezone Etc/UTC而本地使用的是Asia/shanghai [rootlocalhost jenkins]# timedatectl | grep Time zoneTime zone: n/a (CST, 0800)###查看 [rootlocalhost jenkins]# cd /usr/share/zoneinf…