systemverilog 中fork join中并发执行顺序问题
fork
A;
B;
join
task A();
optA();
config_done.trigger();
endtask
task B();
config_done.wait_trigger();
optB();
endtask
- 理论上A 和B是并发执行的,刚好最近碰到一个问题,刚好optA不需要消耗时间,此时task B就会卡住.
- 如果将fork join中改写为:
fork
B;
A;
join
则B可以顺利执行结束.虽然log上打印A,B进入的时间是一样的,但实际还是不同,而且在fork join中task顺序还是有一点影响的(当然除非极端情况,不然不会有实际影响).另外另一种方法是在task A中加一个# 0 延时也可以保证不卡死.
以上只是本人猜测,如果错误欢迎指出.