马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
最近无意中翻到了路桑写的书里面对于wait(event.triggered)的一条限制,有点颠覆了自己的认知,原话大致是”对于线程多次通知的需求,应使用@,而无法使用wait(event.triggered)。这是由于,当一个event被触发时,它的状态使event.triggered一直保持为true(1'b1)“。
为此自己还特意做了一个小实验,实验内容大致是这样,
fork
begin
#100ns;
->sync;
`uvm_info("thread1","----- sync event trigger -----",UVM_NONE);
end
begin
for(int k=0;k<3;k++)begin
#90ns;
wait(sync.triggered);
`uvm_info("thread2","----- get event -----",UVM_NONE);
end
end
begin
for(int i=0;i<3;i++)begin
#10ns;
wait(1);
`uvm_info("thread3","----- get event -----",UVM_NONE);
end
end
join
实验结果如下,打印完这几句以后,仿真就hang住了,看起来像是hang在wait(sync.tiggered)的地方。倘若按照路桑这哥们的说法,事件sync触发然后被wait(sync.triggered)捕捉到以后,sync.triggered的状态就一直为1了,那么就会像thread3一样,thread2接下来就会继续执行剩余的两次,但是事实并非如此。所以到底是我理解错了,还是这书上的东西写错了,有没有同仁指点一下?
[thread3] ----- get event -----
[thread3] ----- get event -----
[thread3] ----- get event -----
[thread1] ----- sync event trigger -----
[thread2] ----- get event -----
|