2014-02-28 38 views
0

下面的程序启动四个进程。该任务首先等待最后一个进程开始执行,然后等待第一个进程终止。此时,父进程强制终止尚未完成的所有分叉进程。为什么这些SystemVerilog进程没有结束?

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

您在启动流程时缺少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游乐场的一个工作示例:http://www.edaplayground.com/x/2f8 我将程序更改为模块以使用该ModelSim版本。

+0

哦,我的上帝,对不起,我错了!万分感谢!!! – crazylk

+0

嗨,我尝试你的程序,但只显示“延迟2ns”,而不是“进程2死亡”的消息,并使用VCS.You应使用modelsim在www.edaplaygroud.Then我添加if(j == 2)..其他......,没错!哈哈 – crazylk

相关问题