在类里边用,在软件世界里,验证环境里只能。fork join来创建并行的线程。
fork的差别就在于结尾处。
上面的线程要等20ns,下面的线程是要等eventA触发了以后。fork join是线程同时结束才能退出。;fork join_any是最短时间线程完成就会退出(后台线程还会继续执行)。join_none不需要等待。
`timescale 1ns/1ps
module tb;
task automatic exec(int id, int t);
$display("@%t exec[%0d] entered", $time, id);
#(t*1ns);
$display("@%t exec[%0d] entered", $time, id");
endtask
initial begin
exec(1, 10);
end
initial begin
exec(2, 20);
end
initial begin
exec(3, 30);
end
initial begin
exec(4, 40);
end
endmodule
module tb2;
task automatic exec(int id, int t);
$display("@%t exec[%0d] entered", $time, id);
#(t*1ns);
$display("@%t exec[%0d] exited", $time, id");
endtask
initial begin
$display("@%t fork-join_any entered", $time);
fork
exec(1, 10);
exec(2, 20);
join_any
$display("@%t fork-join_any exited", $time);
$display("@%t fork-join_any entered", $time);
fork
exec(3, 30);
exec(4, 40);
join_none
$display("@%t fork-join_none exited", $time);
wait fork;
$display("@%t ini_proc1 exited", $time);
end
initial begin
#200ns;
end
endmodule
可用wait fork或者disable fork来停止或等待(当前begin-end下所有的fork)子程序全部完成。
wait fork是包含begin end里边所有fork;disable会把所有没有执行完的失能掉。
class中使用时序控制,应该放在task里。等一些特定的时间。