19 / 37 · Concepto
parameter, localparam, $clog2 y configuraciones límite
Separa entradas dinámicas de configuración estática y diseña anchura y terminación para N=1 y valores no potencia de dos.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Los parámetros se fijan al elaborar
Un puerto cambia durante funcionamiento; parameter configura antes de construir la estructura, y localparam nombra una constante derivada no sustituible por quien instancia. No son variables que cambien por ciclo. El contador módulo N usa estados 0..N−1. Para N≥2 requiere $clog2(N) bits; N=1 devuelve 0, así que garantiza al menos un bit. N=0 no pertenece al contrato.
Define finalización en un flanco habilitado
Al pasar el count anterior de N−1 a 0, el módulo registra pulse. Si no hay enable, mantiene count y limpia pulse. El reinicio síncrono limpia ambos y tiene prioridad. N debe ser entero positivo dentro del rango soportado.
module modulo_tick #(
parameter integer N = 5,
parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
input logic clk, rst, enable,
output logic [CW-1:0] count,
output logic pulse
);
localparam logic [CW-1:0] LAST = CW'(N-1);
always_ff @(posedge clk) begin
if (rst) begin
count <= '0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (enable) begin
if (count >= LAST) begin
count <= '0;
pulse <= 1'b1;
end else count <= count + 1'b1;
end
end
end
endmoduleCW se expone por aparecer en los puertos. Deja el valor predeterminado o uno ≥max(1,$clog2(N)). Un override menor trunca LAST; uno mayor añade códigos no usados, recuperados a 0 en un flanco habilitado mediante >=. CW'(N-1) explicita tamaño, pero no corrige configuración inválida. Valida antes de elaborar: una aserción dinámica no arregla una declaración mal formada.
Prueba una matriz
| N | CW predeterminado | count en flancos habilitados tras reset | pulse posterior |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,0,0,0,0,0,0,1 |
Un bit no convierte N=1 en dos estados válidos. N=5 no debe visitar 5,6,7 normalmente. Probar solo potencias de dos no detecta una comparación explícita de retorno ausente.
Práctica: comportamiento y rechazo de configuraciones
Instancia N=1,2,5,8 y recorre dos períodos; inserta flancos deshabilitados en el terminal y reset junto a enable. Revisa cada count y pulse. El modelo entero limpia con reset, pone pulse=0 y, si enable, incrementa módulo N detectando retorno, sin depender de CW ni codificación del DUT. Comprueba rechazo de N=0 y CW insuficiente. La reutilización solo está establecida para el rango especificado y verificado, no por un único valor predeterminado.