2016-05-26 2 views
1

J'ai une question liée aux phases UVM. Comme j'ai compris les phases UVM par ex. build_phase, connect_phases, sont valides uniquement pour uvm_component et sont des classes dérivées.Phases UVM pour les objets de transaction

Cela signifie que toutes les classes dérivées de uvm_transaction, c'est-à-dire uvm_sequence, uvm_sequence_item ne supportent pas ces phases. Et dans le code si l'on écrit ce qui suit

class setupSeq extends uvm_sequence #(seqItem); 
     `uvm_object_utils(setupSeq ) 

    function build_phase (uvm_phase phase); 
     req = seqItem::type_id::create("req"); 
    endfunction 

    task body(); 
     start_item(req); 
      … 
     finish_item(req); 
    endtask 
… 

endclass 

Cela donnera l'erreur de simulation, comme build_phase ne sera jamais appelé et tâche de corps ne peut pas reconnaître l'objet « req ». Donc, ma question est - pourquoi les phases ne sont pas supportées pour uvm_transaction, c'est-à-dire les classes uvm_sequence?

Répondre

4

Parce que vous n'en avez pas besoin. Au moment où vous arrivez à construire des séquences, vous êtes déjà dans le run_phase. La durée de vie de toutes les séquences est pendant la phase d'exécution, donc avoir d'autres phases dans une séquence n'a pas de sens. La raison d'avoir des phases séparées build/connect/run est d'amener le testbench d'une manière ordonnée afin que vous puissiez établir des connexions d'un composant à l'autre sans vous soucier si cet autre composant existe encore.

Mettez donc votre construction req dans le constructeur de la séquence.

+0

Très bonne explication! Merci beaucoup Dave – haykp