Pressione ESC para fechar

Como Consertar ASIC: Diagnóstico de Chips e Troca de Placa

Se o seu S19 Pro parou de entregar os 110 TH/s de praxe e na interface web aparece 0 em vez dos 76 chips — ou aquela corrente partida —, é hora de mandar essa hashboard pra bancada de diagnóstico. Em 90% dos casos, o B.O. é BGA com solda fria por superaquecimento, LDO curto-circuitado ou microtrinca no PCB.

Arquitetura da Hashboard do S19 Pro: Como funcionam os domínios e sinais

A placa do Antminer S19 Pro vem equipada com 76 chips BM1398, divididos em 19 domínios de alimentação em série (4 chips por domínio). A tensão total do barramento (algo em torno de 12.5 a 15V, dependendo da firmware) é distribuída entre eles. Cada domínio recebe, em média, de 0.7 a 0.8V, enquanto o chip em si roda com um VCORE entre 0.32 e 0.42V.

Os sinais trafegam em cascata, do chip 1 (perto do conector da control board) até o 76º:

  • CLK (25 MHz): Sinal de clock. Se o clock morrer no 30º chip, todo mundo depois dele apaga.
  • CO (Command Output): Linha de entrada dos comandos enviados pela placa de controle.
  • RI (Return Input): Linha de resposta para a control board. Caminha no sentido inverso: do 76º chip de volta ao 1º.
  • RST (Reset): Linha de reset. Nível lógico baixo aqui coloca o ASIC em reset forçado.
  • BO (Busy Output): Sinal de indicação de barramento ocupado.

Diagnóstico Passo a Passo: Do log do minerador ao multímetro

Abra o Kernel Log pela interface web da máquina ou pela firmware custom (VNish, HiveOS). Vamos identificar exatamente onde a cadeia está caindo.

O que procurar nos logs:

  • Chain 1: found 0 asics — Sem resposta na linha RI. Vá direto no 1º chip, na alimentação do LDO dele ou no cabo de sinal.
  • Chain 2: only 42 asics found — Sinal travou no chip 42 ou 43. Pode ir em cima dessa região.
  • Read temp sensor failed — Sensor TMP75 foi pro espaço. No S19 Pro, eles ficam espalhados por vários domínios. Se o sensor morrer, a placa não arma por proteção.

Aferição dos Test Points

Alimente a placa com uma fonte de bancada ou testador de hashboard (sem injetar alta corrente no barramento) e coloque o multímetro no modo de teste de diodo (ponta vermelha no GND).

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

Em relação ao terra, a queda de tensão nas linhas de sinal nos test points deve ser consistente ao longo de toda a placa:

  • CLK, CO, RI, RST: Na casa dos 450 a 600 mV (ou ohms, dependendo da escala).

Se no chip 43 o ponto CLK bipar em 0 ohms (curto) ou der escala infinita (aberto) — pode sacar o chip fora.

Alimentação dos LDOs

Cada domínio precisa de tensões auxiliares para a lógica interna dos chips. Quem gera essas tensões são os micro-reguladores LDO:

  • VDD 1.8V: Alimenta os barramentos de I/O de sinal.
  • VDD 0.8V: Alimenta o núcleo lógico (core).

Se o chip tem 1.8V mas falta os 0.8V — ele não vai repassar o CLK pra frente, e a placa corta a cadeia ali.

Por que usar o Osciloscópio e como medir

O multímetro só mostra a média em tensão contínua (DC). Ele é cego quando a tensão está presente, mas o sinal está atenuado, ruidoso ou com rampa deformada. O multímetro te engana bonito; o osciloscópio entrega a forma de onda na hora.

Você vai precisar de um equipamento de pelo menos 100 MHz e ponta de prova em 10X.

Medindo o CLK (Frequência de Clock de 25 MHz):

Injete a ponta no test point do CLK. A leitura correta é uma onda senoidal ou quadrada limpa com amplitude próxima de 1.8Vpp. Se em vez disso você vir um dente de serra esmagado de 0.4V, o buffer interno do chip queimou e não consegue empurrar o sinal pra frente.

