2017-09-06 8 views
3

, 작업 안에 감지되지 않습니다 :이 테스트 벤치와 주변 재생이벤트를 Systemverilog에서 참조로 전달할 수 있습니까? 내가 작업을 호출하고 참조로 이벤트를 전달하면 이벤트가 트리거 된 후

event e; 

    fork 
    test_ev(e); 
    begin 
     #1ms; 
     ->e; 
    end 
    join 

    ... 

    task ev(ref event e); 
     @(e) 
     do_something; // this will never happen 
    endtask 

: http://www.edaplayground.com/x/5YS7, 그것은 어떤 것으로 보인다 시뮬레이터는 ref 이벤트과 같으며 일부는 그렇지 않습니다. 컴파일 경고는 발행되지 않지만 @ (..) 문은 전달되지 않습니다.

내게 Systemverilog를 사용하는 것 같습니다. 누락 된주의 사항이 있습니까?

답변

7

이벤트 변수를 참조로 전달할 필요가 없습니다. 이미 참조 용입니다.

여기서 문제는 SystemVerilog가 두 개의 구문을 단일 키워드로 묶어 버린 것입니다. Verilog에서 event은 방금 -> 트리거로 변경하고 다른 변수와 마찬가지로 변경 될 때까지 기다릴 수있는 가치없는 변수였습니다.

SystemVerilog는 event 데이터 형식을 클래스 변수처럼 동작하도록 향상 시켰습니다. event을 제외하고 생성자가 필요하지 않은 경우 모든 이벤트 선언은 자동으로 이벤트 객체를 생성합니다. 이렇게하면 이벤트가 Verilog와 역방향으로 호환됩니다. 한 이벤트 변수에서 다른 이벤트 변수로 할당을하면 핸들을 이벤트 객체에 복사합니다. 이는 클래스 변수를 복사하는 것과 동일합니다. 객체가 아닌 핸들 만 복사합니다.

코드를 작동 시키려면 refinput으로 대체하십시오.

+0

'event'의이 클래스 동작은 직관력이 없습니다. 그래서'input'이 작동하는 이유와 이해하는 것이 이해됩니다. 'ref '를 사용할 때 왜 작동하지 않는지 궁금합니다. 어쨌든이 작업 내에서 참조를 만들어야하지 않습니까? – chinocolerico

+0

LRM이 여기 분명하지 않다고 생각합니다. 이것은 참조 이벤트에 대한 참조이므로 @e는 참조가 이벤트 트리거 자체가 아닌 다른 이벤트 객체로 변경되기를 기다리는 것으로 해석 될 수 있습니다. 아마도 불법적 인 구조로 만들어야 할 것입니다. –

4

이벤트를 task ev(event e)으로 전달하면 클래스 개체에서 발생하므로 참조로 전달해야합니다. 이벤트가 실제로 데이터를 저장하지 않기 때문에 값으로 이벤트를 전달 (즉, 복사하여 새 이벤트를 제공)하는 것은 실제로 의미가 없습니다. 이것이 LRM에 명시 적으로 나열되어 있는지 확실하지 않지만 IMO는 상식 일뿐입니다.

블록이 트리거되지 않는 도구는 이벤트를 프리미티브로 처리하여 값으로 전달합니다. 나는 이것들에 대한 지원 사례를 제출할 것이다.

+0

나는 모든 프로그램에서 이벤트를 가치에 따라 전달하는 것이 타당하지 않을 것에 동의한다. 그러나 언뜻보기에 나는 그들이 int 나 bit와 같은 대우를 받았다고 기대했을 것입니다. @ dave_59가 제안한 것처럼 이벤트를 물음에 '입력'이라고 선언하면 문제가 해결되므로 도구가 올바른 작업을 수행하는 것으로 보입니다. 아직도 ref로 실패하는 이유를 아직 모르겠다. – chinocolerico