数字验证学习笔记——SystemVerilog芯片验证20 ——线程间的通信

一、线程间的通信

  • 测试平台中的所有线程都需要同步交换数据
  • 一个线程需要等待另一个。
  • 多个线程可能同时访问同一个资源。
  • 线程之间可能需要交换数据。
  • 所有这些数据交换和同步称之为线程间的通信(IPC)

1.1 event 事件

  • Verilog 中,一个线程总是要等待一个带@操作符的事件。这个操作符是边沿敏感的,所以它总是阻塞着、等待事件的变化。
  • 其他线程可以通过 **->**操作符来触发事件,结束对第一个线程的阻塞。
  • 这就像在打电话时,一个人等待另一个人的呼叫。

1.1.1 event的边沿阻塞

在这里插入图片描述
event e1,e2; 创建对象,不需要new();
在这里插入图片描述
——>e1,相当于在这个时刻打出电话,如果此时对方没有@e1,就是及时接电话,将会错失这次电话。
在这里插入图片描述
在这里插入图片描述
@检测现在事件有没有触发过,wait就是检测事件现在有没有触发过 以及 之前有没有触发过。

1.1.2 通知的需求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时display中@e_speedup不可以替换成wait(e_speedup.triggered),因为wait(e_speedup.triggered)是电平触发,只要触发一次之后,使用wait(e_speedup.triggered),都满足要求。

1.2 semaphore旗语

  • semaphore 可以实现对 同一资源 的访问控制。
  • 对于初学者而言,无论线程之间在共享什么资源,都应该使用semaphore 等资源访问控制的手段,以此避免可能出现的问题。
  • semaphore有三种基本操作。**new()方法可以创建一个或者多个钥匙的semaphore,使用get()可以获取一个或者多个钥匙,而put()**可以返回一个或者多个钥匙。
  • 如果你试图获取一个semaphore而希望不被阻塞,可以使用**try_get()**函数。它返回1表示有足够多的钥匙,而返回0则表示钥匙不够。

1.2.1 semaphore的操作

在这里插入图片描述

  • 线程之间除了“发球”和“接球”这样的打乒乓以外,还有更深入的友谊,比如公用一些资源。
  • 对于线程间共享资源的使用方式,应该遵循 互斥访问(mutexaccess)原则
  • 控制共享资源的原因在于,如果不对其访问做控制,可能会出现多个线程对同一资源的访问,进而导致不可预期的数据损坏和线程异常,这种现象称之为“线程不安全”。
  • 还是以这辆BYD为主角,如果丈夫和妻子都要开这辆车,而这辆车只有一把钥匙的话,只能以一定的顺序先后使用,才可以解决开车的问题。

资源共享的需求
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 mailbox信箱

  • 线程之间如果传递信息,可以使用mailbox
  • mailbox和队列queue有相近之处。
  • mailbox是一种对象,因此也需要使用new() 来例化。例化时有一个可选的参数size来限定其存储的最大数量
    如果size是0或者没有指定,则信箱是无限大的,可以容纳任意多的条目。
  • 使用**put()可以把数据放入mailbox,使用get()**可以从信箱移除数据。
  • 如果信箱为满,则put()会阻塞;如果信箱为空,则get()会阻塞。
  • **peek()**可以获取对信箱里数据的拷贝而不移除它。
  • 线程之间的同步方法需要注意,那些是阻塞方法,那些是非阻塞方法,即哪些是立即返回的,而哪些可能需要等待时间的。

1.3.1 在线程间使用信箱通信

在这里插入图片描述
在这里插入图片描述

  • 对于一辆车子而言,如果要实时显示这辆车子的状态,会需要多个仪表。显示的参数包括车速、油量、发动机的转速和温度等,这些参数涉及到了各个传感器到汽车控制中枢的通信。
  • 如果我们继续通过上面这辆BYD,来模拟不同传感器(线程)到车的中央显示的通信,可以利用SV的mailbox(信箱)来满足多个线程之间的数据通信
    在这里插入图片描述
    3个mailbox 分别是温度、速度、油量;
    在这里插入图片描述
  • 对于mailbox的用法,与FIFO的使用很相似。如果我们将上面的mailbox用队列来替代的话,则可以修改为下面的代码。
    在这里插入图片描述
    如果不加ref,只相当于拷贝了tmp_q,传输到dispaly任务中,任务中对tmp_q的操作不会反应了到外部的tmp_q。
    在这里插入图片描述
    调用阻塞方法,只可以在task中调用,因为阻塞方法是耗时的。

