Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Parámetros de Verilog

Los parámetros son construcciones de Verilog que permiten reutilizar un módulo con una especificación diferente. Por ejemplo, se puede parametrizar un sumador de 4 bits para aceptar un valor para el número de bits y se pueden pasar nuevos valores de parámetros durante la instanciación del módulo. Entonces, un sumador de N bits puede convertirse en un sumador de 4 bits, 8 bits o 16 bits. Son como argumentos a una función que se pasan durante una llamada de función.

  
  
	parameter MSB = 7;                  // MSB is a parameter with a constant value 7
	parameter REAL = 4.5;               // REAL holds a real number
	
	parameter FIFO_DEPTH = 256, 
	          MAX_WIDTH = 32;           // Declares two parameters
	          
	parameter [7:0] f_const = 2'b3;     // 2 bit value is converted to 8 bits; 8'b3

  

Los parámetros son básicamente constantes y, por lo tanto, es ilegal modificar su valor en tiempo de ejecución. Es ilegal volver a declarar un nombre que ya está siendo utilizado por una red, variable u otro parámetro.

Hay dos tipos principales de parámetros, módulo y especificar y ambos aceptan una especificación de rango. Sin embargo, normalmente se hacen tan amplios como el valor que se va a almacenar los requiere y, por lo tanto, no es necesaria una especificación de rango.

Parámetros del módulo

Los parámetros del módulo se pueden usar para anular las definiciones de parámetros dentro de un módulo y esto hace que el módulo tenga un conjunto diferente de parámetros en el momento de la compilación. Un parámetro se puede modificar con el defparam sentencia o en la sentencia de instancia del módulo. Es una práctica común usar letras mayúsculas en los nombres de los parámetros para que se noten al instante.

El módulo que se muestra a continuación usa parámetros para especificar el ancho del bus, el ancho de los datos y la profundidad de FIFO dentro del diseño, y se puede anular con nuevos valores cuando se instancia el módulo o usando defparam declaraciones.

  
  
	// Verilog 1995 style port declaration
	module design_ip  ( addr,  
	                    wdata,
	                    write,
	                    sel,
	                    rdata);
	                    
	     parameter  BUS_WIDTH    = 32, 
	                DATA_WIDTH   = 64,
	                FIFO_DEPTH   = 512;
	                
	     input addr;
	     input wdata;
	     input write;
	     input sel;
	     output rdata;
	     
	     wire [BUS_WIDTH-1:0] addr;
	     wire [DATA_WIDTH-1:0] wdata;
	     reg  [DATA_WIDTH-1:0] rdata;
	     
	     reg [7:0] fifo [FIFO_DEPTH];
	                
	     // Design code goes here ...
	endmodule

  

En el nuevo estilo ANSI de declaración de puerto Verilog, puede declarar parámetros como se muestra a continuación.

  
  
module design_ip 
	#(parameter BUS_WIDTH=32, 
		parameter DATA_WIDTH=64) (	
		
		input [BUS_WIDTH-1:0] addr,
   	// Other port declarations
   );

  

Anulación de parámetros

Los parámetros se pueden anular con nuevos valores durante la instanciación del módulo. La primera parte crea una instancia del módulo llamado design_ip con el nombre d0 donde se pasan nuevos parámetros dentro de #( ) . La segunda parte usa una construcción Verilog llamada defparam para establecer los nuevos valores de los parámetros. El primer método es la forma más utilizada para pasar nuevos parámetros en diseños RTL. El segundo método se usa comúnmente en simulaciones de banco de pruebas para actualizar rápidamente los parámetros de diseño sin tener que volver a crear una instancia del módulo.

  
  
module tb;
	
	  // Module instantiation override
		design_ip  #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]);
		
		// Use of defparam to override
		defparam d0.FIFO_DEPTH = 128;
		
endmodule

  

Ejemplo

El contador del módulo tiene dos parámetros N y DOWN declarados para tener un valor predeterminado de 2 y 0 respectivamente. N controla el número de bits en la salida controlando efectivamente el ancho del contador. Por defecto es un contador de 2 bits. El parámetro DOWN controla si el contador debe aumentar o disminuir. De forma predeterminada, el contador disminuirá porque el parámetro está establecido en 0.

Contador ascendente de 2 bits

  
  
module counter
  #( 	parameter N = 2,
   		parameter DOWN = 0)
   		
  ( input 							clk,
    input 							rstn,
    input 							en,
   	output 	reg [N-1:0] out);
  
  always @ (posedge clk) begin
    if (!rstn) begin
      out <= 0;
    end else begin
      if (en)
        if (DOWN)
          out <= out - 1;
        else
          	out <= out + 1;
      else
         out <= out;     
    end
  end
endmodule

  

El contador del módulo se instancia con N como 2 aunque no es necesario porque el valor predeterminado es de todos modos 2. DOWN no ​​se pasa durante la instanciación del módulo y, por lo tanto, toma el valor predeterminado de 0, lo que lo convierte en un contador ascendente.

  
  
module design_top (    input clk,
                input rstn,
                input en,
                output [1:0] out);

    counter #(.N(2)) u0 (	.clk(clk),
                          .rstn(rstn),
                          .en(en));
endmodule

  

Vea que los parámetros predeterminados se utilizan para implementar el contador donde N es igual a dos, lo que lo convierte en un contador de 2 bits, y DOWN es igual a cero, lo que lo convierte en un contador ascendente. La salida del contador se deja desconectada en el nivel superior.

Contador regresivo de 4 bits

En este caso, el contador del módulo se instancia con N como 4, lo que lo convierte en un contador de 4 bits. A DOWN se le pasa un valor de 1 durante la instanciación del módulo y, por lo tanto, se implementa un contador descendente.

  
  
module design_top (    input clk,
                input rstn,
                input en,
                output [3:0] out);

    counter #(.N(4), .DOWN(1)) 
    		u1 (	.clk(clk),
              .rstn(rstn),
              .en(en));
endmodule

  

Especificar parámetros

Estos se utilizan principalmente para proporcionar valores de temporización y retraso y se declaran utilizando el specparam palabra clave. Se permite su uso tanto dentro de especificar bloque y el cuerpo del módulo principal.

  
  
	// Use of specify block
	specify
		specparam  t_rise = 200, t_fall = 150;
		specparam  clk_to_q = 70, d_to_q = 100;
	endspecify
	
	// Within main module
	module  my_block ( ... );
	 	specparam  dhold = 2.0;
	 	specparam  ddly  = 1.5;
	 	
	 	parameter  WIDTH = 32;
	endmodule

  

Diferencia entre especificar y parámetros de módulo

Especificar parámetro Parámetro del módulo
Declarado por specparam Declarado por parameter
Se puede declarar dentro de specify bloque o dentro del módulo principal Solo se puede declarar dentro del módulo principal
Pueden asignarse parámetros y parámetros específicos No se pueden asignar parámetros específicos
SDF se puede usar para anular valores Valores de parámetro de declaración de instancia o defparam se puede usar para anular

Verilog

  1. Tutorial de Verilog
  2. Concatenación Verilog
  3. Verilog - En pocas palabras
  4. Asignaciones de Verilog
  5. Bloqueo y no bloqueo de Verilog
  6. Funciones de Verilog
  7. Tarea Verilog
  8. Ámbito de referencia jerárquica de Verilog
  9. Generador de reloj Verilog
  10. Funciones matemáticas de Verilog
  11. Formato de hora de Verilog