Appuyez sur ESC pour fermer

Réparation ASIC DIY : Diagnostiquer les puces et la Hashboard

Si votre S19 Pro ne crache plus ses 110 TH/s et que l'interface web vous affiche un gros 0 au lieu des 76 puces (ou une chaîne coupée net), direction le banc de diagnostic. Dans 90 % des cas, le coupable est classique : un die décollé par surchauffe, un régulateur LDO en court-circuit ou une microfissure sur le PCB.

Architecture de la hashboard S19 Pro : comprendre les domaines et le bus de signaux

La hashboard d'un Antminer S19 Pro embarque 76 puces BM1398, réparties en 19 domaines d'alimentation en série (soit 4 puces par domaine). La tension globale du bus (entre 12.5V et 15V selon le firmware) se divise entre ces domaines. Chaque domaine récupère ainsi environ 0.7V à 0.8V, tandis que le cœur de chaque ASIC tourne à une tension VCORE située entre 0.32V et 0.42V.

Les signaux transitent en série de puce en puce, de la 1ère (côté connecteur de la control board) jusqu'à la 76ème :

  • CLK (25 MHz) : L'horloge principale. Si le signal saute sur la 30ème puce, toutes celles qui suivent tombent dans le noir.
  • CO (Command Output) : Le bus d'instructions envoyé par la control board.
  • RI (Return Input) : La ligne de retour des données vers la control board. Elle remonte à contre-courant, de la 76ème vers la 1ère puce.
  • RST (Reset) : La ligne de remise à zéro. Un passage à l'état bas force le reset hard de la puce.
  • BO (Busy Output) : Le signal d'occupation de la ligne.

Diagnostic pas à pas : décoder les logs avant de sortir le multimètre

Première étape : ouvrir le Kernel Log via l'interface web ou votre firmware custom (VNish, HiveOS). On cherche l'endroit exact où la chaîne décroche.

Les symptômes typiques dans les logs :

  • Chain 1: found 0 asics — Aucun retour sur la ligne RI. Direction la puce N°1, son alim LDO ou la nappe de signal pour vérifier la continuité.
  • Chain 2: only 42 asics found — Le signal bloque net au niveau de la puce 42 ou 43. Allez inspecter directement cette zone.
  • Read temp sensor failed — Capteur TMP75 flingué. Sur le S19 Pro, ils sont répartis sur plusieurs domaines. Un capteur HS déclenche la sécurité et verrouille le boot de la carte.

Prise de mesures sur les points de test (Test Points)

Alimentez la carte via une alim de labo ou un testeur dédié (sans balancer la puissance sur le bus) et basculez votre multimètre en mode diode (pointe rouge à la masse GND).

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

Par rapport à la masse, la chute de tension sur les lignes de signal doit rester cohérente d'un point de test à l'autre sur toute la carte :

  • CLK, CO, RI, RST : On cherche une valeur comprise entre 450 et 600 mV (ou ohms selon le mode).

Si au niveau de la puce 43 le point CLK bipe en court-circuit à 0 Ω ou affiche une boucle ouverte (infini), la puce est bonne pour la poubelle.

Alimentations LDO

Chaque domaine a besoin de tensions secondaires pour faire tourner la logique interne des ASIC. Ce sont de petits régulateurs LDO qui s'en chargent :

  • VDD 1.8V : Alimente la logique d'E/S des signaux.
  • VDD 0.8V : Alimente le cœur logique (core) de la puce.

Si une puce reçoit bien son 1.8V mais que le 0.8V manque à l'appel, elle sera incapable de répéter le signal CLK vers sa voisine : la chaîne sera coupée net à cet endroit.

Pourquoi l'oscilloscope est obligatoire (et comment l'exploiter)

Un multimètre ne donne qu'une valeur moyenne en continu (DC). C'est parfait pour les tensions, mais totalement aveugle face à un signal bruité, écrasé ou déformé. Le multimètre peut vous afficher une tension propre alors que le signal est détruit ; l'oscilloscope, lui, ne ment pas.

Prévoyez un scope d'au moins 100 MHz de bande passante avec une sonde réglée en 10X.

Test du signal CLK (Horloge à 25 MHz) :

