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 reg
variable solo puede asignarse como máximo en una always
declaración. En otras palabras, reg
s tienen afinidad con los always
bloques.
always
Generalmente 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 reg
s que tienen afinidad con los always
bloques 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 always
bloques 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 negedge
se 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_n
está asociado con el primer always
bloque, out
con el segundo. out_n
se implementará con una sola puerta NOT que conducirá out_n
y se manejará desde out
(tenga en cuenta que es una lógica puramente combinacional). Por otro lado, out
será 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 code
sea ...