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)
外叉同时启动两件事:
内叉依次同时启动两件事:
因此,所有 3 个任务同时开始。
同样有趣的是,在 10us 内分叉完成后,sub_run_a 继续显示 ping。这可以disable fork在外叉之后控制。
| 归档时间: |
|
| 查看次数: |
3305 次 |
| 最近记录: |