我的 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 组件间通信和数据交互。 前文链接: 我的 System Verilog 学习记录(1) 我的 System Verilog 学习记录(2) 我的 System Verilog 学习记录(3ÿ…...

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 - 输入二叉搜索树 难度:easy\color{Green}{easy}easy 题目描述 给定一个二叉搜索树 rootrootroot 和一个目标结果 kkk,如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果,则返回 truetruetrue。 示例 1…...

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

【项目精选】 javaEE采购管理系统(论文+视频+源码)
点击下载源码 本系统是一个独立的系统,用来解决企业采购信息的管理问题。采用JSP技术构建了一个 有效而且实用的企业采购信息管理平台,目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析,采购系统需实现以下功能模块࿱…...

【Servlet篇2】创建一个web项目
在上一篇文章当中,已经提到了什么是Maven,以及如何使用maven从中央仓库下载jar包。【Tomcat与Servlet篇1】认识Tomcat与Maven_革凡成圣211的博客-CSDN博客Tomcat,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 开发框架,它提供了一些基本的 Web 管道功能。在 Spring Boot 中,Web 管道是通过一组过滤器、拦截器、控制器和视图解析器等组件组成的。 如果你需要扩展 Spring Boot Web 管道,可以考虑以下几种方式…...

「JVM 高效并发」锁优化
为了线程间更高效的共享数据及解决竞争问题,提高程序执行效率,JDK 6 做了大量锁优化,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁膨胀(Lock Coarsening…...

当园区物流遇上云计算,会发生什么事情?
顺丰供应链与亚马逊云科技的强强联手,可以给物流供应链企业带来怎样的启示?物流行业的数智化趋势在国内物流行业说起顺丰,相信是无人不知无人不晓。作为数字化供应链服务解决方案提供商,顺丰供应链可以提供端到端供应链的规划、管…...

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

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

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

基于.NET 7 + iView 的前后端分离的通用后台管理系统开源框架
更多开源项目请查看:一个专注推荐.Net开源项目的榜单 今天给大家推荐一套前后端分离通用后台管理系统开源框架。 项目简介 这是基于.Net 7 Vue.js开发的、前后端分离框架,前端UI框架采用iView,该项目只有基础功能模块,不包含具…...
新一代通信协议—— RSocket
一、简介 RSocket 是一种二进制字节流传输协议,位于 OSI 模型中的5~6层,底层可以依赖 TCP、WebSocket、Aeron 协议。最初由 Netflix 开发,支持 Reactive Streams。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP),H…...
【编程实践】这个代码命名规范是真优雅呀!代码如诗!!(多读优秀的开源代码,多实践,你也可以一样优秀!)
目录 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 End 管理类命名 写代码,少不了对统一资源的管理,清晰的启动过程可以有效的组织代码…...

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

超店有数分享:tiktok数据分析工具推荐,助你成功出海!
现阶段的跨境电商人都纷纷入局tiktok,这是风口也是发展趋势。Tiktok的下载量已经超过了35亿,每月都有10亿用户活跃,在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览,打开率也很高。如今,tiktok也越来越成…...
2022 第十四届蓝桥杯模拟赛第三期(题解与标程)
第十四届蓝桥杯模拟赛第三期1. 最小的十六进制问题描述答案提交参考答案2. Excel的列问题描述答案提交参考答案3. 相等日期问题描述答案提交参考答案4. 多少种取法问题描述答案提交参考答案5. 最大连通分块问题描述答案提交参考答案6. 哪一天问题描述输入格式输出格式样例输入样…...

「TCG 规范解读」PC 平台相关规范(1)
可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...