当前位置: 首页 > news >正文

我的 System Verilog 学习记录(7)



引言

本文简单介绍 SystemVerilog 语言的 testbench 组件间通信和数据交互。

前文链接:

我的 System Verilog 学习记录(1)

我的 System Verilog 学习记录(2)

我的 System Verilog 学习记录(3)

我的 System Verilog 学习记录(4)

我的 System Verilog 学习记录(5)

我的 System Verilog 学习记录(6)



进程间通信

测试平台中的组件经常需要相互通信来交换数据并检查设计的输出值。下表显示了一些允许组件或线程影响数据流控制的机制。

何为事件 ?

事件(event)是同步两个或者多个不同进程的方式。一个进程等待事件产生,另一个进程会触发事件。当事件触发后 等待事件的进程 将继续执行。

1、用 event 创建事件

event event_name ; 

2、用 -> 运算符触发事件

-> event_name ;

3、等待事件产生

@event_name ;                 // Use "@" operator to wait for an event
wait (event_name.triggered) ; // Or use the wait statement with "eventA.triggered"

4、将事件传递参数给函数

信号量是啥 ?

假设你想在图书馆租一个房间几个小时。管理员服务台会给你一把钥匙,让你在你请求访问的时间内使用这个房间。在你完成工作后,你要把钥匙还给管理员,然后再把钥匙给想要使用同一个房间的其他人。这样就不允许两个人同时使用这个房间。在这种情况下,钥匙是信号量。

信号量用于控制对资源的访问,称为互斥体(互斥),因为一次只能有一个实体拥有信号量。

仿真log:

注意以下几点:

  • 信号量的对象 key 用 new() 函数声明并创建。new() 函数内部的表达式 就是 key 的个数;
  • 用关键字 get() 来获取对象,在对象 key 有效之前一直等待。(阻塞)
  • 用 put() 关键字释放对象;

邮箱是啥 ?

邮箱就是两组件之间专用的数据传输通道。

例如,可以创建一个邮箱,并将句柄传递给数据生成器驱动器。生成器可以将数据对象推入邮箱,而驱动器将能够检索分组并将信号驱动到总线上。

仿真log:


信号量

信号量就像有固定数量的密钥。使用信号量的进程必须首先从存储桶中获取密钥才能继续执行。其他进程必须等待,直到存储桶中有密钥可供它们访问。从某种意义上说,它们特别适用于互斥、对共享资源的访问控制和基本同步。

语法

semaphore [identifier_name] ;

请注意,信号量是一个内置类,因此应该像使用任何其他类对象一样使用它。它有几个方法,可以用来为该信号量对象分配键的数量,获取键并将键放入桶中。

方法

示例

 仿真 log:


邮箱

SV 的邮箱是允许不同的进程在彼此之间交换数据的一种方法。它类似于一个真正的邮箱,人们可以把信件放进盒子里,稍后别人就可以取回这些信件。
SV 的邮箱被创建为具有有边界或无边界的队列大小。有界邮箱只能存储有限数量的数据,如果进程试图将更多邮件存储到完整的邮箱中,它将被挂起,直到邮箱中有足够的空间为止。但是,无限制的邮箱具有无限的大小。

有两种类型:

  • 通用邮箱:可以接受所有类型的数据;
  • 参数化邮箱:只能接受所声明的特定数据类型;

邮箱 vs 队列

尽管SystemVerilog邮箱的行为本质上类似于队列,但它与队列数据类型有很大的不同。简单的队列只能从前面或后面推入和弹出项。但是,邮箱是一个内置类,它使用信号量让原子控制队列中的推送和弹出。此外,您不能访问邮箱队列中的给定索引,而只能按FIFO顺序检索项。

邮箱用在何处 ?

当有多个线程并行运行并且希望共享需要一定程度的确定性的数据时,通常使用邮箱。

通用邮箱示例

在下面显示的示例中,两个进程同时处于活动状态,其中一个 initial 块将数据放入邮箱,另一个initial 块从邮箱获取数据。

请注意,两个线程之间存在竞争,第一个线程可以推入邮箱,第二个线程可以在同一增量周期内从邮箱中弹出。因此,使用num()显示的值仅在邮箱上执行下一个 get 或 put 之前有效,并且可能取决于其他方法的开始和结束时间。

邮箱的函数和方法

参数化邮箱

默认情况下,SystemVerilog邮箱是无类型的,因此可以发送和接收混合数据类型的对象。尽管这是一个很好的功能,但它可能会在仿真期间导致类型不匹配并导致错误。要将邮箱约束为接受和发送固定数据类型的对象,可以将其参数化为该特定数据类型。

