下面代码是使用事件实现同步的生产方和消费方
program automatic mbx_evt;
mailbox mbx;
event handshake;
class Producer;
task run;
for(int i=1; i<4; i++)begin
$display("Producer: before put (%0d)", i);
mbx.put(i);
@handshake;
$display("Producer: after put (%0d)", i);
end
endtask
endclass
class Consumer;
task run;
int i;
repeat(3)begin
mbx.get(i);
$display("Consumer: after get(%0d)", i);
->handshake;
end
endtask
endclass
Producer p;
Consumer c;
initial begin
mbx = new();
p = new();
c = new();
//使生产方和消费方并发运行
fork
p.run();
c.run();
join
end
endprogram
程序运行结果:
Producer: before put (1)
Consumer: after get(1)
Producer: after put(1)
Producer: before put(2)
Consumer: after get(2)
Producer: after put(2)
Producer: before put(3)
Consumer: after get(3)
Producer: after put(3)
可以看到,生产方和消费方运行时成功地取得了同步,因为在旧的数值被消费方读走之前,生产方不会再产生新值了。