内容
时钟上升沿就是一个事件,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
通过一个事件传递进行同步
验证平台中的线程和内部通信