Usaré verilog para los ejemplos en esta publicación porque no he escrito ningún VHDL en años, los principios son los mismos para ambos idiomas.
Primero, consideremos el caso no sincronizado
always @(en,d) begin
if (en) begin
q = d;
end
end
Este es un bloque siempre sin reloj (el equivalente a un proceso VHDL). Crea un cierre transparente.
El problema con los pestillos transparentes es que son sensibles a los fallos y razas.
Considere lo que sucede si en cambia a cero al mismo tiempo d cambia de valor. Tienes una condición de carrera. Si el cambio a en llega primero, q obtiene el valor antiguo de d. Si el cambio a d llega primero, q obtiene el nuevo valor de d.
Ahora, considere lo que sucede si la lógica que se crea es defectuosa. Un fallo en en puede hacer que el nuevo valor de d se propague involuntariamente a q.
Ahora veamos el caso cronometrado.
always @(posedge clk) begin
if (en) begin
q <= d;
end
end
Ahora ya no tenemos un pestillo transparente. Obtenemos un registro cronometrado. No importa en qué orden y en qué lleguen, siempre y cuando lleguen a tiempo para el próximo borde del reloj. No importa si hay fallas después de un borde del reloj siempre que se hayan establecido antes del siguiente borde del reloj.