Pueden crearse módulos parametrizados y especificar el valor de los parámetros en cada instancia del módulo. Las puertas primitivas tienen parámetros que han sido predefinidos como retrasos.
Sintaxis básica para instanciación
nombre_módulo #(valor_parámetro_1,
valor_parámetro_2, ...)
nombre_instancia(lista_conexión_puertos);
Ejemplos
// Definición de módulo
module shift_n // usado en módulo test_shift
#(parameter N = 2) // el valor por defecto de N es 2
(
input [7:0] it,
output [7:0] ot
);
assign ot = (it << N); // se desplaza a la izquierda n veces (bits)
endmodule //shift_n
El módulo anterior podría usarse (instanciarse) y conectar sus puertos en otros módulo, p.ej.:
// Instanciaciones parametrizadas
wire [7:0] in1, ot1, ot2, ot3;
// Conexiones implícitas
shift_n shft2(in1, ot1); // desplazamiento de 2; por defecto
shift_n #(5) shft5(in1, ot3); // desplazamiento de 5; reeemplaza parámetro 2.
// Conexiones explícitas
shift_n #(.N(3)) shft3(.it(in1), .ot(ot2)); // desplazamiento de 3; reeemplaza parámetro 2.
Otro ejemplo de un contador:
module counter (
input clk, rst,
output reg [7:0] count
);
parameter tpd_clk_to_count = 1;
parameter tpd_reset_to_count = 1;
//...
endmodule // counter
module test_counter;
reg clk_t, rst_t;
wire [7:0] count_t;
// conexión implícita:
counter #(5,10) dut(clk_t, rst_t, count_t);
/* conexión explícita:
counter #(5,10) dut(.count(count_t),
.clk(clk_t),
.rst(rst_t));
*/
//...
endmodule // test_counter
Sintaxis alternativa para instanciación
defparm nombre_instancia.parámetro = valor_parámetro;
nombre_módulo nombre_instancia(lista_conexión_puertos);
Ejemplo
// Instanciaciones parametrizadas
wire [7:0] in1, ot1, ot2, ot3;
defparm shft3.N=3, shift5.N=5;
shift_n shft2(in1, ot1), // desplazamiento de 2; por defecto
shift_n shft3(in1, ot2); // desplazamiento de 3; reeemplaza parámetro 2.
shift_n shft5(in1, ot3); // desplazamiento de 5; reeemplaza parámetro 2.
No todos los sintetizadores permiten la palabra clave defparam como forma alternativa de cambio de parámetros.
Uso de macros como parámetros
Las macros hacen sustituciones de cadenas y pueden funcionar como parámetros, especialmente útiles para parámetros sin necesidad de pasar por los módulos.
Ejemplo
// Uso de macros como parámetros
`define M 8 // ancho de palabra
module top
wire [`M-1:0] x, y, z; // equivalente a: wire [8-1:0] x,y,z;