2016-06-07 5 views
1

Ich bin auf diese Aussage gestoßen und ich habe viele Testbench-Komponenten mit diesem Prototyp verwendet. super.run_phase(), super.build_phase, super.connect_phase.Beispiel mit Super Funktionsaufruf in UVM

Kann jemand mit einem einfachen Beispiel erklären, warum wir jedes Mal Superfunktionen aufrufen müssen. Ich verstehe, dass wir Eltern konstruieren müssen, bevor wir das Kind konstruieren, aber warum müssen wir die connect_phase der Eltern usw. nennen?

Dank

Antwort

3

Vom UVM component source code, jede Phase von eine leere virtuelle Funktion/Aufgabe default:

function void uvm_component::connect_phase(uvm_phase phase); 
     connect(); 
     return; 
    endfunction 
function void uvm_component::connect();    
    return; 
endfunction 

Es ist nicht zwingend super.connect_phase oder jede Phase von der Basistest aufrufen oder Basistreiber usw.

Möglicherweise haben Sie die Umgebung im Basistest instanziiert und rufen von nun anansoll die erforderlichen Instanzen erstellen. Ebenso könnten Sie einige Ports-Exporte in der Basisumgebung/Agent verbinden und ein Anruf an super.connect_phase soll sie verbinden.

Aber build_phase ist eine Ausnahme. Es ist sehr empfohlen,build_phase/connect_phase für benutzerdefinierten Code zu verwenden, anstatt Code im Konstruktor zu verwenden.

Sie können super.build_phase()/super.connect_phase() in einer erweiterten Klasse fordern das zwingende Erfordernis abhängig oder die vorhandene Funktionalität in der Basisklasse build_phase()/connect_phase() hinzufügen.

Sie können einen Konstruktor nicht vollständig überschreiben, da SystemVerilog erfordert, dass der erweiterte Klassenkonstruktor super.new() aufruft.

Ein Anruf an super.build_phase() ist obligatorisch in der build_phase der Basisklasse, wenn die Feldautomatisierungsmakros verwendet werden.

Zum Beispiel:

class base_test extends uvm_test; 
`uvm_component_utils(base_test) 
//... 
function build_phase(uvm_phase phase); 
super.build_phase(phase); // for automatic configuration of fields 
endfunction 
//... 
function connect_phase(uvm_phase phase); 
super.connect_phase(phase); // normal practice 
endfunction 
endclass 

class my_test extends base_test; 
`uvm_component_utils(my_test) 
//... 
function build_phase(uvm_phase phase); 
super.build_phase(phase); // for environment creation 
endfunction 
//... 
function connect_phase(uvm_phase phase); 
// super.connect_phase(phase); // will compile even if not call-ed 
endfunction 
endclass 

Von UVM Class reference:

Jede Überschreibung sollte super.build_phase (Phase) nennen registed die automatische Konfiguration von Feldern auszuführen in der Komponente durch den Aufruf apply_config_settings. Um die automatische Konfiguration für eine Komponente zu deaktivieren, rufen Sie nicht super.build_phase (phase) auf.

Die apply_config_settings wird zum Anwenden von Konfigurationseinstellungen auf jedes Feld der Klasse verwendet.

Wenn Sie nicht wollen apply_config_settings für eine Komponente aufgerufen werden, dann ist die build_phase() Methode überlastet werden sollte, und Sie apply_config_settings nennen super.build_phase(phase).

+0

Ein weiterer wichtiger Unterschied ist das Aufrufen von Super.new ist nicht optional und muss die erste Anweisung im Konstruktor sein. In jeder anderen Methode ist es optional und muss nicht die erste Aussage sein. Dies bedeutet, dass Sie in der build_phase Factory- oder Konfigurations-Overrides bereitstellen und dann super.build_phase() aufrufen können. –

+0

Danke für die Antwort. Überprüfe mein Verständnis hier. Wenn env einen Treiber erstellen möchte und env beschließt, die Konfigurationseinstellungen des Treibers zu ändern. In diesem Fall ruft die build_phase-Funktion des Treibers super.build auf, und dies setzt die Konfiguration für den Treiber wie von env angefordert außer Kraft. Ist das richtig? – user1978273

+1

Es scheint, dass Sie in ** Eltern-Kind ** und ** Basis-erweiterte ** Beziehung verwirrt sind. Env ist der Elternteil des Treibers und base_driver (oder uvm_driver) ist die Basisklasse für user_defined_driver. Das Aufrufen von 'super.build_phase' aus Treiberaufrufen build_phase des Basistreibers (oder uvm_driver oder was auch immer die Basisklasse ist) ist nicht die Build-Phase von env. Der Basistreiber wendet Konfigurationseinstellungen an, die für uvm registrierte Felder erforderlich sind. – sharvil111

Verwandte Themen