Una vez que se incluye un paquete, se compila el archivo. Entonces, ¿por qué es necesario importar el mismo paquete?
Una vez que se incluye un paquete, se compila el archivo. Entonces, ¿por qué es necesario importar el mismo paquete?
Hay un artículo interesante aquí con respecto al diferencia entre import
y 'include
cuando se trata de paquetes. Voy a intentar resumirlo aquí.
Cuando 'include
un archivo, básicamente dice tomar el contenido de ese archivo y pegarlo en la ubicación de la declaración de inclusión. Este es efectivamente el mismo comportamiento que #include
en C / C ++.
Genial, estás pensando, ahora tenemos todo en el archivo, ¿por qué no podemos usarlo? Imagina el caso en el que estás declarando un paquete en SV. Si 'include
un archivo que contiene una clase A
en dos paquetes diferentes P
y Q
, básicamente está haciendo una copia diferente en cada paquete, lo que debido a la forma en que SV maneja los tipos será incompatible ( ahora tienes una clase llamada P::A
y otra llamada Q::A
).
Aquí es donde entra import
. A diferencia de 'include
, la declaración import
no copia las definiciones que se incluyen en el archivo, en lugar de eso simplemente las hace visibles. Esto es similar a la forma en que funciona el using namespace
en C ++. Digamos que todavía 'include
la clase A
en el paquete P
como antes. Pero ahora, en lugar de incluir A directamente en el paquete Q
, import P::A
en su lugar, tanto P
como Q
ahora contienen la misma clase P::A
en lugar de tener dos diferentes.
Así que en resumen:
'include
copia el contenido del archivo al hacer una copia local de cualquier clase / tipo / etc. import
no se copia, sino que hace visibles las declaraciones de paquetes existentes en el archivo actual. Lea otras preguntas en las etiquetas library system-verilog