¿Cómo defino un módulo con un parámetro modificado en Verilog?

5

Quiero definir un módulo add que tenga un parámetro modificado en mi declaración de la nueva instancia, pero no va bien.

Está en Verilog. Quiero definir una instancia de este módulo:

module add #(parameter wd=1) (input wire [wd-1:0] a,b, output wire [wd-1:0] o);
   assign o = a + b;
endmodule

Intenté esta línea pero obtengo un error:

 add len_plus_1 #(8)(.a(len),.b(8'h1),.o(lenPlus1));
    
pregunta 0x90

1 respuesta

7

Tienes mal el pedido. Cuando se utiliza la asignación de valor de parámetro de instancia de módulo (la terminología más bien prolija para este método), la sintaxis es:

module-name #(parameter-assignment) instance-name (module-terminal-list) ;

donde la asignación de parámetros puede ser por nombre o por el orden de los valores. Ya está familiarizado con la lista de terminales del módulo, así que le daré el parámetro BNF:

parameter-assignment ::= (values-by-name / values-by-order) 
values-by-name ::= .parameter-name(parameter-value)*[, parameter-name(parameter-value)]
values-by-order ::= parameter-value*[, parameter-value]

Entonces tu ejemplo debería ser uno de los siguientes:

add #(.wd(8)) len_plus_1(.a(len),.b(8'h1),.o(lenPlus1));
add #(8) len_plus_1(.a(len),.b(8'h1),.o(lenPlus1));

Se prefiere la versión anterior (con nombre), porque mantiene su comportamiento si agrega otro parámetro.

El siguiente ejemplo ofrece opciones adicionales (esto se adapta de la Figura 9-4 en Verilog HDL: una guía para Diseño digital y síntesis por Palnitkar )

module bus_master;
  // Note: These could also be ANSI C-style parameter declarations with 
  // module bus_master (#parameter delay1 = 2, delay2 = 3, delay3 = 7);
  parameter delay1 = 2;
  parameter delay2 = 3;
  parameter delay3 = 7;
  ...
  <module internals>
  ...
endmodule

module top;
  // Assignment by name:
  bus_master #(.delay2(4), delay3(8)) b1();
     //delay1 = 2 (default), delay2 = 4, delay3 = 8
  bus_master #(.delay1(1), delay3(6)) b2();
     //delay1 = 1, delay2 = 3 (default), delay3 = 6

  // Assignment by order:
  bus_master #(7, 8, 9) b3();
     //delay1 = 7, delay2 = 8, delay3 = 9
  bus_master #(1, 3, 5) b4();
     //delay1 = 1, delay2 = 3 (default, but by assignment), delay3 = 5
  bus_master #(1, 5) b5();
     //delay1 = 1, delay2 = 5, delay3 = 7 (default)
endmodule

También hay otro método que utiliza la palabra clave defparam para definir los valores antes de la creación de instancias como esta:

module top; 
  defparam b6.delay1 = 1;
  bus_master b6();
     //delay1 = 1, delay2 = 3 (default), delay3 = 7 (default)
endmodule;

pero eso se considera un estilo pobre (aunque personalmente, lo prefiero a la sintaxis de valores por orden).

    
respondido por el Kevin Vermeer

Lea otras preguntas en las etiquetas