我的 System Verilog 学习记录(7)

news2025/1/12 12:04:14



引言

本文简单介绍 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 items
	s_mbox names;
	//Define a task to put items into the mailbox
	task send ();
		for (int i=0;i <3;i++)begin
			string s=$sformatf ("name_%0d",i);
		#1 	$display ("[%et]Comp1:Put %s",$time,s);
			names.put(s);
		end
	endtask
endclass

//Define a second component to receive messages
class comp2;
	//Create a mailbox handle to receive items
	s_mbox list;
	//create a loop that continuously gets an item from
	//the mailbox
	task receive ();
		forever begin
			string s;
			list.get(s);
			$display ("[%et] Comp2:Got %s",$time,s);
		end
	endtask
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
fork
	m_comp1.send();
	m_comp2.receive();
join
end
endmodule//create alias for parameterized "string"type mailbox

 仿真输出:

匹配不同类型邮箱

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

会出现编译错误:

 

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

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

相关文章

使用msvc命令行或msbuild编译dx3程序

从这里下载&#xff1a;https://github.com/microsoft/DirectX-Graphics-Samples cl.exe /D "UNICODE" /D "_UNICODE" *.cpp /EHsc -I C:\Users\54930\Downloads\DirectX-Graphics-Samples-master\Samples\Desktop\D3D12nBodyGravity\src\WinPixEventRun…

为什么DNS安全很重要

几乎所有web流量都需要标准DNS查询&#xff0c;这为DNS攻击创造了机会&#xff0c;比如DNS劫持和中间人攻击。这些攻击可以将网站的入站流量重定向到网站的伪造副本&#xff0c;收集敏感用户信息&#xff0c;并使企业承担重大责任。目前防范DNS威胁的最普遍方法之一是采用DNSSE…

为什么地图可视化炙手可热?

我们在谈到数据可视化的时候&#xff0c;可能第一反应就是中间有一个地图样式的大屏图。但有没有想过&#xff0c;为什么大多数的可视化大屏中间都是一张地图的样子&#xff1f;这张地图样式的模块究竟是什么呢&#xff1f;它又是怎么做出来的&#xff1f; 其实这张地图样式的…

Linux基本命令复习-面试急救版本

1、file 通过探测文件内容判断文件类型&#xff0c;使用权是所有用户&#xff0c; file[options]文件名2、mkdir/rmdir 创建文件目录&#xff08;文件夹&#xff09;/删除文件目录 3、grep 指定文件中搜索的特定内容 4、find 通过文件名搜索文件 find name 文件名 5、ps 查…

电子科技大学 高级计算机系统结构 考试回忆

首先题量不算小&#xff0c;因此没有太多时间把题都记出来&#xff0c;但是叙述一下题的类型希望能帮到以后选了这门课大家&#xff0c;在网上确实没有搜到这门课有关考试的任何资料&#xff0c;所以我也没啥参考全凭记忆和老师的PPT结合。复习的时候老师给了大纲&#xff0c;就…

mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题

一、事故还原 我们仍然使用学生信息表&#xff0c;但是我们只需要保留两个字段即可&#xff1a; CREATE TABLE student_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,name varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT 姓名, PRIMARY KEY (id) ) ENGINEIn…

挑战图像处理100问(26)——双线性插值

双线性插值是一种常用的图像插值方法&#xff0c;用于将低分辨率的图像放大到高分辨率。它基于一个假设&#xff1a;在两个相邻像素之间的值是线性的。 双线性插值考察444邻域的像素点&#xff0c;并根据距离设置权值。虽然计算量增大使得处理时间变长&#xff0c;但是可以有效…

电脑开机后进不了系统?原因以及解决方法

在日常使用电脑的过程中&#xff0c;我们有时候会遇到电脑开机后进不了系统的情况&#xff0c;这是令人十分烦恼的事情。那么&#xff0c;这种情况的出现可能是由于什么原因呢&#xff1f;接下来&#xff0c;本文将为您介绍电脑开机后无法进入系统的原因以及解决方法。 演示机型…

【Java】String类

1. String内部声明 jdk8以前&#xff1a; private final char value[]; final&#xff1a;指明数组一旦初始化&#xff0c;其地址就不能改变 jdk9以后&#xff1a; private final byte[] value;&#xff0c;为节省内存空间而优化 final&#xff1a;指明数组一旦初始化&…

