2017-09-29 1 views
-1

J'essaie de créer un banc d'essai à couches pour la vérification de la mémoire. J'affiche read_data (sortie des données de la mémoire) au niveau du pilote et du moniteur. Le problème est que le moniteur est seulement déclenché au début du cycle. Mais je veux qu'un moniteur soit déclenché chaque fois que read_write = 0. Pourquoi un moniteur ne prend-il pas en compte tout le scénario? En classe d'environnement, j'appelle la méthode d'exécution du pilote, du moniteur et du générateur. Lien: http://www.edaplayground.com/x/389qSynchronisation du moniteur

Répondre

1

Un couple de problèmes avec votre code. Tout d'abord, vous voulez probablement une boucle forever dans votre classe de moniteur. La façon dont il est écrit maintenant dans la méthode run() est qu'il attend 2 cycles d'horloge, puis attend read_write == 0, puis il est terminé.

Un autre problème est que vous utilisez le nom de modport monitor dans vos références hiérarchiques. Une modport n'est pas une portée, c'est une liste d'accès utilisée lors de la déclaration d'une variable d'interface virtuelle.

Enfin, lorsque vous travaillez avec des blocs clocking, vous devez utiliser uniquement l'événement de synchronisation d'horloge pour la synchronisation, jamais les signaux bruts.

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