示例

在下面显示的示例中,我们首先使用 typedef 构造为可以发送和接收字符串的邮箱创建别名。虽然这一步是可选的,但这是避免不同组件之间的类型不匹配而导致编码错误的好做法。考虑到Comp1 通过此邮箱向 Comp2 发送一些字符串。当然,这两个类都需要有一个邮箱句柄,它需要连接在一起,这最好是在顶层或实例化这两个类的模块上完成。

//create alias for parameterized "string"type mailbox
typedef mailbox #(string) s_mbox;//Define a component to send messages
class comp1;//Create a mailbox handle to put itemss_mbox names;//Define a task to put items into the mailboxtask send ();for (int i=0;i <3;i++)beginstring s=$sformatf ("name_%0d",i);#1 	$display ("[%et]Comp1:Put %s",$time,s);names.put(s);endendtask
endclass//Define a second component to receive messages
class comp2;//Create a mailbox handle to receive itemss_mbox list;//create a loop that continuously gets an item from//the mailboxtask receive ();forever beginstring s;list.get(s);$display ("[%et] Comp2:Got %s",$time,s);endendtask
endclass//Connect both mailbox handles at a higher level
module tb1;
//Declare a global mailbox and create both components
s_mbox m_mbx= new();
comp1 m_comp1=new();
comp2 m_comp2 =new();
initial 
begin
//Assign both mailbox handles in components with the
//global mailbox
m_comp1.names =m_mbx;
m_comp2.list =m_mbx;
//start both components,where comp1 keeps sending
//and comp2 keeps receiving
forkm_comp1.send();m_comp2.receive();
join
end
endmodule//create alias for parameterized "string"type mailbox

 仿真输出:

匹配不同类型邮箱

让我们来看看如果将SystemVerilog邮箱参数化为不同的数据类型会发生什么。假设Comp1具有字符串类型,而Comp2具有字节类型邮箱。将上述代码部分地方做如下修改:

会出现编译错误:

 

相关文章:

我的 System Verilog 学习记录(7)

引言 本文简单介绍 SystemVerilog 语言的 testbench 组件间通信和数据交互。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff…...

canvas复习笔记(绘制直线、矩形、圆形、圆弧)

canvas 画一条直线 <body><canvasid"c"width"300"height"200"style"border: 1px solid #ccc;"></canvas> </body><script>// 2、获取 canvas 对象const cnv document.getElementById("c");…...

LeetCode 653. 两数之和 IV - 输入二叉搜索树

653. 两数之和 IV - 输入二叉搜索树 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给定一个二叉搜索树 rootrootroot 和一个目标结果 kkk&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 truetruetrue。 示例 1&#xf…...

【Datawhale图机器学习】图神经网络

图神经网络 GNN是一种连接模型&#xff0c;通过网络中节点之间的信息传递的方式来获取图中的依存关系&#xff0c;GNN通过从节点任意深度的邻居来更新该节点状态&#xff0c;这个状态能够表示状态信息。第一次在论文 The graph neural network model 中提出 与传统NN的区别&a…...

【项目精选】 javaEE采购管理系统(论文+视频+源码)

点击下载源码 本系统是一个独立的系统&#xff0c;用来解决企业采购信息的管理问题。采用JSP技术构建了一个 有效而且实用的企业采购信息管理平台&#xff0c;目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析&#xff0c;采购系统需实现以下功能模块&#xff1…...

【Servlet篇2】创建一个web项目

在上一篇文章当中&#xff0c;已经提到了什么是Maven&#xff0c;以及如何使用maven从中央仓库下载jar包。【Tomcat与Servlet篇1】认识Tomcat与Maven_革凡成圣211的博客-CSDN博客Tomcat&#xff0c;mavenhttps://blog.csdn.net/weixin_56738054/article/details/129228140?spm…...

Allegro如何手动让静态铜皮避让过孔操作指导

Allegro如何手动让静态铜皮避让过孔操作指导 在用Allegro做PCB设计的时候,如果铺的是静态铜皮,铜皮铺在过孔上会造成短路,需要手动避让下,如下图 下面介绍如何手动避让,具体操作如下 点击Shape点击Manual Void/Cavity...

Java使用SpringBoot的Filter来扩展管道请求

