2014-02-28 2 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가 살해 결코 극복 나타납니다 "과정이 살해 ..."왜이 과정을 계속 실행합니까?

답변

1

프로세스를 시작할 때 begin..end가 누락되었습니다. 귀하의 for는 다음과 같아야합니다 :

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를 입력하면 모든 명령문을 하나의 프로세스에 속하는 것으로 취급하게됩니다. 코드에서 수행하는 작업은 각 표시에 대해 별도의 프로세스를 생성하는 것입니다. 예를 들어 $ 표시 (...), if (...) 및 작업 할당 중 하나를위한 구문입니다.

다음은 EDA 운동장의 작동 예제입니다. http://www.edaplayground.com/x/2f8 프로그램을 해당 ModelSim 버전에서 작동하도록 모듈로 변경했습니다.

+0

오, 세상에, 미안, 내가 틀렸다 !!! 정말 고마워!!! – crazylk

+0

안녕하세요, 귀하의 프로그램을 시도하지만 "지연 2ns", "프로세스 2 죽인"메시지가 표시되지 않습니다, 그리고 VCS.you는 www.edaplaygroud에서 modelsim을 사용해야합니다. 만약 내가 (j == 2) 추가 .. . 그 밖의. .. 그래서 그것은 옳다! – crazylk

관련 문제