2015-01-28 3 views
-1

나는 포크 Verilog 코드를 결합 구현하기 위해 노력하고 있지만, 뭔가 잘못이다 b은 매우 모호한 값 때문에병렬 포크가 정확히 병렬로 결합합니까?

reg [7:0] a, b; 
initial fork 
a = 0;    // initial 
b = 0;    // initial 
#1 a = 1;   
#1 b = a + 1;  // is b 1 or 2? 
join 

위의 코드는 혼란 스럽다. 아시다시피, 포크 결합은 병렬로 작동하므로 b은 1이어야합니다. 맞습니까?

나의 시뮬레이션 결과는 'b'가 2가 아니라는 것입니다.하지만 내 생각에는 1이되어야합니다. 왜냐하면 a가 아직 1이 아니기 때문입니다.

나는 이와 같은 몇 가지 예제 코드를 작성하려고합니다.

Initial 
$display("initial time = %d", $time); 

Fork 
#1000 $display("spend time = %d at #1000", $time); 
#5 $display("spend time = %d at #5", $time); 
#50 $display("spend time = %d at #50", $time); 
join 

$display("main process time = %d", $time); 
end 

다음과 같이 나타납니다. 시간을 보내 1000 주요 처리 시간 1000

0 지출 시간 5 지출 시간 50 그래서이 실험에서, 나는 포크에 대해 그것을 가지고 초기 시간은 가입 할 수 있습니다.

그래서이 중 하나를 더 좋아합니다. FK 1, 0, 200 떨어져하지만 결과 이상 이해하지 않는 경우

Initial begin 
'Ifdef FK 
fork 
'endif 
$display ("initial time %d , $time); 
a<=0; 
b<=0; 

#100 a<=1; 
#100 b<=a+1; 
'Ifdef FK 
join 
'Endif 
$display ("the output a,b %d %d time %d, a,b, $time); 
End 

결과는 또한이 0, 0, 100 같다. 그들은 왜 0,0,100과 1,0,200을 가지고 있습니까?

+0

당신이 그것을 시뮬레이션 할 때 당신은 무엇을 어떻게해야합니까? – Morgan

답변

1

포크 참여 코드를 모두 병렬로 실행합니다. 나는 그것이 명시 적으로 LRM에 언급 된 것을 볼 수는 없지만, 병렬 블록의 경우 실행 순서가 결정적이지 않다는 것이 나의 이해입니다. 따라서 시뮬레이터가 #1 a = 1; 또는 #1 b = a + 1;을 먼저 실행할지 여부는 알 수 없습니다.

SystemVerilog IEEE1800-2012의 9.3.2 절은 병렬 블록을 다룹니다.

코드가 initial 인 경우 코드는 시뮬레이터에서 순차적으로 실행되어 각 행을 차례로 평가합니다. 이것은 결정적이며 작성된 순서대로 코드가 실행됩니다.

포크의 상당 것 조인 :

initial 
    a = 0;  

initial 
    b = 0;  

initial 
    #1 a = 1; 

initial 
    #1 b = a + 1; 
+0

감사합니다. 선생님, 훌륭한 설명입니다. – JamJI

관련 문제