Java Spring Boot 是一个流行的 Java Web 开发框架&#xff0c;它提供了一些基本的 Web 管道功能。在 Spring Boot 中&#xff0c;Web 管道是通过一组过滤器、拦截器、控制器和视图解析器等组件组成的。 如果你需要扩展 Spring Boot Web 管道&#xff0c;可以考虑以下几种方式…...

「JVM 高效并发」锁优化

为了线程间更高效的共享数据及解决竞争问题&#xff0c;提高程序执行效率&#xff0c;JDK 6 做了大量锁优化&#xff0c;如适应性自旋&#xff08;Adaptive Spinning&#xff09;、锁消除&#xff08;Lock Elimination&#xff09;、锁膨胀&#xff08;Lock Coarsening&#xf…...

当园区物流遇上云计算,会发生什么事情?

顺丰供应链与亚马逊云科技的强强联手&#xff0c;可以给物流供应链企业带来怎样的启示&#xff1f;物流行业的数智化趋势在国内物流行业说起顺丰&#xff0c;相信是无人不知无人不晓。作为数字化供应链服务解决方案提供商&#xff0c;顺丰供应链可以提供端到端供应链的规划、管…...

作为测试开发岗的面试官,我都是怎么选人的?

最近一段时间面试了不少人&#xff0c;主要是一些测试开发岗&#xff0c;中高级的初级的也都有&#xff1b;也有一些偏业务测试岗的候选人。总结出了一些方法论&#xff0c;或者说更多的是个人作为面试官所遵守的一套面试准则。 1.什么是面试&#xff1f; 面试不仅仅是你问我…...

android事件分发机制源码分析

没什么用的前言责任链设计模式流程图源码分析 没什么用的前言 事件分发机制是面试中一道必问的题目&#xff0c;而我的应对方式则是&#xff0c;在网络上找一些博客看看&#xff0c;然后做一些笔记&#xff0c;最后在面试时将我自己记住的内容说出来。这种方式本身没有太大的…...

今天,小灰37岁了!

人们常常说&#xff0c;35岁是互联网人的中年危机。现在&#xff0c;小灰已经跨过了中年危机&#xff0c;倒不是因为小灰财务自由了&#xff0c;而是因为今天是小灰37岁的生日。年轻时候&#xff0c;小灰总觉得30岁是一个很遥远的年龄&#xff0c;而现在&#xff0c;小灰距离40…...

基于.NET 7 + iView 的前后端分离的通用后台管理系统开源框架

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一套前后端分离通用后台管理系统开源框架。 项目简介 这是基于.Net 7 Vue.js开发的、前后端分离框架&#xff0c;前端UI框架采用iView&#xff0c;该项目只有基础功能模块&#xff0c;不包含具…...

新一代通信协议—— RSocket

一、简介 RSocket 是一种二进制字节流传输协议&#xff0c;位于 OSI 模型中的5~6层&#xff0c;底层可以依赖 TCP、WebSocket、Aeron 协议。最初由 Netflix 开发&#xff0c;支持 Reactive Streams。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP)&#xff0c;H…...

【编程实践】这个代码命名规范是真优雅呀!代码如诗!!(多读优秀的开源代码,多实践,你也可以一样优秀!)

目录 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 End 管理类命名 写代码&#xff0c;少不了对统一资源的管理&#xff0c;清晰的启动过程可以有效的组织代码…...

Linux->进程终止和等待

目录 1. 进程终止场景 1.1 进程退出码 1.2 进程常见退出方式 2. 进程等待 2.1 进程等待的必要性 2.2 进程等待的方式 wait()方式 waitpid()方式 options参数 status参数 1. 进程终止场景 代码运行完毕&#xff0c;结果正确 代码运行完毕&#xff0c;结果不正确 代码异…...

超店有数分享:tiktok数据分析工具推荐,助你成功出海!

现阶段的跨境电商人都纷纷入局tiktok&#xff0c;这是风口也是发展趋势。Tiktok的下载量已经超过了35亿&#xff0c;每月都有10亿用户活跃&#xff0c;在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览&#xff0c;打开率也很高。如今&#xff0c;tiktok也越来越成…...

2022 第十四届蓝桥杯模拟赛第三期(题解与标程)

第十四届蓝桥杯模拟赛第三期1. 最小的十六进制问题描述答案提交参考答案2. Excel的列问题描述答案提交参考答案3. 相等日期问题描述答案提交参考答案4. 多少种取法问题描述答案提交参考答案5. 最大连通分块问题描述答案提交参考答案6. 哪一天问题描述输入格式输出格式样例输入样…...

「TCG 规范解读」PC 平台相关规范(1)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...