systemVerilog 嵌套叉

Rud*_*y01 2 verilog hdl system-verilog

我遇到了别人写的代码,我不明白它是如何工作的?

 // Task A
 task sub_run_a();
    while ($time < 50us) begin
    #1us;
    $display("sub_run_a(): ping at time %d", $time);
  end
endtask : sub_run_a

// Task B
task sub_run_b();
  #5us;
  $display("sub_run_b() finished");
endtask : sub_run_b

// Task C
task sub_run_c();
  #10us;
  $display("sub_run_c() finished");
endtask : sub_run_c
Run Code Online (Sandbox Code Playgroud)

这就是测试台的设置方式:

fork 
  fork
    sub_run_c();  
    sub_run_b();
  join
    sub_run_a();
join_any
Run Code Online (Sandbox Code Playgroud)

看仿真结果,好像所有的任务都是并行运行的,不明白是怎么回事。

是不是任务 A 不应该在任务 B 和任务 C 完成之前开始?

但是,情况并非如此,因为这是输出:

# KERNEL: sub_run_a(): ping at time                 1000
# KERNEL: sub_run_a(): ping at time                 2000
# KERNEL: sub_run_a(): ping at time                 3000
# KERNEL: sub_run_a(): ping at time                 4000
# KERNEL: sub_run_b() finished
# KERNEL: sub_run_a(): ping at time                 5000
# KERNEL: sub_run_a(): ping at time                 6000
# KERNEL: sub_run_a(): ping at time                 7000
# KERNEL: sub_run_a(): ping at time                 8000
# KERNEL: sub_run_a(): ping at time                 9000
# KERNEL: sub_run_c() finished
# KERNEL: sub_run_a(): ping at time                10000
# KERNEL: sub_run_a(): ping at time                11000
# KERNEL: sub_run_a(): ping at time                12000
# KERNEL: sub_run_a(): ping at time                13000
# KERNEL: sub_run_a(): ping at time                14000
# KERNEL: sub_run_a(): ping at time                15000
# KERNEL: sub_run_a(): ping at time                16000
# KERNEL: sub_run_a(): ping at time                17000
# KERNEL: sub_run_a(): ping at time                18000
# KERNEL: sub_run_a(): ping at time                19000
# KERNEL: sub_run_a(): ping at time                20000
# KERNEL: sub_run_a(): ping at time                21000
# KERNEL: sub_run_a(): ping at time                22000
# KERNEL: sub_run_a(): ping at time                23000
# KERNEL: sub_run_a(): ping at time                24000
# KERNEL: sub_run_a(): ping at time                25000
# KERNEL: sub_run_a(): ping at time                26000
# KERNEL: sub_run_a(): ping at time                27000
# KERNEL: sub_run_a(): ping at time                28000
# KERNEL: sub_run_a(): ping at time                29000
# KERNEL: sub_run_a(): ping at time                30000
# KERNEL: sub_run_a(): ping at time                31000
# KERNEL: sub_run_a(): ping at time                32000
# KERNEL: sub_run_a(): ping at time                33000
# KERNEL: sub_run_a(): ping at time                34000
# KERNEL: sub_run_a(): ping at time                35000
# KERNEL: sub_run_a(): ping at time                36000
# KERNEL: sub_run_a(): ping at time                37000
# KERNEL: sub_run_a(): ping at time                38000
# KERNEL: sub_run_a(): ping at time                39000
# KERNEL: sub_run_a(): ping at time                40000
# KERNEL: sub_run_a(): ping at time                41000
# KERNEL: sub_run_a(): ping at time                42000
# KERNEL: sub_run_a(): ping at time                43000
# KERNEL: sub_run_a(): ping at time                44000
# KERNEL: sub_run_a(): ping at time                45000
# KERNEL: sub_run_a(): ping at time                46000
# KERNEL: sub_run_a(): ping at time                47000
# KERNEL: sub_run_a(): ping at time                48000
# KERNEL: sub_run_a(): ping at time                49000
# KERNEL: sub_run_a(): ping at time                50000 
Run Code Online (Sandbox Code Playgroud)

too*_*lic 5

外叉同时启动两件事:

  1. sub_run_a
  2. 内叉

内叉依次同时启动两件事:

  1. sub_run_c
  2. sub_run_b

因此,所有 3 个任务同时开始。

同样有趣的是,在 10us 内分叉完成后,sub_run_a 继续显示 ping。这可以disable fork在外叉之后控制。