【路科V0】systemVerilog基础17——线程的通信

news/2024/5/19 17:56:52 标签: systemVerilog, 数字验证

信箱mailbox

 线程通信的三个类型:

  • event
  • semaphore
  • mailbox

        mailbox信箱,顾名思义,可以用来收发信息。

        在SV中,mailbox可以用来存放任何数据类型,也可以从信箱中读取这些数据

        信箱可以设置尺寸大小,防止存储数据过多,或者占用过多资源

        信箱存放数据的方式,是同FIFO一致的,即先存放进来的数据,也会被先读出

信箱mailbox的内建方法

//创建信箱: 
new ()

//将信息写入信箱: 
put ()

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

//获取信息:
get()//同时会取出数据,
peek()//不会取出数据

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

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

mailbox::new()

        可以在创建信箱的时候限定或者不限定其大小

function new(int bound = 0) ;
//默认情况下,如果不传入参数,bound默认值为0,表示不限定信箱大小,
//如果bound传入的数值大于0,那么表示信箱的最大容量。
//bound应为正数,如果为负数的话,系统会提示警告和出现无法预期的行为。

mailbox::num()

        num()会返回信箱目前的消息数目。

        可以结合num()与get()或者put(),防止get()/put()方法在信箱为空或者为满的时候被阻塞。
例子

        如果发现信箱的消息数目为0,就可以不调用阻塞方法get()(不取出数据);

        或者消息数目已经到达最大容量时,就可以不调用阻塞方法put()(不写入数据)。

存储数据

mai lbox: : {put (), try put ()}

task put ( singular message) ;
function int try_put ( singular message) ;

put()
put()将信息按照FIFO的顺序写入到信箱。

如果信箱此时已满,则put()任务会挂起,直到信箱有新的空间可以容纳消息。

try_put()

try_put()也会按照FIFO顺序写入信箱,不会发生阻塞

如果信箱已满,则写入失败,返回0;如果信箱未满,则写入成功,返回1。

取出数据  

mailbox:: { get(),   try get () }

会将读取到的消息从信箱中移除 

task get ( ref singular message ) ;
function int try_get ( ref singular message ) ;
//get()会将信息从信箱中取出,如果信箱此时为空,则get()任务会挂起,
//直到信箱中有消息可以读取,任务才会返回。该方法会将读取到的消息从信箱中移除。

try_get()也会将信息从信箱中取出,只是该函数不会发生阻塞。
//如果信箱为空,则读取失败,返回0;如果信箱不为空,则读取成功,返回1。
//该方法也会将读取到的消息从信箱中移除。

mailbox::{peek(), try peek()}

不会将读取到的消息从信箱中移除 

task peek( ref singular message ) ;
function int try_peek( ref singular message );
//peek()会将信息从信箱中拷贝,如果信箱此时为空,则peek()任务会挂起,
//直到信箱中有消息可以拷贝,任务才会返回。
//该方法不会将读取到的消息从信箱中移除。

//try_peek()也会将信息从信箱中拷贝,只是该函数不会发生阻塞。
//如果信箱为空,则拷贝失败,返回0;如果信箱不为空,则拷贝成功,返回1。
//该方法也不会将拷贝到的消息从信箱中移除。

参数化信箱

        默认的信箱,在没有指定存储类型的情况下,可以存储任何类型的数据,这是一个强大的功能(程序也可能会为此受伤)。

默认信箱的问题:

        如果将各种形式的数据都存放到信箱,看起来轻松,但是对接下来的从信箱中获得数据带来了麻烦

        为了避免运行时错误和类型不匹配,我们建议在声明信箱的时候,为其指定存储的类型

        这种参数化信箱的方式可以使得在编译时就能够检查出类型不匹配的情况。

示例: 

typedef mailbox #(string) s_mbox;
s_mbox sm = new;
string s;
sm. put ( "hello”) ;
...
sm. get( s ); // s <- "hello"

信箱和队列的差别

  1.  信箱必须通过new()例化,而队列只需要声明即可。
  2.  信箱的存取方法put()和get()是阻塞方法,即使用它们时,方法不一定会立即返回,而队列所对应的存取方式,push_back()和pop_front ()方法是非阻塞的,会立即返回。
  3. 在传递形式参数时,如果是input方向,那么信箱类型传递的是句柄,而队列类型则完成的是队列内容的拷贝。

通信要素的比较和应用

event:

        最小信息量的触发,即单一的通知功能。可以用来做事件的触发,也可以多个事件组合起来用来做线程之间的同步。

semaphore:

        共享资源的安全卫士。如果多线程间要对某一公共资源做访问,即可以使用这个要素。

mail box:

        精小的SV原生FIFO。在线程之间做数据通信或者内部数据缓存时可以考虑使用此元素。
 


http://www.niftyadmin.cn/n/586878.html

相关文章

python 安装 cv2 - 已解决

我的网站已上线 http://javapub.net.cn/ 建议收藏 提供多种操作&#xff0c;一定有一种适合你的 文章目录1. 传统方式12. 第一阶段 终极办法013. 第二阶段 终极办法024. 终极办法3附加情况就这么个情况&#xff0c;就是装不上。本文没一句废话&#xff0c;仔细阅读。 1. 传统…

SQL语句删除表中重复字段(复制别人的)

1、查找表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;peopleId&#xff09;来判断select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)2、删除表中多余的重复记录&#xff0c;重复记录…

Java实现一个打飞机的小游戏【附源码】

文末源码 适合人群&#xff1a;Java初级学习者和爱好者&#xff0c;下面有展示图。 文章目录1 前言2 正文2.1 展示2.2 项目结构2.2 主要代码展示2.4 按钮相关类2.5 背景音乐类系列推荐&#xff1a;1 前言 &#x1f680;获取源码&#xff0c;文末公众号回复【飞机】&#xff0…

Linux的shell环境

shell 在 shell 会话中维护着大量的信息,这些信息称为 (shell) 环境。 存储在 shell 环境中的数据被程序用来确定配置属性。然而大多数程序用配置文件来存储程序设置, 某些程序也会查找存储在shell 环境中的数值来调整他们的行为,所以可以用shell环境来定制shell经历. 1.shel…

在Windows XP欢迎屏幕上隐藏用户名

在Windows XP的欢迎屏幕上&#xff0c;默认情况下会显示除Administrator外的所有本地用户名。如果你想在欢迎屏幕显示Administrator或者不显示其他的某个用户&#xff0c;可打开“注册表编辑器”&#xff0c;找到[HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVe…

python入门教程 - 滑块实战【附源码】

文末源码&#xff0c;阅读大约2.8分钟 傻瓜式教程 - 体验滑块&#xff0c;提供练习场景及源码。 文章目录环境安装效果展示源码环境安装 安装python需要的依赖包 cv2 安装可以参考这里&#xff1a;https://javapub.blog.csdn.net/article/details/123656345 安装webdriver -&…

eclipse用Maven构建SpringMVC环境报错找不到springmvc包下的Dispatcher类

java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher 今天使用eclipse创建spring项目,结果一直是出现找不到类,配置没有问题,而且jar也没少,换了几个版本都不行,然后去搜了一下,发现是eclipse的问题,发现WEB-INF下根本没有lib文件夹… 有个叫“De…

【路科V0】systemVerilog基础18——覆盖率

概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff0c;我们在验证的过程中终究需要回答两个问题: 是否所有设计的功能在验证计划中都已经验证?代码中的某些部分是否从未…