【多线程间的通信_2024.01.16】

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

event(事件)

静态的同步对象句柄,先等待@ or wait(event_handle.triggered),再触发→ event_handle
······························
@是阻塞的,错过操作的时间点,若没有捕捉到,就会被阻塞在那里
【多线程间的通信_2024.01.16】_第1张图片
【多线程间的通信_2024.01.16】_第2张图片
······························

SV中引入了triggered属性,用于查询事件是否已被触发(在当前时间片)
······························
【多线程间的通信_2024.01.16】_第3张图片
【多线程间的通信_2024.01.16】_第4张图片

第一个例子产生了竞争,第二个例子使用triggered都打印
······························

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

semaphore(旗语)

对同一资源的互斥访问
【多线程间的通信_2024.01.16】_第5张图片

mailbox(信箱)

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

new//产生有界无界mailbox
put & get//会阻塞
try_put & try_get//不会阻塞
peek & try_peek//拿数据后不会删除原始数据
num//mailbox中还有的数据数
mailbox #(类型)//可设置为传递固定类型

【多线程间的通信_2024.01.16】_第6张图片【多线程间的通信_2024.01.16】_第7张图片
【多线程间的通信_2024.01.16】_第8张图片

你可能感兴趣的:(IC验证,IC验证,linux)