线程同步,通信与虚方法

目录

  • 线程同步,通信与虚方法

    • 进程同步,通信

      • 事件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()进行类型转换,转换之后的新句柄可以访问函数与变量

线程同步,通信与虚方法相关推荐

  1. C#线程同步的几种方法

    在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...

  2. linux进程同步/通信,线程同步/通信的区别

    大家常问的是线程的同步和进程的通信,较少问线程通信和进程同步的,那它们有什么区别呢?其实它们没啥区别,线程同步和线程通信其实就是一回事,进程通信和进程同步也是一回事,不要被这些搞混了. linux线程 ...

  3. 归纳一下:C#线程同步的几种方法

    我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线程 ...

  4. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客

    unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...

  5. linux:线程同步的5种方法

    linux:线程同步的5种方法 一.为什么要使用线程: 二.线程同步的5种方法 2.1 互斥量 2.2 读写锁 2.3 条件变量 2.4 自旋锁 2.5 屏障 一.为什么要使用线程: <1> ...

  6. C++中线程同步的四种方法(Win32平台)

    1.同步和互斥 互质是一种特殊的同步.线程同步一般指线程之间的执行存在某种程度上的相互依赖关系. 2.C++中线程同步的四种方法 (1)事件(Event); (2)信号量(semaphore); (3 ...

  7. linux c 线程同步的三种方法

    目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...

  8. Linux 线程同步的三种方法

    程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...

  9. java线程同步的五种方法

    2019独角兽企业重金招聘Python工程师标准>>> 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, ...

最新文章

  1. 实用Jquery开发自己的插件
  2. MaxCompute Studio使用心得系列7—作业对比
  3. 成都机场迎春运客流高峰 日均起降航班超1000架次
  4. ROS学习之URDF
  5. Linux编程---线程
  6. (原创)网吧桌面背景添加文字,转载注明出处!
  7. Java常见面试知识点:继承、接口、多态、代码块
  8. 如何利用扩展欧几里得算法求解不定方程_欧几里德算法、拓展欧几里德、中国剩余定理...
  9. 计算机工程说课稿,人教版数学说课稿集合五篇
  10. everything 中文免安装_GTA5中文免安装版
  11. spring源码解析系列之事件驱动模型架构
  12. 12.万无一失:网站的高可用架构
  13. matlab符号函数绘图法_MATLAB符号运算实验
  14. mysql jdbc 水晶报表,水晶报表Crystal Report2008使用JDBC连接MySQL数据库-详细步骤
  15. excel取消隐藏_Excel教程:教你两招,批量取消隐藏工作表
  16. C/S模型与P2P模型
  17. 解读Tensor张量的维数
  18. python实现图像像素修改脚本
  19. 苹果12开发者设置_iPhone12手机5G在哪开启关闭 苹果12手机5G网络设置方法
  20. 基于AMSR-E和AMSR2数据的全球长时序日尺度土壤水分数据集(2002-2022)

热门文章

  1. 解决IE浏览器URL乱码的问题
  2. vue-touch不能上下滑动的问题【解决】
  3. git HEAD detached from origin 问题的解决
  4. 转义sed替换模式的字符串
  5. 将两个列表转换成字典
  6. win11资源管理器卡顿怎么办 Windows11解决资源管理器卡顿的步骤方法
  7. 苹果手机如何调节屏幕彩色(对于百度提供的方式行不通时此方法必有用)
  8. dataframe切片_Kaggle:识别淋巴结病理切片有无癌细胞(logistic+svm+rf+CNN)
  9. 问答 | 为什么两轮差速机器人转向运动是圆周运动
  10. python使用ddt_使用DDT数据驱动测试框架Python