2017-09-29 7 views
-1

私は、メモリ検証用のレイヤードテストベンチを構築しようとしています。私はドライバとモニタ側でread_data(メモリのデータ)を表示しています。問題は、モニタがサイクルの開始時にのみトリガされることです。しかし、read_write = 0になるたびにモニターを起動させたい。なぜモニターはすべてのシナリオを考慮していないのですか? 環境クラスでは、ドライバ、モニタ、ジェネレータのrunメソッドを呼び出しています。 リンク:http://www.edaplayground.com/x/389qモニタ同期

答えて

1

コードにいくつかの問題があります。まず、モニタークラスにループforeverが必要です。 run()メソッドで今書かれている方法は、2クロックサイクル待ってからread_write == 0を待ってから終了します。

もう1つの問題は、階層参照で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 
関連する問題