Checando rajadas de dados (CO/RI):

No boot, a placa envia pacotes rápidos de dados. No osciloscópio, isso aparece como pequenos pulsos (Bursts). Se o pacote entra no chip 43 mas não sai do outro lado — o chip morreu ou está com o RST travado em zero.

Ripple no barramento de alimentação:

Mude a entrada do osciloscópio para modo AC (acoplamento AC) e meça nos capacitores embaixo do chip. Pulsações acima de 30–40 mV indicam que os capacitores cerâmicos ao redor deram fuga por estresse térmico.

Tabela de Referência de Test Points (Antminer S19 Pro / BM1398)

LinhaTensão DC NormalSinal no OsciloscópioQueda de Tensão / Impede em GNDSintoma de Falha
CLK0.8–0.9VOnda senoidal 25 MHz, 1.8Vpp500–600 mVCadeia interrompida no chip defeituoso
CO0–0.2VPulsos de 1.8V durante a varredura500–600 mVComunicação com os chips trava
RI1.7–1.8VPulsos de resposta de 1.8V500–600 mVRetorna 0 ASICs ou corta o final da placa
RST1.8VNível lógico alto constante500–650 mVChips não saem do estado de reset
VDD 1.8V1.8VLinha limpa (ruído AC < 20 mV)1–3 kΩBuffers de I/O param de funcionar
VDD 0.8V0.8VLinha limpa (ruído AC < 15 mV)100–300 ΩCore do ASIC não inicializa

Prática de Soldagem BGA: Sacando e reballando o BM1398

As placas em substrato de alumínio do S19 Pro dissipam calor absurdamente rápido. Tentar tirar o chip só no soprador de ar quente por cima é receita certa pra empenar o PCB, queimar a estrutura do componente e arrancar pad da placa.

Ferramental necessário:

  • Pré-aquecedor / Mesa de pré-aquecimento (perfil térmico em 160–180°C).
  • Estação de retrabalho a ar quente (bocal sob medida para o chip).
  • Fluxo BGA no-clean de boa qualidade (NC-559, Martin ou RMA-223).
  • Esferas de solda com chumbo (Sn63/Pb37) 0.35 mm ou pasta de solda leaded (o chumbo funde a 183°C, facilitando a vida em comparação com o lead-free original).

Passo a passo no procedimento:

  1. Posicione a placa no pré-aquecedor e suba a temperatura gradativamente até 150–160°C. Apressar essa etapa vai criar uma dilatação desigual entre o fenolite/composite e o substrato de alumínio, empenando a placa.
  2. Aplique uma pequena quantidade de fluxo sob o ASIC.
  3. Entre com o soprador por cima (ajustado em ~340–360°C, vazão de ar média), fazendo movimentos circulares e constantes.
  4. Toque de leve no chip com a pinça: assim que ele "flutuar" nas esferas de solda, remova-o com cuidado, levantando na vertical.
  5. Faça a limpeza dos pads no PCB utilizando malha dessoldadora de cobre com breu e limpe com álcool isopropílico.
  6. Faça o reballing do chip novo utilizando o stencil apropriado e a pasta/esferas com chumbo.
  7. Alinhe o chip no PCB observando o pino 1 (a marcação no corpo do chip deve bater perfeitamente com a serigrafia da placa).
  8. Aaqueça novamente na mesa com auxílio do ar quente por cima até a fusão. O próprio efeito de tensão superficial da solda líquida vai alinhar o chip no lugar.

Script em Python para Parsear Logs e Acelerar o Diagnóstico

