verilog - reg - Diferencia entre “parámetro” y “localparam”
verilog software (2)
En general, la idea detrás de localparam
(agregada al estándar Verilog-2001) es proteger el valor de localparam
de una redefinición accidental o incorrecta por parte de un usuario final (a diferencia de un valor de parameter
, este valor no puede ser modificado por la redefinición de parámetros o por una declaración de defparam
).
Basado en IEEE 1364-2005 (cap. 4.10.2):
Los parámetros locales de Verilog HDL son idénticos a los parámetros, excepto que no pueden ser modificados directamente por sentencias de defparam o asignaciones de valores de parámetros de instancia de módulo . A los parámetros locales se les pueden asignar expresiones constantes que contienen parámetros, que se pueden modificar con sentencias de defparam o asignaciones de valores de parámetros de instancia de módulo.
Además, en SystemVerilog ( IEEE 1800-2012 (cap. 6.20.4)):
A diferencia de los parámetros no locales, los parámetros locales se pueden declarar en un bloque de generación, paquete, cuerpo de clase o ámbito de unidad de compilación. En estos contextos, la palabra clave de parámetro será un sinónimo de la palabra clave localparam.
Los parámetros locales se pueden declarar en la lista de parámetros de puerto de un módulo. Cualquier declaración de parámetro que aparezca en dicha lista entre una palabra clave localparam y la palabra clave del siguiente parámetro (o el final de la lista, si no hay una palabra clave del siguiente parámetro) será un parámetro local. Cualquier otra declaración de parámetro en dicha lista será un parámetro no local que puede ser anulado.
Si desea obtener más información sobre este tema, le recomendaría el artículo de Clifford E. Cummings "¡ Nuevas técnicas de Verilog-2001 para crear modelos parametrizados (o abajo con` definir y la muerte de un defparam!) ".
Estoy escribiendo un proyecto con Verilog y quiero usar un parameter
para definir algún parámetro en mi módulo. Pero cuando leo algún código fuente, a veces se usa localparam
lugar de un parameter
.
¿Qué diferencia hay entre ellos?
Ejemplo minimo
Aquí hay un ejemplo de lo que Qiu mencionó.
En una memoria RAM, el tamaño de la memoria es una función de los tamaños de la palabra y la dirección.
Entonces, si el módulo principal especifica el tamaño de la palabra y la dirección, no debería poder especificar también el tamaño de la memoria.
module myram #(
parameter WORD_SIZE = 1,
parameter ADDR_SIZE = 1
) (
input wire [ADDR_SIZE-1:0] addr,
inout wire [WORD_SIZE-1:0] data,
// ...
);
localparam MEM_SIZE = WORD_SIZE * (1 << ADDR_SIZE);
// Use MEM_SIZE several times in block.
...
Y en el módulo principal, esto está bien:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2)
) top (
/* wires */
)
pero esto debería ser un error:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2),
.MEM_SIZE(2)
) top (
/* wires */
)
iverilog
no falla, y creo que esto es un error: https://github.com/steveicarus/iverilog/issues/157
Incisivo da un error como se esperaba.