为什么这些SystemVerilog进程没有结束?

时间:2014-02-28 08:29:04

标签: system-verilog

以下程序启动了四个流程。任务首先等待最后一个进程开始执行,然后等待第一个进程终止。此时,父进程强制终止所有尚未完成的分叉进程。

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被杀...”为什么这个进程继续运行?

1 个答案:

答案 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版本。