以下程序启动了四个流程。任务首先等待最后一个进程开始执行,然后等待第一个进程终止。此时,父进程强制终止所有尚未完成的分叉进程。
program automatic test;
initial begin
do_n_ways;
end
task do_n_ways;
process job[1:4];
for(int i=1;i<=4;i++)
fork
automatic int j = i;
job[j] = process::self();
$display("process %d starting...",j);
if(j==2) begin
#100 $display("delay 2ns");
end
join_none
for(int j = 1;j<=4;j++) begin //wait for all process starting
wait(job[j] != null);
end
job[1].await(); //wait for first process finish
for(int j=1;j<=4;j++) begin
if(job[j].status != process::FINISHED) begin
job[j].kill();
$display("process %d killed...",j);
end
end
endtask
endprogram
似乎进程#2永远不会被杀死,因为我从未看到“进程2被杀...”为什么这个进程继续运行?
答案 0 :(得分:1)
启动流程时,你错过了一个begin..end。你的应该看起来像这样:
fork
automatic int j = i;
begin // treat everything from here as an own process
job[j] = process::self();
$display("process %d starting...",j);
if(j==2) begin
#100 $display("delay 2ns");
end
end
join_none
通过放置begin..end,您将所有语句视为属于一个进程。你的代码正在做的是为每个语句产生一个单独的进程,即一个用于$ display(...),一个用于if(...),另一个用于分配作业。
以下是EDA Playground的工作示例:http://www.edaplayground.com/x/2f8 我将程序更改为模块以处理该ModelSim版本。