20 / 37 · Concepto
generate: construir circuitos estáticos con bucles
Usa genvar y generate-if para crear jerarquía con nombres y revisar la distribución de lanes.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
El bucle crea instancias, no ciclos
genvar y generate repiten estructura estática antes de ejecutar. Un bucle en always_comb describe cálculo procedural cuya implementación decide síntesis. Ninguno significa automáticamente una iteración por reloj: el procesamiento serie requiere estado y controlador. Este ejemplo divide un bus packed en LANES palabras de W bits y calcula una paridad por palabra; W y LANES son positivos.
module lane_parity #(
parameter integer W = 8,
parameter integer LANES = 3
) (
input logic [W*LANES-1:0] data,
output logic [LANES-1:0] parity
);
genvar lane;
generate
for (lane = 0; lane < LANES; lane = lane + 1) begin : g_lane
wire [W-1:0] word_data;
assign word_data = data[lane*W +: W];
assign parity[lane] = ^word_data;
end
endgenerate
endmoduledata[base +: W] selecciona W bits hacia índices mayores desde base, con W constante. W=8, LANES=3 asigna 7:0 a lane 0,15:8 a lane 1,23:16 a lane 2. g_lane proporciona nombres estables como g_lane[1].word_data.
Lee el orden de lanes
Para data=24'h03_01_80, desde lane 0 los valores son 80,01,03, paridades 1,1,0 y parity[2:0]=011. El byte izquierdo es lane 2. Separa índice, presentación y orden de transmisión. Los lanes son concurrentes y no hay latencia registrada. Más LANES añade lógica, no ciclos; fanout, conexiones y temporización física requieren comprobación aparte.
generate-if elige estructura fija
La condición es constante durante elaboración, como un parámetro de registro opcional. Una señal dinámica debe ir en lógica combinacional o con reloj. Cambiar entre salida registrada y no registrada cambia validez y obliga a ajustar contrato y checker. No desactives un bus poniendo cero: [−1:0] no es ancho cero seguro. Rechaza la configuración o crea una rama con interfaz definida.
Práctica: detecta intercambio de lanes
Prueba el ejemplo y activa un bit de cada lane: cambia solo su paridad. Dos bits activos en una palabra dan 0. Palabras idénticas ocultan slices intercambiados. La referencia extrae numéricamente cada lane y cuenta bits activos. Prueba W=1,8 y LANES=1,3 para cubrir suposiciones de byte, jerarquía y mínimo. Luego registra la paridad y define reset, enable y si comparas el bus actual o el capturado en un flanco anterior.