2016-11-28 1 views
1

In SV LRM 2012 sie sagen, dassDynamische Array von Schnittstellen in SV

interface_instantiation ::= interface_identifier [ parameter_value_assignment ] hierarchical_instance { , hierarchical_instance } ;

Wenn Bedeutung von hierarchical_instance Suche Sie

hierarchical_instance ::= name_of_instance ([ list_of_port_connections ]) name_of_instance ::= instance_identifier { unpacked_dimension }

Schließlich finden kann, kann es festgestellt, dass

unpacked_dimension ::= [ constant_range ] | [ constant_expression ]

Ich möchte es lesen, so dass Sie dynamische Array nicht haben können von Schnittstellen in Ihrem SV-Code, richtig? Aber wenn Sie den folgenden Code Linie sowohl mit VCS und Questa simuliert, funktioniert es ohne Warnung/Fehler:

virtual protocol_if ifs[]; 

Warum es funktioniert? Kannst du es mir erklären?

+0

Es ist, da Sie ** ** virtuelle Schnittstelle verwenden, die ist a ** Zeiger/Handle zur aktuellen Schnittstelle **. Es funktioniert möglicherweise nicht, wenn Sie die tatsächliche Instanziierung der Schnittstelle verwenden. Wenn die tatsächliche Schnittstelle verwendet wird, kann dieser Fehler auftreten: 'Dimension mit variabler Größe, die im Modulinstanzarray verwendet wird. Bitte verwenden Sie feste Dimensionen im Modulinstanzarray.' – sharvil111

+0

Ich kann die gleiche Art von Interpretation machen. Jedenfalls würde ich gerne eine genaue Erklärung in LRM finden. Wahrscheinlich kann ich es nicht finden, aber stattdessen muss ich zwischen den Zeilen lesen. – user7218867

Antwort

1

Es gibt einen Unterschied zwischen der Deklaration eines Arrays von Instanzen und der Deklaration einer Variablen mit einer Array-Dimension.

Die BNF-Syntax, die Sie anzeigen, ist für interface_instantiation, die ähnliche Regeln für module_instantiation hat. Das ist nur eine Abkürzung für eine generate-for-Schleife, die mehrere Instanzen mit Instanznamen erstellt, die einem Array-Index ähneln. Es ist kein echtes Array, bei dem jedes Element eine identische Kopie ist. Konstrukte wie defparam, bind und andere können die Merkmale jeder Instanz ändern. Aus diesem Grund dürfen Sie keine Variable verwenden, um eine bestimmte Instanz prozedural auszuwählen.

Die von Ihnen angezeigte Variablendeklaration bezieht sich auf eine virtuelle Schnittstelle, bei der es sich um einen Datentyp handelt.

// von A.2.1.3

data_declaration10 ::= [ const ] [ var ] [ lifetime ] data_type_or_implicit list_of_variable_decl_assignments ; | ...

// von A.2.2.1 ...

data_type ::= | virtual [ interface ] interface_identifier [ parameter_value_assignment ] [ . modport_identifier ]

+0

Danke! Den, nach dem ich gesucht habe. – user7218867