Primero, tenga en cuenta que no todos los diseños de Verilog son sintetizables. Por lo general, solo se puede usar un subconjunto muy específico de construcciones en un diseño que se realizará en hardware.
Una restricción importante que aparece es que cada regvariable solo puede asignarse como máximo en una alwaysdeclaración. En otras palabras, regs tienen afinidad con los alwaysbloques.
alwaysGeneralmente se pueden usar los siguientes tipos de bloques.
always @(*) begin
// combinational
end
always @(posedge clk) begin
// sequential
end
En el primer caso, *indica que el bloque debe ejecutarse siempre que cambie cualquier señal utilizada en el bloque o, de manera equivalente, que el bloque debe ejecutarse continuamente. Por lo tanto, los regs que tienen afinidad con los alwaysbloques combinacionales se implementan como señales calculadas a partir de otras señales que utilizan lógica combinacional, es decir, compuertas.
Los registros que tienen afinidad con los alwaysbloques de este último tipo, por otro lado, son salidas de flip-flops D que están sincronizados en el borde ascendente de clk(borde descendente si negedgese usa). Las entradas a los flip-flops, nuevamente, se calculan con lógica combinacional de otras señales.
Considere el siguiente ejemplo, un tanto artificial.
reg out, out_n;
always @(*) begin
out_n = !out;
end
always @(posedge clk) begin
out <= !out;
end
Aquí, out_nestá asociado con el primer alwaysbloque, outcon el segundo. out_nse implementará con una sola puerta NOT que conducirá out_ny se manejará desde out(tenga en cuenta que es una lógica puramente combinacional). Por otro lado, outserá impulsado por un flip-flop registrado desde clk. La entrada al flip-flop será calculada nuevamente por una puerta NOT desde out(que es impulsada por el flip-flop mencionado anteriormente). Los sintetizadores de optimización combinarán las dos compuertas NOT y usarán una compuerta NOT y un flip-flop.
Dependiendo del hardware que tenga disponible, se pueden usar otros tipos de construcciones. Por ejemplo, si los flip-flops tienen reinicios asincrónicos, la siguiente construcción también es sintetizable.
always @(posedge clk or posedge rst) begin
if (rst)
// reset
else
// sequential
end
block of codesea ...