systemverilog中的for和fork join嵌套
引言
在IC验证中通常需要并行发送激励,比如多个端口同时收发激励。这需要我们使用多线程的编程思路。sv中使用 fork join 来同时挂起多个线程。当需要同时挂起N个线程时,显然一个个挂起显得有些麻烦,而且代码不太雅观。这时候我们可以嵌套for循环来完成这一工作。本文章主要阐述sv中 for 和 fork join 的嵌套编程,以及遇到的问题和分析。
问题描述
同时挂起多个任务,不用等待直接退出
利用for嵌套fork join_none,同时挂起多个线程,在这里task proc一定要加automatic,这是因为sv中任务默认是静态的,如果你试图在测试程序里的多个地方调用同一任务,由于任务里的局部变量会使用共享的静态存储区,所以不同的线程之间会窜用这些变量。
`timescale 1ns/1ns
module top();
task automatic proc(int dw_num);
#1;
$display("#%0p dw_num=%0d",$time,dw_num);
endtask
task main_proc();
$display("#%0p enter main_proc()",$time);
endtask
task hwb();
for(int i=0;i<4;i++)
begin
automatic int j = i;
fork
proc(j);
join_none
end
main_proc();
endtask
initial begin
$display("-----------------------------------------------------------------");
hwb();
$display("-----------------------------------------------------------------");
#20;
$finish; //ends the simulation
end
endmodule
同时挂起多个任务,等到所有任务结束后退出
`timescale 1ns/1ns
module top();
task automatic proc(int dw_num);
#1;
$display("#%0p dw_num=%0d",$time,dw_num);
endtask
task main_proc();
#1 $display("#%0p enter main_proc()",$time);
endtask
task hwb();
for(int i=0;i<4;i++)
begin
automatic int j = i;
fork
proc(j);
join_none
end
wait fork;
main_proc();
endtask
initial begin
$display("-----------------------------------------------------------------");
hwb();
$display("-----------------------------------------------------------------");
#20;
$finish; //ends the simulation
end
endmodule
同时挂起多个任务,等到任一任务结束后退出
`timescale 1ns/1ns
module top();
task automatic proc(int dw_num);
#1;
$display("#%0p dw_num=%0d",$time,dw_num);
endtask
task main_proc();
#1 $display("#%0p enter main_proc()",$time);
endtask
task hwb();
for(int i=0;i<4;i++)
begin
automatic int j = i;
fork
begin
fork:work
proc(j);
join_any
disable work;
end
join_none
end
wait fork;
main_proc();
endtask
initial begin
$display("-----------------------------------------------------------------");
hwb();
$display("-----------------------------------------------------------------");
#20;
$finish; //ends the simulation
end
endmodule
仿真与结果分析
待续…