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

news2024/11/26 14:45:41

一、概述

        在实际硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出则随着输人的变化而变化。所有这些并发的活动在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.coloradmin.cn/o/1219319.html

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

相关文章

Python 集成 Nacos 配置中心

Python 集成 Nacos 配置中心 下载 Nacos 官方 pyhton 库 pip install nacos-sdk-python # 指定国内阿里云镜像源 pip3 install nacos-sdk-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 Nacos 相关信息 Global:nacos:port: 8848…

线下保薪班开启

大家都知道我们有线上班,对于想技能提升的同学来说,线上足以满足技能提升需求,对于想转行找工作,或者学生想就业的同学来说,线上却并不是一个好的选择,担心的可能有:担心自身基础较弱怕学不懂,担…

一文搞懂 Prompt 编程

大家好,我是木川 一、什么是 Prompt 编程 Prompt 编程是一种基于自然语言处理的编程方式,属于一种创新的编程范式,通过向大模型提供 Prompt(提示词),引导其生成特定的文本输出。 与传统的编码方式相比&…

开发知识点-Git

团队协作-Git Giteegitee 创建仓库打开项目所在目录,右键选择Git Bush Here(你要确定电脑上已经安装了Git)初始化本地仓库配置验证信息。 完美解决github访问速度慢介绍Git 与 SVN 区别IDEA 添加 gitee Gitee Git Gitee 大家都知道国内访问 Github 速度…

简单认识泛型【java】

目录 1.什么是泛型 2.引出泛型 2.1语法 3. 泛型类的使用 3.1 语法 4 泛型如何编译的 4.1 擦除机制 5.泛型的上下界 5.1 语法 6.注意 1.什么是泛型 一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于…

PS 吸管工具基本使用方法

这里 我们先打开PS软件 我们 在左侧 导航来中 找到 有吸管工具的这一组工具 这边 我们先选择这个 吸管工具 选择之后呢 左上角 属性配置 第一个是 取样大小 这个 我们之前学魔棒工具时 是有接触过的 这里 我们选择 取样点 然后 后面一个是样本 这个 用的最多的是 所有图层 …

postgresql:记录表膨胀引起的io问题的处理

文章目录 1. io异常2.查看profile报告2.1 生成事发时间段的pgprofile2.2 查看报告 3.检查table是否膨胀4.执行vacuum full5.总结 1. io异常 iostat -x 1 20 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq…

【环境准备】NodeJs(压缩包版本)安装与配置

一、NodeJs(压缩包版本)安装与配置 1、下载、解压 访问 NodeJs官网,选择Window版本的.zip格式进行下载,下载完成后进行解压(ps: 本人解压路径为D:\nodejs) 2、 环境变量配置 配置环境变量,找到系统变量下的path并选中&#xf…

009.网络配置

Rocky Linux的定位是提供服务的网络型操作系统,所以为其配置完整的网络参数至关重要。通常,Linux可以通过两种方式为系统配置网络参数:一种是通过命令行配置,另一种是通过修改系统配置文件来配置。下面分别介绍这两种配置网络参数…

腾讯云服务器新用户优惠活动有哪些?腾讯云新用户优惠活动汇总

对于新用户来说,腾讯云服务器提供了许多优惠活动,让你享受到超值的优惠。下面我们就来一起看看,腾讯云服务器新用户优惠活动有哪些吧! 1、腾讯云双十一领9999代金券(https://1111.mian100.cn) 腾讯云双十…

深度探讨丨关于工作量证明的常见误解

有一种基本误解认为,工作量证明机制在本质上是不可扩展的,并且会产生过度的能源耗费。 按照工作量证明区块链的最初设计,以及BSV区块链协会的推广,这一技术旨在实现可扩容性,同时确保高效能系统内的安全性和互操作性。…

调整Windows键盘上只能看到拼音而无法看到实际的文本以及关闭输入法悬浮窗方法

一、输入法设置 如果您在键盘上只能看到拼音而无法看到实际的文本,这可能是因为您的输入法设置为中文拼音输入法或其他仅显示拼音的输入法。 要解决这个问题,您可以尝试以下方法: 1. 切换输入法:按下 Shift Alt 组合键或 Wind…

yolo增加Inner-IoU,一文搞定(Inner-SIoU,Inner-WIoU,Inner-EIoU,Inner-MPDIoU)

论文:https://arxiv.org/pdf/2311.02877.pdf 简介 随着检测器的迅速发展, 边框回归取得了巨大的进步。然而,现有的基于 IoU 的边框回归仍聚焦在通过加入新的损失项来加速收敛,忽视 IoU 损失项其自身的限制。尽管理论上 IoU 损失能够有效描述…

linux systemd start stop enable disable命令区别

一、systemd 的服务在三个文件件下 /lib/systemd/system /etc/systemd/system /usr/lib/systemd/system 终于明白这几个命令的区别 systemd star systemd stop systemd enable systemd disable 二、 1、用ssh服务为例,,ssh是客户端,远程ss…

OCC教学:拓扑

拓扑:1.介绍 几何限制 OCCT 曲面支持矩形修剪。布尔运算后可能会出现非矩形域。 如何存储剪切操作的结果? 拓扑的目的 一般来说,拓扑是描述对象局限性的一种手段。 OCC拓扑被用于用于描述: 物体的边界;对象之…

2023.11.16使用原生js和canvas实现图片矩形框标注功能

2023.11.16使用原生js和canvas实现图片矩形框标注功能 做训练的时候需要一些数据集&#xff0c;但是网上数据集有时不能满足自身的使用需求&#xff0c;自己编制一个标注软件实现数据采集功能。 记录的数据集可以传入后端&#xff0c;在后端再次进行处理。 <!DOCTYPE htm…

010.内核模块

Linux内核采用的是模块化技术&#xff0c;这样的设计使得系统内核可以保持最小化&#xff0c;同时确保了内核的可扩展性与可维护性&#xff0c;模块化设计允许我们在需要时才将模块加载至内核&#xff0c;实现内核的动态调整。 Linux内核模块文件的命名方式通常为“模块名称.k…

什么是原生IP与广播IP?如何区分判定?

在代理IP中&#xff0c;我们常常听到原生IP与广播IP&#xff0c;二者有何区别&#xff1f;如何区分呢&#xff1f;下面为大家详细讲解。 一、什么是原生ip 原生IP地址是互联网服务提供商&#xff08;ISP&#xff09;直接分配给用户的真实IP地址&#xff0c;无需代理或转发。此…

猫罐头哪个牌子好?分享十款猫罐头品牌排行榜!

选择适合的猫罐头非常重要&#xff0c;好的猫罐头应该提供丰富的营养、适量的水分、口感良好&#xff0c;并且易于消化吸收。然而&#xff0c;如果选择不当&#xff0c;可能无法达到期望的效果&#xff0c;甚至可能对猫咪产生负面影响。 作为一位经营猫咖5年的老板&#xff0c;…

《许犁庭与柔性世界》第十三章 伊拉斯蒂克

“哈哈哈&#xff0c;居然小脸着地&#xff01;看来桉嘴牛的发射也没那么安全。”若丹姐姐嬉皮笑脸来到她面前&#xff0c;“怎么样&#xff0c;惊险不惊险&#xff0c;刺激不刺激&#xff1f;” 许犁庭脸色发白&#xff0c;身子发虚&#xff0c;只觉得心儿依旧高悬不落&#x…