对于mailbox变量的操作,在传递形式参数时,实际传递并拷贝的是mailbox的指针;而在第二个例子中的task_dispaly(),
关于queue的形式参数声明是ref方向,因为如果采用默认的input方向,那么传递过程中发生的是数组的拷贝,以致于方法
内部对queue的操作不会影响外部queue本身。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《SystemVerilog路科验证v2学习笔记》是一本非常全面深入的书籍,对于学习SystemVerilog语言及验证方法学习者是非常有帮助的。 本书详细介绍了SystemVerilog语言的基础知识和高级特性,包括数据类型、运算符、流控制语句、函数、任务、类、接口等内容,同时紧密结合实际应用场景,给出了大量的示例和案例,让读者能够深入理解语言的特性和应用。 在验证方法方面,本书介绍了常用的验证方法,包括自动化验证、端到端验证、仿真验证和硬件验证方法等。并且配合测试实践,详细介绍常用的验证步骤,例如验证计划、验证环境设计、测试用例生成、仿真调试等。 除此之外,本书还介绍了SystemVerilog中非常重要的Constrained Random Verification方法,包括约束对象、约束条件等内容的详细介绍。并且还介绍了常用的SystemVerilog验证库,例如UVM等内容。 本书内容丰富、实用性强,对于想要了解SystemVerilog语言和验证方法的读者来说,是一本非常不错的参考资料。但读者在阅读本书的时候,需要具备一定的硬件系统知识和编程基础,这样能够更好的理解及学习本书的知识内容。 ### 回答2: 路科验证v2学习笔记是一本全面介绍SystemVerilog验证语言的畅销书籍,共计600页。本书由作者路科阅读SystemVerilog语言规范,并将其实践经验结合编写而成。书中内容包含SystemVerilog语言的基础、高级语法、重要特性以及实际应用等方面,特别适合初学者和有一定基础的验证工程师阅读。 在基础部分,作者详细介绍了SystemVerilog语言的数据类型、操作符、数据结构及宏定义等内容,还介绍了模块的声明、端口、实例化及连接等基本使用方法。在高级语法部分,作者介绍了SystemVerilog中常用的语法,如过程、任务、函数、静态存储类、重载及继承等。另外,作者还介绍了异步时序控制器、顺序时序控制器、交互验证及UVM使用方法等内容。在实际应用方面,作者给出了一系列SystemVerilog验证实例,涉及到寄存器验证、串口验证、DMA验证、AXI验证等多个领域。 总之,如果您是SystemVerilog的初学者或想进一步学习这门语言,这本书可以作为一本好的学习笔记。 ### 回答3: SystemVerilog是一种硬件描述语言,主要用于硬件验证和设计。而路科验证v2学习笔记就是一本详尽的SystemVerilog学习资料,全书共600页,内容涵盖了从SystemVerilog基础语法到高级验证技术的全面介绍。 该书以工程实例为主线,结合实际项目经验,详细讲解了SystemVerilog语言的各个方面,包括数据类型、运算符、流程控制语句、函数、任务、类、接口、时序建模、仿真调试等。同时,本书还特别强调了SystemVerilog中重要的验证特性,如断言、覆盖率、约束随机等。 此外,路科验证v2学习笔记还提供了大量的实战练习,通过实践加深读者对SystemVerilog的理解和应用能力。同时,作者还介绍了常用的EDA工具、仿真平台和验证方法,帮助读者快速掌握实际应用技能。 总之,路科验证v2学习笔记是一本完整、系统、实用的SystemVerilog学习资料,适合各类硬件设计和验证工程师、从业人员、硬件爱好者及学生使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值