2014-02-28 37 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

相關問題