Electrónica Digital · Tema 28

Hazards y glitches

La tabla dice 1, el osciloscopio muestra un pozo: caminos con distinto retardo que se cruzan mal.

01 · Punto de partida

Y = B, pero parpadea

Y = A·B + ~A·B es B (Tema 15): con B=1 la salida debería quedar en 1 siempre. Pero al pasar A de 1 a 0, un AND se apaga antes de que el otro se prenda: pozo de 2 retardos a 0. Tabla perfecta, tiempo traidor.

  • ¿Por qué un camino tarda más?
  • ¿Cuándo el glitch importa?
  • ¿Cómo lo tapa un término redundante?
  • ¿Qué cambia con diseño síncrono?

02 · Tipos

Fijo que se mueve

Hazards estáticos (la salida debería quedar quieta).
TipoDeberíaHace
Static-1Quedar en 1Pozo a 0 (nuestro caso)
Static-0Quedar en 0Pico a 1 (dual)
DinámicoCambiar 1 vezRebota 3+ veces

Causa: la señal llega por dos caminos (directo y negado) con distinto retardo; al reconverger en la OR hay un instante sin nadie en 1.

A cambia → un AND cae →el otro aún no sube →pozo en Y

03 · Cuándo importa

No siempre duele

Duele

Relojes y sets

Glitch en clock/enable/set asíncrono = evento fantasma. Contadores y curso 6 sufren.

No duele

LEDs y lentos

Nanosegundos invisibles a ojo y a lógica muestreada después. Diseño síncrono lo ignora.

Remedio 1: redundancia
Agregar el término consenso B (Y = A·B + ~A·B + B = B): cubre la transición. Consenso del Tema 14 trabajando.
Remedio 2: síncrono
Muestrear con clock después de asentarse (curso 6): el glitch muere solo antes del flanco.

04 · Ejemplo cronometrado

Pozo en t = 2

Retardo 1 por puerta, B = 1, A pasa 1→0 en t = 0: el AND directo cae en t = 1 pero el negado recién sube en t = 2. La OR ve 0+0 y muestra 0 en t = 2, volviendo a 1 en t = 3. El laboratorio lo dibuja.

05 · Glitch en código

Simular retardos

Puertas con retardo 1 paso: el pozo aparece solo.

Python en tu navegador. Cambiá la transición y mirá si hay pozo.

def glitch(transicion=(1, 0), redundante=False):
    A = lambda t: transicion[0] if t < 0 else transicion[1]
    nA = lambda t: 1 - A(t - 1)
    y1 = lambda t: A(t - 1) and 1
    y2 = lambda t: nA(t - 1) and 1
    r = lambda t: 1
    ys = []
    for t in range(0, 5):
        y = (y1(t - 1) or y2(t - 1) or (r(t - 1) if redundante else 0))
        ys.append(int(y))
    print(f"{transicion} redundante={redundante}: Y={ys}")
    return ys


glitch()
glitch(redundante=True)
glitch(transicion=(0, 1))

1→0: [1, 1, 0, 1, 1] (pozo en t=2). Con redundante: todo 1. 0→1: limpio (solape, no pozo).

Ancho del pozo

ys = glitch()
print(f"pozo de {ys.count(0)} paso(s) x retardo de puerta")
print("a 10ns por puerta: ~20ns invisible al ojo, mortal para un clock")

06 · Analogía programador

Race condition

  1. 1
    Glitch = race.

    Dos caminos escriben el resultado a distinto tiempo: ventana donde nadie escribió bien. Igual que threads sin lock.

  2. 2
    Redundancia = idempotencia.

    Término extra que cubre la ventana: como reintento que tapa el hueco.

  3. 3
    Síncrono = barrier.

    Muestrear cuando todos llegaron: barrera que elimina carreras por diseño.

07 · Exploración

Laboratorio: cazar el pozo

Transición de A con B=1, con o sin término redundante: el laboratorio dibuja Y(t) paso a paso.

LABORATORIO 28

Caza-pozos

1→0 · pozo en t=2

Y(t) t=0–41 1 0 1 1
Dibujo▔▔▁▔▔
Ancho pozo1 paso
EstadoGLITCH ⚠

1→0 sin +B: pozo de 1 paso en t=2.

Preguntas para explorar

  1. Probá 0→1 sin +B. ¿Pozo? ¿Por qué un sentido sí y el otro no?
  2. Activá +B con 1→0. ¿Pozo? ¿Qué término lo tapa?
  3. ¿De qué sirve saber el ancho en pasos? (Pista: ns por puerta.)
Ver respuestas sugeridas
  1. No: hay solape (ambos en 1 un rato). La asimetría viene del NOT en un solo camino.
  2. No: +B (consenso) vale 1 durante la transición y tapa el hueco.
  3. Pasos × tp (ns) = ancho real: si es menor que el setup del destino, no importa.

08 · Comprensión

Confusiones frecuentes

«El simulador ideal lo muestra»

Sin retardos no hay glitch: hace falta timing sim (con tp) u osciloscopio. Ideal ≠ real.

«Glitch = bug lógico»

La tabla está bien: es el tiempo el que falla. Corregir la lógica no lo saca.

«Más rápido = sin glitch»

Más rápido = pozo más angosto, pero existe. Se tapa (redundancia) o se ignora (síncrono).

«X en simulación = glitch»

X es desconocido/contención (otro tema): el glitch es 0/1 bien definidos en mal momento.

09 · Práctica guiada

Ejercicios de pozos

Ejercicio 1: static-0

Y = ~(A·B + ~A·B) (NOR del ejemplo). ¿Transición con pico a 1? ¿Redundante dual?

Ver solución razonada

0→1 de A con B=1 (dual del caso del tema): pico a 1 donde debería quedar en 0. Redundante dual: factor B extra, Y = (A+B)·(~A+B)·B. El consenso también tiene dual.

Ejercicio 2: medir un glitch

XOR con A=B=misma señal que cambia: Y debería ser 0 siempre. ¿Qué ves en el scope? ¿Por qué?

Ver solución

Picos en cada flanco: los caminos internos del 86 difieren en retardo (hazard dinámico del XOR). Clásico de laboratorio.

Ejercicio 3: ¿importa?

Glitch de 20 ns en: (a) LED, (b) enable de latch, (c) entrada de clock. ¿En cuáles actuás?

Ver solución

(b) y (c): eventos fantasma. (a) invisible. Actuar donde el glitch es evento.

10 · Síntesis

Ideas para recordar

  • Retardos distintos + reconvergencia = glitch.
  • Static-1 = pozo; static-0 = pico; dinámico = rebotes.
  • Consenso tapa; síncrono ignora.
  • Importa en clocks/enables, no en LEDs.
  • Tabla bien ≠ tiempo bien.

Pozos entendidos. Ahora lo eléctrico fino: en el próximo tema, consumo y buenas prácticas.