2017-09-29 1 views
-1

메모리 검증을 위해 계층화 된 테스트 벤치를 구축하려고합니다. 드라이버 및 모니터 측에서 read_data (메모리의 데이터 제외)를 표시하고 있습니다. 문제는 모니터가주기 시작시에만 트리거된다는 것입니다. 하지만 read_write = 0이 될 때마다 모니터가 실행되기를 원합니다. 모니터가 모든 시나리오를 고려하지 않는 이유는 무엇입니까? 환경 클래스에서 드라이버, 모니터 및 생성기의 run 메소드를 호출합니다. 링크 : http://www.edaplayground.com/x/389q모니터 동기화

답변

1

코드에 몇 가지 문제가 있습니다. 먼저 모니터 클래스에 forever 루프가 필요합니다. run() 메서드에 지금 쓰여지는 방식은 2 클럭 사이클 동안 대기 한 다음 read_write == 0을 기다린 다음 완료된 것입니다.

또 다른 문제는 계층 적 참조에서 modport 이름 monitor을 사용하고 있다는 것입니다. modport는 범위가 아니며 가상 인터페이스 변수를 선언 할 때 사용되는 액세스 목록입니다.

마지막으로 clocking 블록으로 작업 할 때 신호가 아닌 동기화를위한 클럭킹 이벤트 만 사용해야합니다.

class monitor; 

    virtual intf.monitor vintf; 

    function new(virtual intf.monitor vintf); 
    this.vintf=vintf; 
    endfunction 

    task run(); 
    forever 
     @(vintf.mo) // No ; here. You would get stuck in an infinite loop 
     begin 
     $display("--------MONITOR STARTS--------"); 
     @(vintf.mo iff (vintf.mo.read_write==0)) 
     begin 
     $display("--------MONITOR READDATA--------"); 
     $display(vintf.mo.read_data); 
     $display(vintf.mo.address); 
     end 
     end 
    endtask 
endclass