这些让人变笨的食物你是不是天天吃?

我们关注食物的营养&#xff0c;关注它对身材、健康的影响。现在&#xff0c;我们发现有些食物&#xff0c;还会影响人的神经系统、认知能力。简而言之&#xff0c;就是有些食物可能会让人变笨。《美国医学会神经病学杂志》上的一项研究&#xff0c;分析了超加工食物与认知能力…

【蓝桥杯入门到入土】最基础的数组你真的掌握了吗?

文章目录一&#xff1a;数组理论基础二&#xff1a;数组知识点总结三&#xff1a;数组这种数据结构的优点和缺点是什么&#xff1f;四&#xff1a;实战解题1. 移除元素暴力解法双指针法2.有序数组的平方暴力解法双指针法最后说一句一&#xff1a;数组理论基础 首先要知道数组在…

【数据结构】堆的详解

本章的知识需要有树等相关的概念&#xff0c;如果你还不了解请先看这篇文章:初识二叉树 堆的详解一、二叉树的顺序结构及实现1、二叉树的顺序结构2、堆的概念及结构二、堆的简单实现 (以大堆为例)1、堆的定义2、堆的初始化3、堆的销毁4、堆的打印5、堆的插入6、堆顶元素的获取7…

网络传输:linux下的网络请求和下载(ping wget curl)、端口

一、下载和网络请求 1.ping命令 可以通过ping命令&#xff0c;检查指定的网络服务器是否可连通状态 语法&#xff1a;ping [-c num] ip或主机名 选项&#xff1a; -c 检查的次数&#xff0c;若不使用-c&#xff0c;将无限次数持续检查参数&#xff1a;ip或主机名&#xff0c…

基于Python的时间序列异常值检测

今天我们介绍一下使用python做时间序列数据分析和预测中异常值检测的方法&#xff0c;常用的异常值检测方法有以下几种&#xff1a; 3sigma: 基于正太分布&#xff0c;当数据值超过3个标准差(3sigma)时为异常值。z-score : z标准分数&#xff0c;它测量数据值到平均值的距离,当…

pandas对某一列的种类编码

文章目录背景实现背景 如果某一列的种类特别多&#xff0c;想要通过映射来编码&#xff0c;这样非常麻烦&#xff0c;所以可以对一个列全部一次性进行编码。 例如我的数据如下&#xff1a; 我需要编码专业这个列&#xff0c;我们可以看到这一列很多&#xff1a; 实现 使用…

【Unity】P3 基础设定

Unity基础设定父子关系InspectorTransformMesh FilterMesh Rendener第二种常用的父子操作Global 与 Local 模式Pivot 与 Center 模式声音组件创建多场景Asset 资源商店前言 上一篇博文主要围绕Unity的静态基础操作部分&#xff0c;从创建好的一个小方块cube开始&#xff0c;到对…

Selenium基于POM的自动化测试实践

什么是Page Object模式 Page Object 见名知意&#xff0c;就是页面对象&#xff0c;并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中&#xff0c;我们一般对脚本的实现分为三层&#xff1a; (1)对象层&#xff1a; 用于存放页面元素定位和控件操作 (2)逻…

《Nacos(3) - 集群搭建(详细)》

《Nacos(3) - 集群搭建》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Nacos3 - 集群搭建》《Nacos(3) - 集群搭建》1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化1.集群结构图 官方给出的Na…

【JavaSE】对象的比较

哈喽&#xff0c;大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是Java中自定义类型&#xff08;对象&#xff09;的三种比较方式&#xff0c;equals 方法, Comparable 泛型接口, Comparator 泛型接口 。在日常编程中&#xff0c;我们常常会需要比较的问题&…

cuda版本,pytorch(GPU)版本的选择和下载

cuda版本&#xff1a; 1.Nvidia控制面板里的cuda版本, 或使用nvidia-smi命令显示的cuda版本 是cuda的driver api版本 2.nvcc -V中的cuda版本&#xff0c;是cuda的runtime api版本&#xff0c;即cudatoolkit的版本 cudatoolkit的版本不能高于cuda driver api的版本&#xff…