线程同步,通信与虚方法
线程同步,通信与虚方法
目录
- 线程同步,通信与虚方法
- 进程同步,通信
- 事件event
- 旗语semaphore
- 信箱mailbox
- 虚方法
- 实例理解
- 将子类句柄赋值成父类句柄
- 将父类句柄赋值成子类句柄
- 使用系统函数$cast()
- 结论
- 实例理解
- 进程同步,通信
进程同步,通信
测试平台的的线程之间需要进行同步与数据交换,所有的数据交换被称为线程间的通信
事件event
- 使用关键词声明一个事件,不需要new;
- 使用
->
触发一个事件; - 使用wait(电平敏感)或者是@(边沿敏感)来进行等待,一般先等待事件,再触发事件。
实例如下:event创建了两个对象,不需要new。触发e1时等待e2,触发e2时等待e1。由于都是同时触发,可能存在等不到的情况。
event e1,e2;initial begin$display("@%0t: 1:before trigger", $time);-> e1;@e2;$display("@%0t: 1:after trigger", $time);endinitial begin$display("@%0t: 2:before trigger", $time);->e2;@e1;$display("@%0t: 2:after trigger", $time);end
打印结果为
@0:1:before trigger
@0:2:before trigger
@0:1:after trigger
增加triggered,使用wait进行等待。
event e1,e2;initial begin$display("@%0t: 1:before trigger", $time);-> e1;wait (e2.tregger);$display("@%0t: 1:after trigger", $time);endinitial begin$display("@%0t: 2:before trigger", $time);->e2;wait (e1.tregger);$display("@%0t: 2:after trigger", $time);end
此时输出观察结果。两个事件均被触发
@0:1:before trigger
@0:2:before trigger
@0:1:after trigger
@0:2:after trigger
旗语semaphore
实现对同一个资源的访问控制功能。
想象一下你和你爱人共享一辆汽车的情形。显然,每次只能有一个人可以开车。为应对这种情况,你们可以约定谁持有钥匙谁开车。当你用完车以后,你会让出车子以便对方使用。车钥匙就是旗语,它确保了只有一个人可以使用汽车。在操作系统的术语里,这就是大家所熟知的“互斥访问”,所以旗语可被视为一个互斥体,用于实现对同一资源的访问控制。
- 使用关键词semaphore 声明
- 使用前必需要使用new()进行初始化。new(1)为放入一把钥匙
- get()和put()可以对钥匙进行获取或是归还,进行等待
- try_get()获取一个旗语不被阻塞。返回0表示要是不够,不进行等待
semaphore初始化可以初始化0,即new()无参数,可以不停的换钥匙。
semaphore中get()/put()函数中没有传递参数,即 默认他们在等待和归还钥匙的数量为1
信箱mailbox
sv里的FIFO,线程内部数据通信或者是数据的缓存
- 必须使用new进行初始化,使用size来限定存储的最大数量。function new (int bound =0);表示不限制大小
- 使用put放入数据,get获取数据
- 信箱满,那么put阻塞;信箱空,get会阻塞
- peek拷贝数据不移除信箱里的数据
- num()获取信息的数目
- 默认信箱没有存储类型。可以使用#()来指定存储的形式
虚方法
使用虚方法目的:通过在父类里定义虚方法(task or function),可以在当父类句柄调用一个方法时候,前提是若是这个句柄指向了子类对象,则调用的方法为子类的方法而不是父类的方法。
实例理解
将子类句柄赋值成父类句柄
module tb_virtual();
class Transaction;
bit [31:0] src = 100;
function void display();$display("Transaction src = %0d",src);
endfunction
endclassclass BadTr extends Transaction;
bit [31:0] bad_src = 200;
function void display();super.display();$display("BadTr src = %0d",bad_src);
endfunction
endclassinitial beginTransaction tr;BadTr bad,bad2; bad = new(); //构建了一个子类的对象tr = bad; //父类的句柄指向子类的对象$display(tr.src);//显示父类的变量的内容tr.display; //调用的是父类的函数
end
endmodule
仿真结果为
# 100
# Transaction src = 100
使用虚方法后可以看到打印的输出发生了变化。调用了子类的函数。
将父类句柄赋值成子类句柄
initial beginTransaction tr;BadTr bad,bad2; tr = new();//创建一个父类对象bad = tr;//将父类对象赋值给子类句柄,ERROR不会执行$display(bad.bad_src);//父类对象不存在该成员变量
end
我的编译环境会报错
# ** Error: (vlog-13216) tb_virtual.sv(21): Illegal assignment to type 'class tb_virtual.BadTr' from type 'class tb_virtual.Transaction': Types are not assignment compatible.
使用系统函数$cast()
initial beginTransaction tr;BadTr bad,bad2; bad = new();tr = bad; //父类的句柄指向子类的对象$cast(bad2,tr);if(!$cast(bad2,tr))$display("cannot assign tr to bad2");$display(bad2.bad_src);bad2.display();
end
打印结果为
# 200
# Transaction src = 100
# BadTr src = 200
结论
- 通过在父类里定义虚方法(task or function),可以在当父类句柄调用一个方法时候,前提是若是这个句柄指向了子类对象,则调用的方法为子类的方法而不是父类的方法。
- 将父类对象赋值给子类句柄,ERROR不会执行
- 父类的句柄指向子类的对象,但是不能访问子类成员,使用虚方法可以访问子类的函数或者任务
- 使用系统函数$cast()进行类型转换,转换之后的新句柄可以访问函数与变量
线程同步,通信与虚方法相关推荐
- C#线程同步的几种方法
在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...
- linux进程同步/通信,线程同步/通信的区别
大家常问的是线程的同步和进程的通信,较少问线程通信和进程同步的,那它们有什么区别呢?其实它们没啥区别,线程同步和线程通信其实就是一回事,进程通信和进程同步也是一回事,不要被这些搞混了. linux线程 ...
- 归纳一下:C#线程同步的几种方法
我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线程 ...
- unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客
unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...
- linux:线程同步的5种方法
linux:线程同步的5种方法 一.为什么要使用线程: 二.线程同步的5种方法 2.1 互斥量 2.2 读写锁 2.3 条件变量 2.4 自旋锁 2.5 屏障 一.为什么要使用线程: <1> ...
- C++中线程同步的四种方法(Win32平台)
1.同步和互斥 互质是一种特殊的同步.线程同步一般指线程之间的执行存在某种程度上的相互依赖关系. 2.C++中线程同步的四种方法 (1)事件(Event); (2)信号量(semaphore); (3 ...
- linux c 线程同步的三种方法
目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...
- Linux 线程同步的三种方法
程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...
- java线程同步的五种方法
2019独角兽企业重金招聘Python工程师标准>>> 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, ...
最新文章
- 实用Jquery开发自己的插件
- MaxCompute Studio使用心得系列7—作业对比
- 成都机场迎春运客流高峰 日均起降航班超1000架次
- ROS学习之URDF
- Linux编程---线程
- (原创)网吧桌面背景添加文字,转载注明出处!
- Java常见面试知识点:继承、接口、多态、代码块
- 如何利用扩展欧几里得算法求解不定方程_欧几里德算法、拓展欧几里德、中国剩余定理...
- 计算机工程说课稿,人教版数学说课稿集合五篇
- everything 中文免安装_GTA5中文免安装版
- spring源码解析系列之事件驱动模型架构
- 12.万无一失:网站的高可用架构
- matlab符号函数绘图法_MATLAB符号运算实验
- mysql jdbc 水晶报表,水晶报表Crystal Report2008使用JDBC连接MySQL数据库-详细步骤
- excel取消隐藏_Excel教程:教你两招,批量取消隐藏工作表
- C/S模型与P2P模型
- 解读Tensor张量的维数
- python实现图像像素修改脚本
- 苹果12开发者设置_iPhone12手机5G在哪开启关闭 苹果12手机5G网络设置方法
- 基于AMSR-E和AMSR2数据的全球长时序日尺度土壤水分数据集(2002-2022)
热门文章
- 解决IE浏览器URL乱码的问题
- vue-touch不能上下滑动的问题【解决】
- git HEAD detached from origin 问题的解决
- 转义sed替换模式的字符串
- 将两个列表转换成字典
- win11资源管理器卡顿怎么办 Windows11解决资源管理器卡顿的步骤方法
- 苹果手机如何调节屏幕彩色(对于百度提供的方式行不通时此方法必有用)
- dataframe切片_Kaggle:识别淋巴结病理切片有无癌细胞(logistic+svm+rf+CNN)
- 问答 | 为什么两轮差速机器人转向运动是圆周运动
- python使用ddt_使用DDT数据驱动测试框架Python