Es una construcción que ya disponía Verilog en su versión de 2001
En principio estaba pensado para replicado de instancias cuando se quería realizar de manera lo más automática posible.
Por ejemplo si se quería instanciar 32 sumadores de tipo Full Adder para la construcción de un sumador «ripple carry» de 32 bits, se puede recurrir de manera elegante a este tipo de construcción que nos permite un replicado rápido
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
module add_array (A, B, CIN, S, COUT) ; input [31:0] A, B ; input CIN ; output [31:0] S ; output COUT ; genvar i; wire [31:1] carry; generate for (i=31;i>-1;i=i-1) begin: width case(i) 31: full_add FA7 (A[i],B[i],carry[i],S[i],COUT); 0: full_add FA0 (A[i],B[i],CIN,S[i],carry[i+1]); default: full_add FA (A[i],B[i],carry[i],S[i],carry[i+1]); endcase end endgenerate endmodule |
Se puede observar los elementos esenciales de esta construcción:
- La variable en base a la cual trabajará la construcción de replicado (ver linea 6). Se tiene que definir a través de la palabra reservada «genvar»
- La cabecera y final de dicha construcción mediante «generate» y «endgenerate»
- el uso interno de la variable especificada en contrucciones iterativas de tipo «for» o en estructuras condicionales de tipo «if» y «case»
Nada impide que esta construcción pueda replicar cualquier otra estructura concurrente: always, assign, primitivas, initial.
Tanto es así que podemos realizar su uso para el replicado por ejemplo de aserciones concurrentes.
Veamos en el siguiente ejemplo como replicamos las ecuaciones básicas de suma y acarreo de un full-adder (por tanto replicamos construcciones «assign») para generar un sumador de 8 bits
