Presiona ESC para cerrar

Reparación de ASIC DIY: Diagnóstico de Chips y Placa Hash

Si tu S19 Pro dejó de escupir sus 110 TH/s y en la interfaz web en vez de los 76 chips te marca 0 o la cadena rota, tocó mandar la hashboard al banco de pruebas. En el 90% de los casos nos topamos con desprendimiento de die por sobrecalentamiento, un regulador LDO en corto o alguna microfisura en el PCB.

Arquitectura de la hashboard del S19 Pro: cómo se distribuyen los dominios y las señales

La tarjeta de minado del Antminer S19 Pro lleva 76 chips BM1398, repartidos en 19 dominios de alimentación en serie (4 chips por dominio). El voltaje total del bus (unos 12.5–15V según el firmware) se divide entre ellos. Cada dominio recibe en promedio 0.7–0.8V, mientras que el chip en sí opera con un VCORE de unos 0.32–0.42V.

Las señales van en cascada desde el chip 1 (el más cercano al conector de la control board) hasta el 76:

  • CLK (25 MHz): La señal de reloj. Si se corta en el chip 30, todos los demás en adelante mueren.
  • CO (Command Output): Línea de entrada para los comandos que vienen de la control board.
  • RI (Return Input): Línea de retorno de respuesta a la control board. Corre en sentido inverso, del chip 76 al 1.
  • RST (Reset): Línea de reinicio. Un nivel bajo en esta línea manda el chip a un reset profundo.
  • BO (Busy Output): Señal de línea ocupada.

Diagnóstico paso a paso: del log del minero a las mediciones

Abrimos el Kernel Log desde la interfaz web o el firmware (VNish, HiveOS). Checamos en qué punto exacto se nos cae la cadena.

Qué buscar en el log:

  • Chain 1: found 0 asics — No hay respuesta por la línea RI para nada. Revisa el chip 1, su alimentación LDO o el conector del cincho/flats de datos.
  • Chain 2: only 42 asics found — La señal se «ató» en el chip 42 o 43. Hay que ir directo a esa zona.
  • Read temp sensor failed — Se voló el sensor TMP75. En la S19 Pro vienen repartidos en varios dominios. Si el sensor muere, la placa no va a arrancar por pura protección.

Medición de puntos de prueba (Test Points)

Alimenta la placa con una fuente de servicio o un tester de hashboards (sin meterle alto voltaje al bus principal) y pon tu multímetro en modo de prueba de diodos (punta roja a tierra GND).

[Chip 42] ---> (CO / CLK / RST) ---> [Chip 43]
[Chip 42] <--- (RI / BO)        <--- [Chip 43]

Con respecto a tierra, la caída de tensión/resistencia de las líneas de señal en los test points debe ser muy similar en toda la placa:

  • CLK, CO, RI, RST: Rango de 450–600 Ohms (o mV en caída de diodo).

Si en el chip 43 la línea CLK te pita en corto (0 Ohms) o te marca circuito abierto (OL) — ese chip va para afuera.

Alimentación LDO

Cada dominio necesita voltajes auxiliares para la lógica interna del chip. De esto se encargan unos reguladores LDO pequeñitos:

  • VDD 1.8V: Alimenta los buffers de señal.
  • VDD 0.8V: Alimenta el núcleo lógico interno.

Si el chip recibe sus 1.8V pero le faltan los 0.8V, no va a poder retransmitir el CLK al siguiente chip, y la placa te va a cortar la cadena justo ahí.

Por qué necesitas osciloscopio y cómo sacarle jugo

El multímetro solo te da un promedio en DC. Pero queda ciego cuando los voltajes parecen normales y la señal viene atascada de ruido o con la amplitud por los suelos. El multímetro te puede mentir sabroso, pero el osciloscopio te canta la forma de onda de una.

Ocupas un equipo con al menos 100 MHz de ancho de banda y una sonda con atenuador 10X.

Medición de CLK (Reloj de 25 MHz):

Tocamos con la punta en el test point del CLK. Debes ver una senoidal limpia o una cuadrada con amplitud de unos 1.8V. Si en lugar de eso ves una sierra aplastada de 0.4V, el buffer interno del chip se flameó y no logra empujar la señal.

Chequeo de ráfagas CO/RI:

Al arrancar, la placa avienta unos paquetes cortos de pulsos. En la pantalla se ven como ráfagas rápidas (Burst). Si al pin de entrada del chip 43 le llega el paquete pero de la salida no brinca nada, el chip está frito o se quedó trabado con RST en cero.

Rizado en la línea de alimentación (Ripple):

