线程间同步和通信,event semaphore mailbox
1. 概述
- 测试平台中的所有线程都需要同步并交换数据
- 一个线程等待另外一个,例如验证环境需要等待所有激励结束、比较结束才可以结束仿真
- 比如检测器需要将将测到的数据发送至比较器,比较器又需要从不同的缓存获取数据进行比较
2. 事件event
- 可以通过
event来声明一个命名event变量,并且去触发它
- 这个命名event可以用来控制进程的执行
- 可以通过
->来触发事件
- 其他等待该事件的进程可以通过@操作符或者wait()来检查event触发状态来完成
`timescale 1ns/1ns
module tb7;
event e1, e2, e3;
task automatic wait_event(event e, string name);
$display("@%t start waiting event %s", $time, name);
@e;
$display("@%t finish waiting event %s", $time, name);
endtask
initial begin
fork
wait_event(e1, "e1");
wait_event(e2, "e2");
wait_event(e3, "e3");
join
end
initial begin
fork
begin #10ns -> e1; end
begin #20ns -> e2; end
begin #30ns -> e3; end
join
end
endmodule

module tb8;
bit e1, e2, e3;
task automatic wait_event(ref bit e, input string name);
$display("@%t start waiting event %s", $time, name);
@e;
$d