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

Вам не хватает начала ... при запуске процессов. Ваш должен выглядеть так:

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 

Поставив это начало .., вы обрабатываете все утверждения как принадлежащие одному процессу. То, что делал ваш код, порождает отдельный процесс для каждого оператора, т. Е. Один для $ display (...), один для if (...) и один для назначения задания.

Вот рабочий пример на игровой площадке EDA: http://www.edaplayground.com/x/2f8 Я изменил программу на модуль, чтобы работать над этой версией ModelSim.

+0

О, боже мой, извините, я ошибаюсь !!! большое спасибо!!! – crazylk

+0

Привет, я пробую вашу программу, но только отображаю сообщение «delay 2ns», а не сообщение «process 2 killed», и я использую VCS. Вы должны использовать modelsim в www.edaplaygroud.Then я добавляю if (j == 2) .. иначе ..., так что это правильно! HAHA – crazylk

Смежные вопросы