【包和线程的使用 & 多线程通信_2024.01.16】

在这里插入图片描述

包的使用

注意编译的前后顺序来写包里的文件顺序
package里包含软件,不可放入硬件

对于两个package中同名的类,若要使用不同package中的同名类,只需注明要使用哪一个package中的类

module arbiter_tb;
regs_pkg::monitor mon1=new();
arb_pkg::monitor mon2=new();
endmodule

方法一

files.f文件中:+incdir+PATH

方法二

//创建pkg.sv文件
package pkg;
`include "regs_stm.sv"
`include "regs_mon.sv"
`include "regs_chk.sv"
`include "regs_env.sv“
endpackage
//顶层加上
import pkg::*;//module外面

线程的使用

软件中每个进程里有很多线程,sv中进程等于线程
verilog中begin……end顺序执行,fork……join并发执行
sv中fork……join_any之间的任何一个子线程执行完就执行后面的语句
	fork……join_none子线程不执行完也执行后面的语句

多线程通信

对于硬件的过程块,不同逻辑/时序块之间的通信或者同步,实际是通过信号的变化来完成的。
对于软件的多个线程(多个task同时执行),可用如下方法解决:

event(事件)

静态的同步对象句柄,先等待@ or wait(event_handle.triggered),再触发→ event_handle
在这里插入图片描述
在这里插入图片描述

SV中引入了triggered属性,用于查询事件是否已被触发(在当前时间片)
@是阻塞的,错过操作的时间点,若没有捕捉到,就会被阻塞在那里

第一个例子产生了竞争,第二个例子使用triggered都打印
在这里插入图片描述
在这里插入图片描述

wait_order
//等待多个事件的触发,且要求这多个事件按照用户决定顺序触发,否则执行else后的语句

semaphore(旗语)

对同一资源的互斥访问,一个访问另一个就无法访问
1请求两把钥匙被阻塞,2访问,3无法访问
在这里插入图片描述

mailbox(信箱)

进程之间交换消息,数据通过一个进程发送给mailbox,然后由另一个进程获取(先进先出)

new               //产生有界无界mailbox
put & get         //会阻塞
try_put & try_get //不会阻塞
peek & try_peek   //从Mailboxes复制数据,如果Mailboxes为空,则当前进程将阻塞,直到Mailboxes中放入数据
num               //mailbox中还有的数据数
mailbox #(类型)   //可设置为传递固定类型

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iKUNqa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值