6 votos

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

Quiero definir un add que tiene 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

He probado esta línea pero me da error:

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

7voto

Simon Gillbee Puntos 366

Has entendido mal el orden. Cuando se utiliza la asignación de valores de parámetros de módulo-instancia (la terminología más bien palabrería 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. Usted ya está familiarizado con la lista de terminales del módulo, así que voy a 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]

Así que su 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 primera versión (con nombre), porque mantiene su comportamiento si se añade otro parámetro.

El siguiente ejemplo ofrece opciones adicionales (está adaptado de la Figura 9-4 en Verilog HDL: Guía de diseño y síntesis digital 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 existe otro método que utiliza el defparam para definir los valores antes de la instanciación así:

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).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X