8 de febrero de 2026
En SystemVerilog se usa generate para crear hardware repetidamente. La estructura típica de un generate es:
genvar i;
generate
for (i = 0; i < N; i++) begin : gen_block_name
// lógica replicada
// instancias, assigns, always_*, etc.
end
endgenerate
Notas:
genvar es obligatorio para los bucles generate.
generate ... endgenerate es opcional en SystemVerilog moderno (pero recomendable).
No puede usar señales dinámicas, solo parámetros y constantes.
En este ejemplo vamos acrear N registros iguales, uno por cada bit de un bus.
Se crean N bloques always_ff independientes donde gen_regs[i] es el nombre jerárquico de cada instancia.
module reg_bank #(
parameter N = 8
)(
input logic clk,
input logic [N-1:0] d,
output logic [N-1:0] q
);
genvar i;
generate
for (i = 0; i < N; i++) begin : gen_regs
always_ff @(posedge clk) begin
q[i] <= d[i];
end
end
endgenerate
endmodule
También se puede usar la declaración generate para instanciar múltiples módulos de manera repetida.
module top (
input logic clk,
input logic [3:0] d,
output logic [3:0] q
);
genvar k;
generate
for (k = 0; k < 4; k++) begin : gen_ff
dff u_dff (
.clk(clk),
.d(d[k]),
.q(q[k])
);
end
endgenerate
endmodule
La diferencia fundamental es que en el bucle for-loop concurrente replica hardware, mientras que el bucle for-loop de procedimiento describe el comportamiento del circuito.
Por ejemplo, el siguiente bucle for-loop concurrente crea hardware en paralelo, es decir, el bucle for no se ejecuta si no que replica hardware cuatro veces:
genvar i;
generate
for (i = 0; i < 4; i++) begin : gen_and
assign y[i] = a[i] & b[i];
end
endgenerate
El bucle for-loop del siguiente ejemplo describe el comportamiento secuencial, el bucle for sí se ejecuta, las iteraciones ocurren una detrás de otra.
always_comb begin
for (int i = 0; i < 4; i++) begin
y[i] = a[i] & b[i];
end
end