Cambia la entrada del osciloscopio a modo AC (acoplamiento AC) y mide los capacitores justo debajo del chip. Un rizado mayor a 30–40 mV te avisa que los cerámicos de alrededor ya se degradaron por puro estrés térmico.

Guía de referencia de Test Points (Antminer S19 Pro / BM1398)

LíneaVoltaje nominal (DC)Señal en osciloscopioResistencia a GNDSíntoma si se corta
CLK0.8–0.9VSenoidal 25 MHz, 1.8Vpp500–600 OhmsLa cadena se cae en el chip dañado
CO0–0.2VRáfagas de 1.8V al escanear500–600 OhmsSe detiene el escaneo de ASICs
RI1.7–1.8VRáfagas de pulsos en la respuesta500–600 OhmsMarca 0 ASICs o mocha la cola de la placa
RST1.8VEstado lógico alto500–650 OhmsLos chips no salen de modo reset
VDD 1.8V1.8VLínea limpia (Ruido AC < 20 mV)1–3 kOhmsMueren los buffers de I/O
VDD 0.8V0.8VLínea limpia (Ruido AC < 15 mV)100–300 OhmsNo trabaja el core del chip

Manos a la obra con el cautín: desmontaje y rebalanceo del BM1398

El PCB de aluminio de la S19 Pro actúa como un disipador gigante. Querer bajar un chip tirándole aire caliente solo por arriba es la receta perfecta para achicharrar el sustrato y volarte las pistas.

Herramientas indispensables:

  • Precalentadora / Plancha (perfil térmico a 160–180°C).
  • Estación de retrabajo por aire caliente (boquilla a la medida del chip).
  • Flux BGA no-clean de buena calidad (NC-559, Martin o RMA-223).
  • Esferas con plomo de 0.35 mm o soldadura en pasta Sn63/Pb37 (el plomo funde a 183°C, lo cual te salva la vida comparado con el libre de plomo de fábrica).

Pasos a seguir:

  1. Colocamos la placa en la precalentadora, subiendo suavemente hasta los 150–160°C. Si te alocas y aceleras el proceso, la placa se te va a pandear por la dilatación térmica.
  2. Aplicamos un poco de flux por debajo del chip.
  3. Le damos calor por arriba con la pistola (temperatura de salida a 340–360°C, flujo de aire medio). Hay que hacer movimientos circulares constantes.
  4. Tocamos el chip con la pinza: en cuanto sientas que ya "flota" sobre las esferas, lo levantamos con cuidado completamente recto.
  5. Limpiamos los pads del PCB con malla desoldante y colofonia, y retiramos los residuos con alcohol isopropílico.
  6. Reballeamos el chip nuevo usando la plantilla/stencil con la pasta con plomo o las esferas.
  7. Alineamos el chip guiándonos con la muesca (la marca en la encapsulación debe coincidir con la serigrafía del PCB).
  8. Calentamos abajo en la plancha apoyando con aire por arriba hasta que asiente. El chip solito se centra gracias a la tensión superficial de la soldadura líquida.

Script en Python para parsear logs y diagnosticar en chinga

Para no andar leyendo los logs a pie, aquí tienes un script funcional. Le avientas el archivo de log del minero, te saca la cadena con falla y te dice directo en qué chip poner las puntas del multímetro.

#!/usr/bin/env python3
import re
import sys

EXPECTED_ASICS = 76