Posez la pointe sur le point de test CLK. Vous devez observer une sinusoïde propre ou un signal carré d'une amplitude d'environ 1.8V pic-à-pic. Si vous obtenez une dent de scie écrasée à 0.4V, le buffer de sortie du chip est grillé et n'a plus la pêche pour piloter la suite.

Analyse des salves CO/RI :

Au démarrage, la carte balance de courtes salves de données. À l'écran, cela se traduit par des paquets d'impulsions très rapides (bursts). Si le paquet arrive bien sur l'entrée de la puce 43 mais que rien ne sort, le chip est mort ou maintenu à zéro par la ligne RST.

Mesure du bruit d'alim (Ripple) :

Basculez l'entrée du scope en couplage AC et mesurez directement aux bornes des condensateurs sous le ventre de la puce. Un ripple supérieur à 30–40 mV indique que la céramique autour du chip a cuit à force de prendre la chaleur.

Abaque des points de test (Antminer S19 Pro / BM1398)

LigneTension DC typiqueSignal à l'oscilloscopeValeur à la masse (GND)Symptôme en cas de coupure
CLK0.8–0.9VSinusoïde 25 MHz, ~1.8Vpp500–600 mVLa chaîne s'arrête net sur la puce HS
CO0–0.2VSalves d'impulsions 1.8V au boot500–600 mVL'énumération des puces stoppe
RI1.7–1.8VSalves de données lors de la réponse500–600 mVAffiche 0 ASIC ou tronque la fin de carte
RST1.8VNiveau logique haut stable500–650 mVLes puces restent bloquées en reset
VDD 1.8V1.8VLigne propre (bruit AC < 20 mV)1–3 kΩI/O buffers HS, transmission KO
VDD 0.8V0.8VLigne propre (bruit AC < 15 mV)100–300 ΩCœur logique de la puce inactif

Changement de puce BM1398 : la méthode propre au fer et à l'air chaud

Le PCB en aluminium du S19 Pro agit comme un dissipateur géant. Attaquer une puce au pistolet à air chaud par le dessus sans préchauffage, c'est le meilleur moyen de cramer le substrate et d'arracher les pastilles.

Le matos indispensable :

  • Preheater / Préchauffeur de PCB (profil thermique entre 160 et 180°C).
  • Station à air chaud (avec buse adaptée à la taille de la puce).
  • Flux BGA no-clean de qualité (NC-559, Martin ou RMA-223).
  • Billes plombées 0.35 mm ou pâte à braser Sn63/Pb37 (fusion à 183°C, bien plus docile que l'alliage sans plomb d'usine).

Procédure pas à pas :

  1. Posez la board sur le préchauffeur et montez progressivement à 150–160°C. Si vous chauffez trop vite, le différentiel de dilatation entre l'époxy et l'aluminium va tordre la carte en banane.
  2. Injectez une goutte de flux sous la puce.
  3. Attaquez par le haut à l'air chaud (environ 340–360°C en sortie de buse, flux d'air moyen) en effectuant des mouvements circulaires.
  4. Pincez délicatement le chip : dès qu'il "flotte" sur ses billes en fusion, le soulever bien verticalement.
  5. Nettoyez les pads sur le PCB à la tresse à dessouder chargée en colophane, puis nettoyez les résidus à l'alcool isopropylique (IPA).
  6. Billez la puce neuve au pochoir avec votre pâte plombée ou vos billes 0.35 mm.
  7. Alignez la puce selon le repère (le détrompeur sur le chip doit coller à la sérigraphie du PCB).
  8. Laissez monter le préchauffeur et donnez le coup de pouce à l'air chaud par le dessus. Sous l'effet de la tension superficielle de l'étain liquide, la puce va se centrer toute seule sur ses empreintes.

Script Python d'analyse de logs pour aller plus vite

Pour éviter d'éplucher des Mo de Kernel Log à la main, voici un petit outil d'analyse automatique. Passez-lui le fichier log du miner : il repère la chaîne qui flanche et pointe directement la puce à tester.

