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 del bloque |
| Señales específicas | always @(a or b) | Cuando cambia a o b |
| Disparo por flanco (secuencial) | always @(posedge clk) | En el flanco ascendente del reloj |
| Varios flancos | always @(posedge clk or posedge reset) | En el flanco del reloj o en el flanco de reset |
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 cambia a o b
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 cambia a o b
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 deja de coincidir con el hardware sintetizado.
Opción 3: Disparo por flanco (posedge)
always @(posedge clk) begin
q <= d; // Se ejecuta en el flanco ascendente del reloj
endUsa posedge para el flanco ascendente y negedge para el flanco descendente.
Opción 4: Varios 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 desactualizada en la simulación (diferencia entre sim/synth) |
always @(posedge clk or reset) | Falta posedge para reset |
always @(clk) | Se debería usar posedge clk para los flip-flops |
Desafío
Qué hacer:
- Añade la lista de sensibilidad correcta para que este flip-flop funcione. 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