En Verilog, los parámetros son constantes y no pertenecen a ningún otro tipo de datos, como registros o tipos de datos netos.
Una expresión constante se refiere a un número constante o parámetro previamente definido. No podemos modificar los valores de los parámetros en tiempo de ejecución, pero podemos modificar un valor de parámetro usando el defparam declaración.
El defparam La declaración puede modificar parámetros solo en el momento de la compilación. Los valores de los parámetros se pueden modificar usando la especificación de retardo # con creación de instancias del módulo.
En Verilog , existen dos métodos para anular el valor de un parámetro de módulo durante la creación de instancias de un módulo.
- Utilizando la palabra clave defparam.
- Y asignación de valor de parámetro de instancia de módulo.
Después de la palabra clave defparam, se especifica la ruta jerárquica al parámetro y el nuevo valor del parámetro. Este nuevo valor debe ser una expresión constante. Si la expresión del lado derecho hace referencia a algún parámetro, debe declararse dentro del módulo donde se invoca defparam.
El método de asignación de valor de parámetro de instancia de módulo parece una asignación de retraso a la instancia de puerta. Este método anula los parámetros dentro de los módulos instanciados tal como aparecen en el módulo. Con este formato, los parámetros no se pueden omitir.
Las expresiones constantes pueden contener parámetros previamente declarados. Cuando se detectan cambios en los parámetros previamente declarados, todos los parámetros que dependen de este valor se actualizan automáticamente.
Considere que se puede parametrizar un sumador de 4 bits para que acepte un valor para el número de bits, y se pueden pasar nuevos valores de parámetros durante la creación de instancias del módulo. Entonces, un sumador de N bits se convierte en un sumador de 4, 8 o 16 bits. Son como argumentos de una función que se pasa durante una llamada a función.
parameter MSB = 7; // MSB is a parameter with the constant value 7 parameter REAL = 4.5; // REAL holds the real number parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters parameter [7:0] f_const = 2'b3; // 2 bit value is converted into 8 bits; 8'b3
Hay dos tipos de parámetros, módulo y especificar , y ambos aceptan una especificación de rango. Sin embargo, se fabrican tan anchos como el valor que se va a almacenar y, por lo tanto, no es necesaria una especificación de rango.
Parámetros del módulo
Se puede utilizar para anular las definiciones de parámetros dentro de un módulo y 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 declaración. Es común utilizar letras mayúsculas en los nombres para que el parámetro las note al instante.
El siguiente módulo utiliza 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 crea una instancia del módulo o mediante declaraciones defparam.
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]; endmodule
En el nuevo estilo ANSI de declaración de puerto Verilog, podemos declarar parámetros como:
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 creación de instancias del módulo. La primera parte es el módulo llamado diseño_ip con el nombre d0 donde se pasan nuevos parámetros dentro de # ().
La segunda parte es utilizar una construcción Verilog llamada defparam para establecer los nuevos valores de los parámetros. El primer método se utiliza habitualmente para pasar nuevos parámetros en diseños RTL. Y el segundo método se utiliza en simulaciones de bancos 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
El contador del módulo tiene dos parámetros. norte y ABAJO , que se declara que tiene un valor predeterminado de 2 y 0.
norte controla el número de bits en la salida, controlando efectivamente el ancho del contador. Es un contador de 2 bits por defecto.
Parámetro ABAJO controla si el contador debe aumentar o disminuir. El contador disminuirá porque el parámetro está establecido en 0.
Contador ascendente de 2 bits
seleccione SQL de varias tablas
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) (down) out <="out" - 1; + endmodule pre> <p>The module counter is instantiated with <strong> <em>N</em> </strong> as 2 even though it is not required because the default value is anyway 2.</p> <p> <strong> <em>DOWN</em> </strong> is not passed during module instantiation. And it takes the default value of 0 making it an up-counter.</p> <pre> module design_top (input clk, input rstn, input en, output [1:0] out); counter #(.N(2)) u0 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <p>The default parameters are used to implement the counter where <strong> <em>N</em> </strong> equals two, making it a 2-bit counter, and <strong> <em>DOWN</em> </strong> equals zero, making it an up-counter. The output from the counter is left unconnected at the top level.</p> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters.webp" alt="Verilog Parameters"> <p> <strong>4-bit down Counter</strong> </p> <p>In this case, the module counter is instantiated with N as 4 making it a 4-bit counter. DOWN is passed a value of 1 during the module instantiation and hence a down-counter is implemented.</p> <pre> 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 </pre> <br> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters-2.webp" alt="Verilog Parameters"> <h3>Specify Parameters</h3> <p>These parameters are used to provide time and delay values and declared using the <strong> <em>specparam</em> </strong> keyword. It is allowed to use both within the specified block and the main module body.</p> <pre> // 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 </pre> <h3>Difference between Specify and Module Parameters</h3> <table class="table"> <tr> <th>Specify parameter</th> <th>Module parameter</th> </tr> <tr> <td>Specify the specparam keyword declares parameter.</td> <td>The module parameter is declared by parameter.</td> </tr> <tr> <td>It can be declared inside a specific block or within the main module.</td> <td>It can only be declared within the main module.</td> </tr> <tr> <td>This parameter may be assigned specparams and parameters.</td> <td>This may not be assigned specparams.</td> </tr> <tr> <td>SDF can be used to override values.</td> <td>Instance declaration parameter values or defparam can be used to override.</td> </tr> </table> <p> <strong>Notes</strong> </p> <p>Here are some important notes for the Verilog parameters, such as:</p> <ul> <li>If we are using the <strong> <em>defparam</em> </strong> statement, we must specify a hierarchical path to the parameter.</li> <li>We cannot skip over a parameter in a <strong> <em>module instance parameter value assignment</em> </strong> . If we need to do this, use the initial value for a not overwritten parameter.</li> <li>When one parameter depends on the other, then the second will automatically be updated if we change the first one.</li> </ul> <hr></=>
Los parámetros predeterminados se utilizan para implementar el contador donde norte es igual a dos, lo que lo convierte en un contador de 2 bits, y ABAJO es igual a cero, lo que lo convierte en un contador ascendente. La salida del contador se deja desconectada en el nivel superior.
Contador descendente de 4 bits
En este caso, se crea una instancia del contador del módulo 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 creación de instancias 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 parámetros se utilizan para proporcionar valores de tiempo y retraso y se declaran utilizando el parámetro de especificación palabra clave. Está permitido utilizar tanto dentro del bloque especificado como en 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 parámetros de especificación y módulo
Especificar parámetro | Parámetro del módulo |
---|---|
Especifique el parámetro de declaración de palabra clave specparam. | El parámetro del módulo se declara por parámetro. |
Puede declararse dentro de un bloque específico o dentro del módulo principal. | Sólo se puede declarar dentro del módulo principal. |
A este parámetro se le pueden asignar parámetros y parámetros específicos. | Es posible que no se le asignen parámetros de especificación. |
SDF se puede utilizar para anular valores. | Los valores de los parámetros de declaración de instancia o defparam se pueden usar para anular. |
Notas
Aquí hay algunas notas importantes para los parámetros de Verilog, como:
- Si estamos usando el defparam declaración, debemos especificar una ruta jerárquica al parámetro.
- No podemos saltarnos un parámetro en un asignación de valor de parámetro de instancia de módulo . Si necesitamos hacer esto, use el valor inicial para un parámetro no sobrescrito.
- Cuando un parámetro depende de otro, entonces el segundo se actualizará automáticamente si cambiamos el primero.
=>