#!/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"[*] Analyse du log : {filepath}\n")
    try:
        with open(filepath, "r", errors="ignore") as f:
            for num, line in enumerate(f, 1):
                # Vérification du nombre d'ASIC dans la chaîne
                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"[!] Chaîne {chain_id} : "
                            f"{found} puces détectées sur {EXPECTED_ASICS}."
                        )
                        if found == 0:
                            print(
                                "    -&gt; Première puce de la chaîne non détectée."
                            )
                            print(
                                "    -&gt; Vérifier l'alim de la board, RI, "
                                "RST, BOOT et le signal horloge."
                            )
                        else:
                            print(
                                f"    -&gt; Inspecter la sortie (CLK/CO) "
                                f"de la puce #{found}"
                            )
                            print(
                                f"    -&gt; Inspecter l'entrée (RI) et "
                                f"l'alim LDO de la puce #{found + 1}"
                            )
                        print()
                # Vérification des capteurs de température
                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"[!] Erreur capteur de température "
                            f"#{sensor_id} (ligne {num})."
                        )
                        print(
                            "    -&gt; Contrôler le TMP75, son alim "
                            "et les lignes I2C."
                        )
                        print()
        # Rapport final
        print("=" * 60)
        print("RÉCAPITULATIF DES ERREURS")
        print("=" * 60)
        if not issues_found:
            print("[+] Aucune anomalie détectée d'après les motifs.")
            return False
        if problem_chains:
            print("\nChaînes défectueuses :")
            for chain_id, found, expected in problem_chains:
                print(
                    f"  - Chain {chain_id}: "
                    f"{found}/{expected} ASIC"
                )
        if reported_sensors:
            print("\nCapteurs de température en erreur :")
            for sensor_id in sorted(reported_sensors):
                print(f"  - Capteur {sensor_id}")
        print()
        return True
    except FileNotFoundError:
        print(f"[-] Fichier introuvable : {filepath}")
        return True
    except Exception as e:
        print(f"[-] Erreur lors du traitement du fichier : {e}")
        return True
if __name__ == "__main__":
    if len(sys.argv) &lt; 2:
        print(
            f"Usage : {sys.argv[0]} &lt;chemin_du_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 doit être un entier.")
            sys.exit(1)
    has_issues = parse_asic_log(sys.argv[1])
    sys.exit(1 if has_issues else 0)

Exemples d'utilisation :

python diag.py kernel.log

Pour une carte avec une densité de puces différente :

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

Checklist de contrôle avant rembobinage dans le chassis

  • Résistance du bus VCORE : Valider l'absence de court-circuit direct (0 Ω) entre le bus d'alimentation et la masse.
  • Valider les LDO à vide : Injecter la tension via l'alim de bench et valider la présence du 1.8V et du 0.8V au niveau de la puce remplacée.
  • Contrôle du signal d'horloge : S'assurer à l'oscilloscope que le 25 MHz traverse proprement le composant neuf et ressort vers l'étage suivant.
  • Banc d'essai en charge : Remonter la carte dans le châssis avec ses ventilateurs d'origine, puis lancer un burn-in de 2 à 3 heures sur le firmware stock pour surveiller le taux d'erreurs HW sur la ligne réparée.
Résumer cet article de blog avec :

FAQ

Utilisez un multimètre en mode test de diode pour mesurer la résistance des points de test CLK, CO, RI et RST par rapport à la masse (GND), en cherchant des valeurs normales situées entre 450 et 600 ohms. Vérifiez le Kernel Log pour repérer le dernier composant détecté : la panne se situe sur la sortie de cette puce ou sur l'entrée de la suivante qui bloque le signal retour RI.

Chaque domaine de puces nécessite une tension VDD de 1.8V pour alimenter l'étage tampon des signaux d'entrée-sortie et une tension VDD de 0.8V pour alimenter le cœur logique du composant. L'absence de l'une de ces tensions entraîne la mise en sécurité de la puce, interrompant la propagation du signal d'horloge CLK sur l'ensemble de la chaîne.

Connectez un oscilloscope d'une bande passante minimale de 100 MHz avec une sonde 10X sur le point de test CLK pour vérifier la présence d'un signal sinusoïdal stable à 25 MHz d'une amplitude de 1.8Vpp. Passez en couplage AC sur les condensateurs VCORE afin de déceler les ondulations résiduelles (ripple) qui ne doivent pas dépasser 30 à 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....

Partager votre avis

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués *