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 sensitivity list es un conjunto de signals o eventos que activan el bloque always. Cuando cualquier señal en la list changes, el bloque executes.
Sintaxis:
always @(sensitivity_list) begin
// El código se ejecuta cuando cambian las señales de la lista
endTipos de Sensitivity List
| Tipo | Sintaxis | When Block Executes |
|---|---|---|
| Todos los signals (Combinational) | always @(*) | When cualquier señal interna changes |
| signals específicos | always @(a or b) | When a o b changes |
| Trigger por Edge (sequential) | always @(posedge clk) | En el rising edge del clock |
| Múltiples edges | always @(posedge clk or posedge reset) | En el clock edge o reset edge |
Opción 1: Todas las Signals (*)
El más seguro 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 signals 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 output no se actualiza en la simulación when esa señal changes — por lo que la simulación ya no coincide con el hardware sintetizado.
Opción 3: Flanco de disparo (posedge)
always @(posedge clk) begin
q <= d; // Se ejecuta en el flanco ascendente del reloj
endUsa posedge para flanco de subida, negedge para flanco de bajada.
Opción 4: Bordes múltiples
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endRuns en el edge de clock o edge de reset.
Errores comunes
| Error | Por qué es incorrecto |
|---|---|
always @(a or b or c) pero usa d | Falta d → la salida se desactualiza en la simulación (desajuste entre simulación y síntesis) |
always @(posedge clk or reset) | Falta posedge para el reset |
always @(clk) | Debería usar posedge clk para flip-flops |
Desafío
Qué hacer:
- Agrega la sensitivity list correcta para que este flip-flop funcione. El bloque debe ejecutarse en el rising edge 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 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