Las declaraciones de módulo son plantillas a partir de las cuales se crean objetos reales (instanciaciones). Los módulos se instancian dentro de otros módulos, y cada instancia crea un objeto único a partir de la plantilla. La excepción es el módulo de nivel más alto (top) que es su propia instancia.
Sintaxis básica para instanciación
nombre_módulo
nombre_instancia_1(lista_conexión_puertos),
nombre_instancia_2(lista_conexión_puertos),
......
nombre_instancia_n(lista_conexión_puertos);
Argumentos del módulo
Los puertos del módulo instanciado deben coincidir con los definidos en la plantilla. Esto se especifica de dos formas posibles:
* por su nombre (conexión explícita), utilizando un punto (.), p.ej.
.template_port_name (name_of_wire_connected_to_port)
* por posición (conexión implícita), colocando los puertos en exactamente las mismas posiciones en las listas de puertos tanto de la plantilla como de la instancia.
Ejemplo
// MODULE DEFINITION
module and4(
input [3:0] a, b,
output [3:0] c
);
assign c = a & b;
endmodule //and4
// MODULE INSTANTIATIONS
wire [3:0] in1, in2;
wire [3:0] o1, o2;
/* C1 is an instance of module and4
C1 ports referenced by position */
and4 C1 (in1, in2, o1);
/* C2 is another instance of and4.
C2 ports are referenced to the
declaration by name. */
and4 C2 ( . c(o2), . a(in1), . b(in2));
Los módulos no pueden instanciarse dentro de bloques procedurales.