Почему эти процессы 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 убит ...» Почему этот процесс продолжает работать?


person crazylk    schedule 28.02.2014    source источник


Ответы (1)


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

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.

person Tudor Timi    schedule 28.02.2014
comment
Привет, я пробую вашу программу, но отображаю только задержку 2 нс, не обрабатываю 2 убитых сообщения, и я использую VCS. Вы должны использовать modelsim в www.edaplaygroud. Затем я добавляю if(j==2) ... else ... , так что правильно!ХА-ХА - person crazylk; 03.03.2014