def parse_asic_log(filepath):
    chain_pattern = re.compile(
        r"Chain\[(\d+)\]:\s*found\s*(\d+)\s*asics",
        re.IGNORECASE
    )
    sensor_pattern = re.compile(
        r"sensor[\[\s]*(\d+)[\]\s]*.*temp.*error",
        re.IGNORECASE
    )
    
    issues_found = False
    problem_chains = []
    reported_sensors = set()

    print(f"[*] Analizando log: {filepath}\n")

    try:
        with open(filepath, "r", errors="ignore") as f:
            for num, line in enumerate(f, 1):
                # Validación de conteo de ASICs por cadena
                c_match = chain_pattern.search(line)
                if c_match:
                    chain_id = int(c_match.group(1))
                    found = int(c_match.group(2))

                    if found &lt; EXPECTED_ASICS:
                        issues_found = True
                        problem_chains.append(
                            (chain_id, found, EXPECTED_ASICS)
                        )
                        print(
                            f"[!] Cadena {chain_id}: se encontraron "
                            f"{found} chips de {EXPECTED_ASICS}."
                        )
                        if found == 0:
                            print(
                                "    -&gt; Primer chip de la cadena no detectado."
                            )
                            print(
                                "    -&gt; Revisar alimentación de la placa, RI, "
                                "RST, BOOT y reloj (CLK)."
                            )
                        else:
                            print(
                                f"    -&gt; Checar salida (CLK/CO) "
                                f"del chip #{found}"
                            )
                            print(
                                f"    -&gt; Checar entrada (RI) y "
                                f"alimentación LDO del chip #{found + 1}"
                            )
                        print()

                # Validación de fallas en sensores de temperatura
                s_match = sensor_pattern.search(line)
                if s_match:
                    sensor_id = int(s_match.group(1))
                    if sensor_id not in reported_sensors:
                        issues_found = True
                        reported_sensors.add(sensor_id)
                        print(
                            f"[!] Error en sensor de temperatura "
                            f"#{sensor_id} (línea {num})."
                        )
                        print(
                            "    -&gt; Revisar TMP75, voltaje del "
                            "sensor y líneas I2C."
                        )
                        print()

        # Resumen general de resultados
        print("=" * 60)
        print("RESUMEN DE DIAGNÓSTICO")
        print("=" * 60)

        if not issues_found:
            print("[+] No se detectaron problemas conocidos.")
            return False

        if problem_chains:
            print("\nCadenas con falla:")
            for chain_id, found, expected in problem_chains:
                print(
                    f"  - Chain {chain_id}: "
                    f"{found}/{expected} ASIC"
                )

        if reported_sensors:
            print("\nErrores en sensores de temperatura:")
            for sensor_id in sorted(reported_sensors):
                print(f"  - Sensor {sensor_id}")

        print()
        return True

    except FileNotFoundError:
        print(f"[-] Archivo no encontrado: {filepath}")
        return True
    except Exception as e:
        print(f"[-] Error al procesar el archivo: {e}")
        return True

if __name__ == "__main__":
    if len(sys.argv) &lt; 2:
        print(
            f"Uso: {sys.argv[0]} &lt;ruta_al_log.txt&gt; "
            f"[expected_asics]"
        )
        sys.exit(1)

    if len(sys.argv) &gt;= 3:
        try:
            EXPECTED_ASICS = int(sys.argv[2])
        except ValueError:
            print("[-] expected_asics debe ser un valor numérico.")
            sys.exit(1)

    has_issues = parse_asic_log(sys.argv[1])
    sys.exit(1 if has_issues else 0)

Ejemplos de ejecución:

python diag.py kernel.log

Para placas con distinta cantidad de chips:

  • python diag.py kernel.log 63
  • python diag.py kernel.log 72
  • python diag.py kernel.log 80

Checklist de verificación final antes de montar en el chasis

  • Resistencia en el bus VCORE: La resistencia respecto a GND jamás debe marcar cero (corto directo).
  • Comprobación de LDO sin carga completa: Metemos voltaje con la fuente de taller y medimos que estén presentes los 1.8V y 0.8V en el chip que reemplazamos.
  • Verificación de señal: Medimos con el osciloscopio que los 25 MHz atraviesen sin problemas el chip soldado hacia el resto de la cadena.
  • Prueba bajo estrés térmico: Armamos el minero de vuelta, conectamos sus fanes originales y dejamos corriendo la placa con firmware de fábrica por 2 o 3 horas, monitoreando que no genere errores HW en esa línea.
Resumir esta publicación de blog con:

FAQ

Configura el multímetro en modo prueba de diodo y mide la resistencia de los puntos de prueba CLK, CO, RI y RST con respecto a tierra (GND), buscando valores normales entre 450 y 600 ohmios. Revisa el Kernel Log para ubicar el último ASIC detectado: la falla suele estar en la salida de ese chip o en la entrada del chip siguiente que interrumpe la señal de retorno RI.

El circuito requiere la línea VDD de 1.8V para alimentar los buffers de entrada y salida de señal, y la línea VDD de 0.8V para alimentar el núcleo de lógica computacional. Si alguno de estos voltajes LDO falla, el chip entra en estado inactivo y bloquea la transmisión de la señal de reloj CLK, haciendo que la tarjeta de control desconecte toda la cadena de la placa hash.

Conecta un osciloscopio con un ancho de banda mínimo de 100 MHz y una sonda 10X al punto de prueba CLK para verificar la presencia de una onda sinusoidal estable de 25 MHz con una amplitud de aproximadamente 1.8Vpp. Cambia al modo de acoplamiento AC en los condensadores VCORE para detectar rizos de tensión (ripple) que superen el límite permitido de 30 a 40 mV.
Sying Yu

I am a blockchain developer specializing in building secure, scalable, and innovative decentralized solutions. My expertise covers smart contracts, payment systems, and integrating crypto with fiat to optimize financial workflows. I thrive on creating modern, efficient tools for the evolving digital economy....

Escribe una opinión

Tu correo electrónico no será publicado. Los campos obligatorios están marcados *