SV 线程内部通信
内容
- 时钟上升沿就是一个事件,event是一个关键字,可以触发事件
- mailbox - 用于传递信息,将信息给到mailbox进行传递
内部线程通信
- 事件传递,对于线程进行控制
- 对于数据和资源进行传递
内部线程通信机制:Verilog event
- event - 是一个数据类型
- -> - 触发事件
begin
$display();
#10
-> // 不会阻塞线程的执行
$display();
end
- 仿真开始的时候两个initial会同时执行
- 先执行两个initial语句中的$display(在仿真的0时刻进行执行)
事件中的循环
event可以作为参数
阻塞事件触发和非阻塞事件触发
event e1,e2
initial begin
@(e1) $display(e1);
end
initial begin
@(e2) $display(e2);
end
a = 1,b=2,c=3;
initial begin
#1;
b <= a;
c <= b;
a <= c;
->> e1; // 非阻塞触发e1
-> e2; // 阻塞赋值触发e2
end
- 阻塞语句先执行,非阻塞语句后执行
旗语Semaphore
- 执行的时候,两个agent同时调用task agent,两个线程会对共享资源进行竞争,线程0和线程1会产生交替执行
- 使用semaphore进制可以实现资源的独占性,可以理解资源放在一个箱子里,线程使用的时候需要拥有自己的要是,一个线程用完之后,另外一个线程才能使用
- 共享资源在不同的进程中是互斥的
- 使用new(num)的时候,传入钥匙的数量
- 如果在执行get函数取钥匙的时候,取不到钥匙或者是钥匙数量不够,都会阻塞进程的执行,直到取到钥匙
mailbox
- 通过mailbox实现数据在两个进程之间传递
- mailbox中没有数据的时候,线程也会等待
- mailbox类似于一个fifo,可以设置一定的深度,mailbox满的时候,不能存储
- mailbox是一个SV内建的类,提供了一些方法
- 创建mailbox对象的时候,new()不传入mailbox的深度,默认为没有深度,不会满
- 通过mailbox可以传递mailbox
- 通过一个事件传递进行同步
验证平台中的线程和内部通信