Para não ter que caçar erro linha por linha na raça, montei este script. É só rodar o log do minerador nele que ele te entrega o ponto de falha e indica em qual chip meter o 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"[*] Analisando log: {filepath}\n")
    try:
        with open(filepath, "r", errors="ignore") as f:
            for num, line in enumerate(f, 1):
                # Checa a contagem de ASICs na cadeia
                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"[!] Cadeia {chain_id}: encontrados "
                            f"{found} chips de {EXPECTED_ASICS}."
                        )
                        if found == 0:
                            print(
                                "    -&gt; Primeiro chip da cadeia nao foi detectado."
                            )
                            print(
                                "    -&gt; Checar alimentacao da placa, RI, "
                                "RST, BOOT e clock."
                            )
                        else:
                            print(
                                f"    -&gt; Testar saida (CLK/CO) "
                                f"do chip #{found}"
                            )
                            print(
                                f"    -&gt; Testar entrada (RI) e "
                                f"LDO do chip #{found + 1}"
                            )
                        print()
                # Checa falhas nos 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"[!] Erro no sensor de temperatura "
                            f"#{sensor_id} (linha {num})."
                        )
                        print(
                            "    -&gt; Checar TMP75, alimentacao "
                            "do sensor e barramento I2C."
                        )
                        print()
        # Resumo final
        print("=" * 60)
        print("RESUMO DO DIAGNOSTICO")
        print("=" * 60)
        if not issues_found:
            print("[+] Nenhum problema detectado pelos padrões.")
            return False
        if problem_chains:
            print("\nCadeias com falha:")
            for chain_id, found, expected in problem_chains:
                print(
                    f"  - Chain {chain_id}: "
                    f"{found}/{expected} ASICs"
                )
        if reported_sensors:
            print("\nErros de sensor de temperatura:")
            for sensor_id in sorted(reported_sensors):
                print(f"  - Sensor {sensor_id}")
        print()
        return True
    except FileNotFoundError:
        print(f"[-] Arquivo nao encontrado: {filepath}")
        return True
    except Exception as e:
        print(f"[-] Erro ao processar arquivo: {e}")
        return True
if __name__ == "__main__":
    if len(sys.argv) &lt; 2:
        print(
            f"Uso: {sys.argv[0]} &lt;caminho_do_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 deve ser um numero inteiro.")
            sys.exit(1)
    has_issues = parse_asic_log(sys.argv[1])
    sys.exit(1 if has_issues else 0)

Exemplos de execução:

python diag.py kernel.log

Para placas com contagem diferente de chips:

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

Checklist Final antes de Fechar no Gabinete

  • Resistência do barramento VCORE: A impedância em relação ao GND não pode estar zerada (curto-circuito).
  • Validação dos LDOs sem carga total: Alimente com a fonte de bancada e confirme a presença dos 1.8V e 0.8V no chip substituído.
  • Inspecionar o sinal: Verifique com o osciloscópio se o clock de 25 MHz passa redondo pelo chip soldado e segue a cadeia.
  • Burn-in sob estresse: Monte a placa de volta no gabinete com os coolers originais e rode por 2 a 3 horas na firmware oficial acompanhando a taxa de HW erros na cadeia afetada.
Resumir este post do blog com:

FAQ

Ajuste o multímetro no modo de diodo e meça a resistência dos pontos de teste CLK, CO, RI e RST em relação ao terra (GND), buscando valores normais entre 450 e 600 ohms. Verifique o Kernel Log para localizar o último ASIC detectado — a falha geralmente está na saída desse chip ou na entrada do chip seguinte que bloqueia o sinal RI.

O circuito exige a linha VDD 1.8V para alimentar os buffers de entrada e saída de sinal e a linha VDD 0.8V para alimentar o núcleo de lógica computacional. Se qualquer uma dessas tensões LDO falhar, o chip entra em estado inativo e interrompe a transmissão do sinal de clock CLK, fazendo a controladora derrubar toda a cadeia da placa hash.

Conecte um osciloscópio com largura de banda mínima de 100 MHz e ponta de prova 10X ao ponto de teste CLK para verificar a presença de uma onda senoidal estável de 25 MHz com amplitude de aproximadamente 1.8Vpp. Alterne para o modo de acoplamento AC nos capacitores VCORE para identificar oscilações de tensão (ripple) que excedam o limite 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....

Deixe seu parecer

O seu endereço de e-mail não será publicado. Campos obrigatórios estão marcados *