Lista de sensibilidad
Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 48 de 90.
La lista de sensibilidad le 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 cualquier señal en la lista cambia, el bloque se ejecuta.
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 |
| Disparo por flanco (secuencial) | always @(posedge clk) | En el flanco de subida del reloj |
| Múltiples flancos | always @(posedge clk or posedge reset) | En el flanco del reloj o el flanco de reinicio |
Opción 1: Todas las señales (*)
La más segura y común para 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, obtienes un latch (memoria no deseada).
Opción 3: Disparo por flanco (posedge)
always @(posedge clk) begin
q <= d; // Se ejecuta en el flanco de subida del reloj
endUtilice posedge para el flanco de subida, negedge para el flanco de bajada.
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 de reloj o en el flanco de reset.
Errores Comunes
| Error | Por qué está mal |
|---|---|
always @(a or b or c) pero usa d | Falta d → latch |
always @(posedge clk or reset) | Falta posedge para reset |
always @(clk) | Debería usar posedge clk para flip-flops |
Desafío
Qué hacer:
- Agrega la lista de sensibilidad correcta para que este flip-flop funcione. El bloque debe ejecutarse en el flanco de subida de
clk.
Hoja de referencia
La lista de sensibilidad sigue a @ y define cuándo se ejecuta un bloque always:
always @(sensitivity_list) begin
// se ejecuta cuando cambian las señales listadas
end| Tipo | Sintaxis | Se activa cuando |
|---|---|---|
| Todas las señales | always @(*) | Cualquier señal de lectura cambia |
| Señales específicas | always @(a or b) | a o b cambian |
| Flanco de subida | always @(posedge clk) | Flanco de subida de clk |
| Múltiples flancos | always @(posedge clk or posedge reset) | Cualquiera de los flancos se activa |
Use @(*) para lógica combinacional; use posedge/negedge para lógica secuencial:
// Combinacional
always @(*) begin
out = a & b;
end
// Secuencial (flip-flop con reset asíncrono)
always @(posedge clk or posedge reset) begin
if (reset) q <= 0;
else q <= d;
endErrores comunes: omitir una señal en una lista específica causa un latch; escribir always @(clk) en lugar de always @(posedge clk) para flip-flops; omitir posedge antes de reset en una lista de múltiples flancos.
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 Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - 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 condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo9Bloques procedimentales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteResumen - Always vs Initial