2016-10-25 4 views
0

나는 누군가가 실제로 무슨 일이 일어나고있는 나를 설명 할 수 누군가 포크와 루프를 시스템의 Verilog에서 설명 할 수 있습니까?

for(int j=1; j <=3; ++j) 
    fork 
     automatic int k = j; 
     begin 
      .... # use k here 
     end 
    join_none 
  • 참조

    은 아래의 예제를 붙여 넣기하고, SV LRM section 9.3.2를 거치지이 의심했습니다?

  • automatic 변수를 포크 외부로 이동하면 어떻게됩니까?

    for(int j=1; j <=3; ++j) begin 
        automatic int k = j; 
        fork 
         begin 
          .... # use k here 
         end 
        join_none 
    end 
    
  • 루프를 포크 내부로 이동하면 어떻게됩니까? 사전에

    fork 
        for(int j=1; j <=3; ++j) begin 
         automatic int k = j; 
         begin 
          .... # use k here 
         end 
        end 
    join_none 
    

감사합니다.

+0

, 무슨 일이 벌어지고있는 아이디어를 얻을 LRM의 예제를 수정하고 시뮬레이션을 실행하려면 :'#k에의 $ 쓰기 ("% 0D", k)를 #'에'(4-K) $ display ("k : % 0d j : % 0d", k, j);'. 'k'의 순서가 LRM의 예에서 존경 받고'j'는 각 인스턴스에서 동일하다는 것을 알 수 있습니다. 'j'에 대한 정확한 값은 LRM에 따라 결정되지 않으므로 다른 시뮬레이터는 다른 값을 표시 할 수 있습니다. – Greg

답변

4

자동 변수를 포크 외부로 이동하지만 여전히 for 루프의 begin/end 블록 내부에서 동일한 효과가 있습니다. 루프의 각 반복은 의 자체 로컬 복사본을 현재 루프 값 j으로 초기화합니다. 따라서 값 1,2 및 3을 가진 k의 사본 3 개를 얻습니다. fork/join_none에 의해 생성 된 각 프로세스는 k의 각 로컬 복사본에 바인딩됩니다. fork/join_none이 루프 안에 있기 때문에 세 개의 프로세스가 생성됩니다.

for 루프를 포크 내부로 이동하면 루프가있는 fork에 의해 생성 된 하나의 프로세스 만 가져옵니다. 루프 내의 코드가 순차적으로 실행되기 때문에 j 또는 k를 사용하면 문제가되지 않습니다.

0

1,3의 효과는 같을 것이고 fork...join의 각 스레드는 j (j = 1,2,3 ... 모두 취해집니다)의 적절한 값을 취할 것입니다.

그러나 두 번째 경우에는 스레드 외부에서 k에 값을 할당하므로 모든 스레드에 대해 k의 마지막 값이 사용됩니다.

다음은 각 경우에 대한 샘플 코드입니다.

// Code 1 
for(int j=1; j <=3; ++j) 
    fork 
     automatic int k = j; 
     begin 
      $display("Current Value - %0d", k); 
     end 
    join_none 
    wait_fork; 

// Output of Code 1 
Current Value - 1 
Current Value - 2 
Current Value - 3 

// Code 2 
for(int j=1; j <=3; ++j) 
begin 
    automatic int k = j; 
    fork 
     begin 
      $display("Current Value - %0d", k); 
     end 
    join_none 
end 
wait_fork; 

// Output of Code 2 
Current Value - 3 
Current Value - 3 
Current Value - 3 

// Code 3 
fork 
    for(int j=1; j <=3; ++j) 
     begin 
     automatic int k = j; 
     $display("Current Value - %0d", k); 
     end 
join_none 
wait fork; 

// Output of Code 3 
Current Value - 1 
Current Value - 2 
Current Value - 3 
+0

코드 2에 대한 관찰은 Dave가 한 설명과 모순됩니다. 코드 1과 코드 3은 동일한 출력을 제공하지만 코드 3은 실제로 포크로 실행되지만 코드 3은 순차적으로 실행됩니다. – justrajdeep

+0

그래,하지만 그게 VCS 도구를 사용한 결과 야. 그리고 모든 코드가 스레드를 열어 순차적으로 실행되지 않을 것이라고 생각합니다. –