我正在尝试系统 verilog 线程,并且编写了以下运行良好的示例。 目标只是生成 2 个打印数字的任务,并使用“wait fork”而不是简单的“join”等待它们。
program automatic tb_wait_fork();
task wait_and_print_int(int data);
#5;
$display(">> task got data %d @ %t", data, $time);
endtask
initial begin
fork
wait_and_print_int(10);
wait_and_print_int(20);
join_none
$display(">> fork completed...");
wait fork;
$display(">> wait fork completed. exiting...");
end
endprogram
使用 Vivado v2023.2 的输出是:
>> fork completed...
>> task got data 10 @ 5000
>> task got data 20 @ 5000
>> wait fork completed. exiting...
$finish called at time : 5 ns : File "C:/Users/HP/repos/sv_tb_test/tb_wait_fork.sv" Line 8
现在我想从任务内部而不是主初始块中生成线程,但我仍然想在初始块中等待它们。
program automatic tb_wait_task();
task wait_and_print_int(int data);
#5;
$display(">> task got data %d @ %t", data, $time);
endtask
task spawn_threads();
fork
wait_and_print_int(10);
wait_and_print_int(20);
join_none
$display(">> fork completed...");
endtask
initial begin
spawn_threads();
wait fork;
$display(">> wait fork completed. exiting...");
end
endprogram
这似乎不起作用,因为显示语句未执行:
>> fork completed...
>> wait fork completed. exiting...
$finish called at time : 0 fs : File "C:/Users/HP/repos/sv_tb_test/tb_wait_task.sv" Line 17
我期望这两个版本的行为方式相同。 为什么会发生这种情况? 我们如何解决这个问题呢?如果我们需要从内部任务生成线程并等待它们怎么办?
这可能是 Vivado 错误。
当我在 EDA Playground 上运行你的代码时,我得到了不同的输出。使用 VCS:
>> fork completed...
>> task got data 10 @ 5
>> task got data 20 @ 5
>> wait fork completed. exiting...
$finish at simulation time 5