Lista de sensibilidad
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 48 de 90.
La lista de sensibilidad indica al bloque always cuándo ejecutarse. Se escribe entre paréntesis después del símbolo @.
La lista de sensibilidad es un conjunto de señales o eventos que activan el bloque always. Cuando cambia cualquier señal de la lista, se ejecuta el bloque.
Sintaxis:
always @(sensitivity_list) begin
// El código se ejecuta cuando cambian las señales de la lista
endTipos de lista de sensibilidad
| Tipo | Sintaxis | Cuándo se ejecuta el bloque |
|---|---|---|
| Todas las señales (combinacional) | always @(*) | Cuando cambia cualquier señal interna |
| Señales específicas | always @(a or b) | Cuando cambia a o b |
| Activación por flanco (secuencial) | always @(posedge clk) | En el flanco ascendente del reloj |
| Múltiples flancos | always @(posedge clk or posedge reset) | En el flanco del reloj o en el flanco de restablecimiento |
Opción 1: Todas las señales (*)
La opción más segura y común para la lógica combinacional.
always @(*) begin
out = a & b; // Se ejecuta cuando a o b cambian
endEl * incluye automáticamente todas las señales leídas en el bloque.
Opción 2: Señales específicas
always @(a or b) begin
out = a & b; // Se ejecuta cuando a o b cambian
endSi olvidas una señal, la salida no se actualiza en la simulación cuando esa señal cambia, por lo que la simulación ya no coincide con el hardware sintetizado.
Opción 3: Activación por flanco (posedge)
always @(posedge clk) begin
q <= d; // Se ejecuta en el flanco de subida del reloj
endUsa posedge para el flanco rising, negedge para el flanco descendente.
Opción 4: Múltiples flancos
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endSe ejecuta en el flanco del reloj o en el flanco de reinicio.
Errores comunes
| Error | Por qué está mal |
|---|---|
always @(a or b or c) pero usa d | Falta d → la salida queda obsoleta en la simulación (desajuste entre simulación y síntesis) |
always @(posedge clk or reset) | Falta posedge para el reinicio |
always @(clk) | Se debe usar posedge clk para los flip-flops |
Desafío
Qué hacer:
- Añade la lista de sensibilidad correcta para hacer funcionar este flip-flop. El bloque debe ejecutarse en el flanco ascendente de
clk.
Pruébalo tú mismo
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
Qué es VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un módulo9Bloques procedurales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteRepaso: Always vs InitialPractica por tu cuenta: Compilador de Verilog online