2016-08-29 2 views
1

Ich suche nach Erklärungen/Dokumentation zu einem bestimmten Systemverilog/OVM-Verhalten.OVM-Deklarationen innerhalb der Verbindungsphase

Ich habe eine Klasse mit einer Verbindungsphase. In der Verbindungsphase versuche ich ein ovm_object zu deklarieren, obwohl ich einige Probleme hatte. Wenn ich dies tun:

virtual function void connect(); 
    super.connect(); 

    `ifdef SOMETHING_ENABLE 
     ovm_object some_object; 
    `endif 
endfunction : connect 

ich einen Syntaxfehler, sagte die folgende Verilog-Quelle einen Syntaxfehler hat: „file.sv“ Token ‚some_object‘, und es verweist auf meine Codezeile mit der Erklärung von einem_Objekt.

Obwohl, wenn ich es wickeln mit einem "begin" und "end" Ich habe keine Fehler angezeigt:

virtual function void connect(); 
    super.connect(); 

    `ifdef SOMETHING_ENABLE 
    begin 
     ovm_object some_object; 
    end 
    `endif 
endfunction : connect 

Warum ist das? Kann jemand auf die Dokumentation dazu verweisen und/oder erklären, warum ich dieses Verhalten vom Compiler sehe?

Antwort

3

Die BNF für SystemVerilog erfordert, dass Deklarationen vor prozeduralen Anweisungen in einem Block kommen (Dies kommt von Verilog-Wurzeln in der Pascal-Programmiersprache). Wenn Sie sich das BNF für eine Funktion ansehen (Abschnitt A.2.6), sehen Sie, dass {tf_item_declaration} vor {function_statement_or_null} steht.

In Ihrem zweiten Beispiel, obwohl Sie keinen Syntaxfehler erhalten, können Sie nicht auf some_object außerhalb des Blocks verweisen. Stellen Sie also Ihre Anmeldung vor dem Anruf auf .

+1

Wenn ich also einen Anfangs- und Endblock hinzufüge, zu welchem ​​Abschnitt des BNF? Würde das unter A.2.8 Block item declaration fallen? – user1334858

+2

und A.6.3 _seq_block_ und A.6.4 _statement_item_ –

Verwandte Themen