2016-09-26 6 views
0

I는 다음과 같습니다 블록이 : 잘 작동 거의 모든 경우에이상한 행동

fork 
     begin  
      $display("before repeat");   
      repeat (delay_before_rsp2data) #1ps; 
      $display("after repeat"); 

      $display("some information"); 
      `ovm_do_on_with("do some stuff"); 
     end 
join_none 

을하지만, 하나의 경우 (내가 발견)에서`ovm_do_on_with 라인 후에는 점프 반복 선으로 돌아가서 거기에서 계속하십시오.

before repeat 
after repeat 
some information 
[all the displays from the `ovm_do_on_with part] 
after repeat 
some information 
[all the displays from the `ovm_do_on_with part] 

내가 for 루프로 전환, 엔드 블록 전에 내부 전체 '반복'라인을 퍼팅 시도하고, 그와 같은 몇 가지 더 조합 한 : 무엇을 표시하는 것은 때문에, 이런 일이 알고 , 그러나 항상 같은 행동.

어떤 원인 일 수 있습니까?

+0

이 아마도 당신이 [MCVE]를 게시한다 (http://stackoverflow.com/help/mcve). 문제가 보이지 않지만 세미콜론을 확인해야합니다. 처음 두 개의'$ display' 후에 하나가 있어야합니다. –

+0

블록을 입력 한 특정 시간에 특정 시드에서만 발생하기 때문에 실제로 검증 할 수는 없지만 추가 정보가 있는지 여부는 알 수 없습니다. –

답변

4

아마도 fork ... join_none을 두 번 이상 실행하고있는 것 같습니다 (아마도 루프 상태 일 것입니다). delay_before_rsp2data은 무작위입니다. 이 경우 after repeat은 (는) before repeat과 같은 스레드가 아닙니다.

내 의견에는 어떤 종류의 디버그와 추적을 위해 id을 추가하십시오. 예를 들어

int id=0; 

task my_fork; 
    fork 
    automatic int k; // !! must be automatic 
    begin 
     id++; k = id; 
     $display("before repeat, id %d", k); 
     repeat(delay) #1ps; 
     $display("after repeat, id %d", k); 
     `uvm_do_on_with(); 
    end 
    join_none 
endtask 

그런 다음 스레드를 추적하고 상호 연관시켜야합니다. automatic 변수가 fork join_none 안에 있으므로 해당 스레드의 스레드가 고유 한 id임을 기억해야합니다.

빠른 예 :

http://www.edaplayground.com/x/4vRd

+0

그래, 그게 다야. (덧붙여 말하면 2 일 동안 붙어서 대답하기 전에 10 분 정도 알아 냈다.) 감사! 첫 줄이 'get'인 것은 영원히 루프 안에 있었기 때문에 포크는 새 패킷에 의해 중단되었습니다. 해결책은 간단히 'ovm_do'라는 시퀀스로 지연을 옮기고 새로운 패킷이 플로우를 중단하고 변수를 덮어 씁니다. (로컬에만 충분하지 않았습니다) –

+0

잘 해결했습니다. 문제 없어. – AldoT