Módulos parametrizados

Módulos

Módulos parametrizados

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;

Instanciación Operadores