我可以使用“wait fork”来等待任务内生成的线程吗?

问题描述 投票:0回答:1

我正在尝试系统 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

我期望这两个版本的行为方式相同。 为什么会发生这种情况? 我们如何解决这个问题呢?如果我们需要从内部任务生成线程并等待它们怎么办?

verilog system-verilog vivado fork-join
1个回答
0
投票

这可能是 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
© www.soinside.com 2019 - 2024. All rights reserved.