Close-up photograph of an Infineon AURIX TC3xx microcontroller chip mounted on an automotive PCB.

Princípios técnicos e implementação de engenharia do AURIX TC3xx LBIST (Logic Built-In Self-Test)

Autor: Johnny Liu

Título: CEO da Dowway Vehicle

Data: 24 de junho de 2026

Categoria: Eletrônica Automotiva / Segurança Funcional / Firmware Embarcado

Perguntas frequentes rápidas

O que é LBIST no AURIX TC3xx? É um autoteste de hardware que verifica as portas lógicas digitais dos microcontroladores. Ele utiliza cadeias de varredura internas, executa padrões de teste pseudoaleatórios e cria uma assinatura única para verificar se o hardware contém falhas estruturais latentes.

Por que executar o LBIST aciona uma reinicialização a quente? O teste de varredura sobrescreve e embaralha o estado dos circuitos digitais. Uma reinicialização a quente é necessária para limpar esses estados inválidos e inicializar o sistema novamente em um estado limpo e previsível.

Onde você encontra a assinatura de ouro para o teste? Trata-se de um valor estático de 32 bits pré-calculado. Você pode encontrar a assinatura para a sua contagem e frequência de padrões específicas no apêndice da Unidade de Controle do Sistema (SCU) do Manual do Usuário do Infineon AURIX TC3xx.

Por que este guia é importante (a perspectiva da ISO 26262)

Em projetos automotivos críticos para a segurança (ASIL-B a ASIL-D), devemos detectar falhas de hardware aleatórias. Falhas latentes são especialmente perigosas. São falhas que permanecem ocultas durante a condução normal, mas podem levar a violações de segurança se uma segunda falha ocorrer.

O autoteste lógico integrado (LBIST) é um mecanismo de segurança de hardware fundamental (SM:MCU:LBIST) no AURIX TC3xx. Ele tem como alvo a Métrica de Falha Latente (LFM). Como verifica as portas lógicas do núcleo digital, a execução bem-sucedida do LBIST permite verificar a CPU, o barramento e os controladores de segurança na inicialização. Isso elimina a necessidade de verificações lógicas lentas e complexas baseadas em software posteriormente.

Comparação rápida de autotestes para startups

Para manter seu design organizado, não confunda LBIST com outros testes integrados nesta plataforma:

Mecanismo de testeO que testaCausa a reinicialização?Quando executarObjetivo principal
LBISTLógica Digital InternaSim (Reinicialização a quente)Inicialização antecipada (POST a frio / Despertar em modo de espera)Detecta falhas estruturais em portas LFM.
MBISTMemórias SRAM e FlashNão (Configurável)Inicialização ou Tempo de ExecuçãoDetecta falhas em células de memória e linhas de endereço.
MONBISTMonitores de tensão PMSNãoInicialização antecipadaVerifica os caminhos de backup do monitor de tensão.
Verificação de FwConfigurações de registro de chaveNãoPós-reinicialização / Tempo de execuçãoVerifica registros e pegadas de firmware

Como funciona o TC3xx LBIST em hardware

Cadeias de Varredura e Compressão de Assinatura

O LBIST depende de testes de varredura estrutural. Durante a fabricação, os projetistas de chips interligam os flip-flops internos para formar registradores seriais chamados de cadeias de varredura.

+---------------------------------------------------------------------------------+
|                                 AURIX TC3xx SCU                                 |
|                                                                                 |
|   +-------------------+    Test Patterns    +-------------------------------+   |
|   |   LFSR Engine     |====================>|       Internal Scan Chains    |   |
|   | (Seed & Patterns) |                     | (Registers linked in series)  |   |
|   +-------------------+                     +-------------------------------+   |
|                                                             ||                  |
|                                                             || Capture & Shift  |
|                                                             \/                  |
|   +-------------------+     Final Signature   +-------------------------------+   |
|   |   LBISTCTRL3      |<====================|         MISR Compressor       |   |
|   |  (SIGNATURE)      |                     | (Compresses output stream)    |   |
|   +-------------------+                     +-------------------------------+   |
+---------------------------------------------------------------------------------+

O hardware segue um ciclo limpo e automatizado:

  1. Geração de padrões: Um Registrador de Deslocamento com Feedback Linear (LFSR) cria padrões de teste pseudoaleatórios com base em um valor inicial (o Semente).
  2. Mudança para dentro: O controlador transfere esses padrões para as cadeias de varredura internas.
  3. Fase de Captura: O sistema executa um ou mais relógios funcionais. As portas lógicas processam os padrões e os flip-flops capturam a saída.
  4. Deslocamento e compressão: Os dados capturados são transferidos para um Registro de Assinatura de Entrada Múltipla (MISR), que comprime o longo fluxo de bits em um único bit. assinatura de 32 bits.
  5. Avaliando: O software compara essa assinatura com o valor de referência para confirmar se o hardware está em boas condições.

O que a LBIST não cobre

Leve em consideração estas limitações de hardware:

  • Módulos analógicos: Não testa os blocos analógicos PMS, EVR ou ADC.
  • Conteúdo da SRAM: O teste de memória é feito pelo MBIST. Como o LBIST embaralha o hardware, ele corrompe certos registradores da Unidade de Teste de Memória (MTU). Seu software deve fazer backup e restaurar esses valores de registradores.

Registros de hardware que você precisa conhecer.

Configurar o teste significa escrever em registradores na Unidade de Controle do Sistema (SCU). Essas escritas são protegidas por Endinit de Segurança (SEINIT) para evitar execuções acidentais.

  • LBISTCTRL0 (Controle 0): Contém os bits de disparo redundantes (LBISTREQ e LBISTREQUÍVEL), o bit de reinicialização do controlador (LBISTRES), e o indicador de conclusão (LBISTDONE).
  • LBISTCTRL1 (Controle 1): Define o divisor de frequência do clock de teste (FREQU), o layout estrutural lógico (CORPO), alterando os limites de velocidade para gerenciar os picos de corrente (DIVIDIDO), e a semente LFSR (SEMENTE).
  • LBISTCTRL2 (Controle 2): Define o número de padrões de teste a serem executados (COMPRIMENTO).
  • LBISTCTRL3 (Controle 3): Contém a assinatura de teste final de 32 bits (ASSINATURA).
  • RSTSTAT (Redefinir status): Monitora como o teste terminou através do LBTERM (o teste terminou normalmente) e LBPORST (o teste não foi interrompido por uma reinicialização de energia) sinalizadores.

O Limite de Reinicialização Aconchegante

O hardware sempre força uma reinicialização a quente do sistema quando o teste termina. Esta é uma escolha de projeto de hardware deliberada.

Como o teste de varredura força a passagem de valores aleatórios pelo chip, os estados internos das portas lógicas tornam-se inválidos. O reset a quente limpa todos os registradores e inicia o microcontrolador a partir de um estado limpo.

Embora a SRAM retenha seus dados durante uma reinicialização a quente, essa reinicialização corrompe partes da MTU. O software deve lidar com essa transição com cuidado.

Projetando uma máquina de estados de reinicialização cruzada

Como o teste aciona uma reinicialização a quente, você deve dividir seu driver de software em duas partes: a Fase de disparo de pré-reinicialização e o Fase de Análise Pós-Reinicialização.

                    +--------------------+
                    |     Power On       |
                    +--------------------+
                              |
                              v
                  +------------------------+
                  |  Read RSTSTAT Register |
                  +------------------------+
                              |
               Is Cold PORST or Standby Wakeup?
               /                              \
             YES                               NO
             /                                  \
            v                                    v
  +------------------+                 +--------------------+
  | Check Persistent |                 | Skip LBIST & Boot  |
  |   Context State  |                 +--------------------+
  +------------------+
    /     |      \
 START   RUN    PASS/FAIL (Terminal States)
  /       |        \_______________________
 v        v                                \
[Trigger] [Analyze Signature]               v
          /       \               +--------------------+
       Valid     Invalid          | Continue app boot  |
        /           \             +--------------------+
       v             v
  Set PASS       Retries < 3?
  Clear Flags     /       \
  App Boot      YES        NO
                 /          \
                v            v
           Increment      Set FAIL
         Retry Counter   Enter Safe State
          Re-Trigger

1. Configurando o armazenamento persistente

Para transmitir informações de status durante uma reinicialização a quente, você precisa de um pequeno bloco de memória que não seja apagado durante a reinicialização. No AURIX TC3xx, usamos um segmento dedicado da memória. DLMU SRAM Configurado para retenção de energia em modo de espera.

Eis como você pode configurar esse bloco de memória em C:

typedef enum {
    LBIST_STATE_START = 0xA5A5A5A5U,
    LBIST_STATE_RUN   = 0x5A5A5A5AU,
    LBIST_STATE_PASS  = 0x3C3C3C3CU,
    LBIST_STATE_FAIL  = 0xC3C3C3C3U
} LbistState_t;

typedef struct {
    LbistState_t state;
    uint32_t     retryCounter;
    uint32_t     callerIntentCheck; // Prevents wild triggers via a CRC
    uint32_t     lastFailureReason;
} LbistPersistedContext_t;

/* Map this struct to a non-initialized retention RAM area */
__attribute__((section(".bss.backup_ram_noinit"))) 
volatile LbistPersistedContext_t g_LbistContext;

2. Fluxo e etapas do software

Fase A: Gatilho de Pré-Reinicialização

  1. Verifique a causa da reinicialização: Ler RSTSTAT. Execute o teste somente se a reinicialização tiver sido um Porção fria ou um Despertar em modo de espera. Ignore esta opção para reinicializações acionadas por software.
  2. Leia o estado atual: Ler g_LbistContext.estado. Na inicialização a frio, inicialize isto para LBIST_STATE_START.
  3. Faça backup dos registros MTU: Salve quaisquer estados críticos de registro MTU na RAM de retenção para que você possa restaurá-los após a reinicialização.
  4. Configurar hardware: Desative as interrupções. Desbloqueie a proteção de segurança Endinit (DesbloquearSEINIT()Escreva as configurações de semente, frequência e contagem de padrões em LBISTCTRL1 e LBISTCTRL2.
  5. Verificação de intenção de escrita: Calcule o CRC da configuração e escreva-o em g_LbistContext.callerIntentCheck. Isso impede que bugs de software graves acionem o teste acidentalmente.
  6. Defina o estado como RUN: Escrever LBIST_STATE_RUN para g_LbistContext.estado.
  7. Gatilho redundante: Escrever 1 para ambos LBISTCTRL0.LBISTREQ e LBISTCTRL0.LBISTREQRED no mesmo ciclo de clock.
  8. Bloquear CPU: Entrar em um loop de montagem infinito (enquanto(1);) e aguarde a reinicialização do hardware.

Fase B: Análise Pós-Reinicialização

  1. Entrada de inicialização: O microcontrolador inicializa. O software lê RSTSTAT e detecta a reinicialização a quente.
  2. Verificar estado: O software lê g_LbistContext.estado e descobre que está configurado para LBIST_STATE_RUN.
  3. Verificar intenção: Calcule o CRC e compare-o com g_LbistContext.callerIntentCheck. Caso não correspondam, sinalize um erro de corrupção de dados e ignore o teste para evitar loops de inicialização.
  4. Verifique as bandeiras: Confirme que RSTSTAT.LBTERM == 1, RSTSTAT.LBPORST == 0, e LBISTCTRL0.LBISTDONE == 1.
  5. Verificar assinatura: Leia a assinatura de LBISTCTRL3.ASSINATURA e compare-o com o valor áureo.
    • Se houver correspondência: Defina o estado para LBIST_STATE_PASS. Reinicie o controlador LBIST através de LBISTRES. Limpe os sinalizadores de reinicialização a frio em RSTSTAT Para evitar que o teste seja executado novamente em reinicializações a quente subsequentes, restaure os registros MTU e inicialize o aplicativo.
    • Se não houver correspondência: Execute a lógica de repetição.

3. Implementação em C de Produção

Aqui está uma implementação limpa e pronta para produção do driver:

#include "tc3xx_scu_registers.h"

#define GOLDEN_LBIST_SIGNATURE    0x2E4A9F18U  // Golden signature from User Manual
#define MAX_LBIST_RETRIES         3U

void Handle_Fatal_Safety_Fault(uint32_t reason) {
    // Notify the SMU and transition the ECU to a safe state
    while (1);
}

void Execute_LBIST_Evaluation_Sequence(void) {
    uint32_t rststat = SCU_RSTSTAT.U;
    
    // Check if the reset source is Cold PORST or Standby Exit
    if ((rststat & SCU_RSTSTAT_COLD_RESET_MASK) != 0U) {
        
        // Safe initialization check for retention RAM
        if (g_LbistContext.state == 0xFFFFFFFFU) { 
            g_LbistContext.state = LBIST_STATE_START;
            g_LbistContext.retryCounter = 0U;
        }

        switch (g_LbistContext.state) {
            case LBIST_STATE_START: {
                Backup_MTU_Configuration();

                // Unlock Safety Endinit and write configurations
                Unlock_Safety_Endinit();
                SCU_LBISTCTRL1.U = (0x1U << 16) | (0x0U << 8) | 0x5A5A5A5AU; // SPLITSH, BODY, SEED
                SCU_LBISTCTRL2.U = 0x000003E8U;                            // LENGTH (1000 Patterns)
                Lock_Safety_Endinit();

                // Protect against wild software jumps
                g_LbistContext.callerIntentCheck = Calculate_CRC32((uint8_t*)&g_LbistContext, sizeof(g_LbistContext) - 8);
                g_LbistContext.state = LBIST_STATE_RUN;

                // Redundant trigger write
                Unlock_Safety_Endinit();
                SCU_LBISTCTRL0.U |= (1U << SCU_LBISTCTRL0_LBISTREQ_POS) | (1U << SCU_LBISTCTRL0_LBISTREQRED_POS);
                Lock_Safety_Endinit();

                // Wait for hardware reset
                while (1) {
                    __nop();
                }
                break;
            }

            case LBIST_STATE_RUN: {
                // Verify caller intent CRC
                uint32_t calc_crc = Calculate_CRC32((uint8_t*)&g_LbistContext, sizeof(g_LbistContext) - 8);
                if (calc_crc != g_LbistContext.callerIntentCheck) {
                    g_LbistContext.state = LBIST_STATE_FAIL;
                    Handle_Fatal_Safety_Fault(0xFEED0001U); 
                    return;
                }

                // Verify hardware flags
                uint32_t test_done = (SCU_LBISTCTRL0.U & (1U << SCU_LBISTCTRL0_LBISTDONE_POS));
                uint32_t normal_term = (rststat & (1U << SCU_RSTSTAT_LBTERM_POS));
                uint32_t power_interrupted = (rststat & (1U << SCU_RSTSTAT_LBPORST_POS));

                if ((test_done != 0U) && (normal_term != 0U) && (power_interrupted == 0U)) {
                    uint32_t signature = SCU_LBISTCTRL3.U;

                    if (signature == GOLDEN_LBIST_SIGNATURE) {
                        g_LbistContext.state = LBIST_STATE_PASS;
                        
                        // Reset the controller and clear reset flags
                        Unlock_Safety_Endinit();
                        SCU_LBISTCTRL0.U |= (1U << SCU_LBISTCTRL0_LBISTRES_POS); 
                        SCU_RSTCON.U     |= SCU_RSTCON_CLEAR_COLD_FLAGS_MASK;    
                        Lock_Safety_Endinit();

                        Restore_MTU_Configuration();
                        return; // Continue to main boot
                    }
                }

                // Run retry strategy
                g_LbistContext.retryCounter++;
                if (g_LbistContext.retryCounter >= MAX_LBIST_RETRIES) {
                    g_LbistContext.state = LBIST_STATE_FAIL;
                    Handle_Fatal_Safety_Fault(0xFEED0002U); // Hardware error
                } else {
                    Unlock_Safety_Endinit();
                    SCU_LBISTCTRL0.U |= (1U << SCU_LBISTCTRL0_LBISTRES_POS);
                    Lock_Safety_Endinit();
                    
                    g_LbistContext.state = LBIST_STATE_START;
                    Execute_LBIST_Evaluation_Sequence(); // Re-run
                }
                break;
            }

            case LBIST_STATE_PASS:
                // Passed; continue standard boot
                break;

            case LBIST_STATE_FAIL:
            default:
                Handle_Fatal_Safety_Fault(0xFEED0003U);
                break;
        }
    }
}

Armadilhas práticas da engenharia

1. Configurações de energia SRAM em modo de espera

Durante o modo de espera, o sistema pode cortar a alimentação da sua memória RAM de retenção. Se isso acontecer, a variável de estado será reiniciada e o microcontrolador executará um novo teste a cada ativação, causando um loop de inicialização infinito.

  • Como corrigir: Configure o STBYRAMSEL e PROCONRAM.LMUINSEL registros no SCU para forçar os setores de RAM da LMU a permanecerem energizados durante o modo de espera. Além disso, certifique-se de que seu script de vinculação inclua o g_LbistContext variável em um .noinit seção para que seu código de inicialização em C não a limpe ao despertar.

2. Armadilhas do Acesso Antecipado a Dados

A leitura de setores SRAM não inicializados logo após uma inicialização a frio pode causar um problema. Armadilha de acesso a dados em algumas etapas de fabricação de silício AURIX devido a erros de ECC ou bits de paridade.

  • Como corrigir: Seu manipulador de exceção deve verificar se a exceção ocorreu no espaço de memória de retenção durante a inicialização. Se sim, escreva dados fictícios para inicializar os bits ECC, limpe o status da exceção e retome a execução em vez de interromper a CPU.

3. Coordenação de inicialização multi-core

AURIX é uma plataforma multi-core. Se todos os núcleos inicializarem ao mesmo tempo durante os ciclos de reinicialização a quente, eles podem interferir na sua máquina de estados.

  • Como corrigir: Configure uma sequência de inicialização mestre-escravo. Mantenha todos os núcleos auxiliares em estado de repouso (usando os cabeçalhos do modo de inicialização ou os controles da SCU) durante a inicialização. Permita apenas Núcleo 0 para executar a máquina de estados LBIST. Assim que o Core 0 verificar o teste e gravar LBIST_STATE_PASS, ele pode liberar os outros núcleos para inicializar.

Testes e Validação em Laboratório

Para verificar a segurança funcional do seu projeto, você pode usar os seguintes métodos de teste:

  • Verifique o Caminho Dourado: Use o seu depurador para confirmar se a máquina de estados concluiu a transição com sucesso: $$\text{START} \longrightarrow \text{Reinicialização a Quente} \longrightarrow \text{RUN} \longrightarrow \text{PASS}$$
  • Erros de Injeção de Dados: Interrompa a CPU durante o COMEÇAR fase, corromper manualmente o g_LbistContext.callerIntentCheck CRC na memória e retomar. Confirme se o software detecta o erro e transita para o estado seguro sem executar o teste.
  • Falhas na Injeção de Assinatura: Altere ligeiramente a configuração do seu teste (como, por exemplo, alterar a contagem de padrões em LBISTCTRL2Isso alterará a assinatura. Verifique se:
    1. O código tenta executar o teste até 3 vezes.
    2. O MCU entra em estado de segurança na 3ª tentativa falhada.

Concluindo

Executar o LBIST no AURIX TC3xx é uma maneira altamente confiável de atender aos requisitos de diagnóstico da norma ISO 26262 para lógica digital. Utilizando cadeias de varredura internas e padrões pseudoaleatórios, o hardware identifica com precisão falhas estruturais nas portas lógicas.

Para executar isso com segurança, você deve construir uma máquina de estados limpa e com reinicialização cruzada. Concentre-se em proteger suas configurações de RAM de retenção, gerenciar interrupções de inicialização, coordenar seus núcleos de CPU e definir um limite sólido de tentativas. Isso garante que seu autoteste seja seguro e confiável.

Deixe um comentário

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

Need a Quote or Have Questions?

Please fill out the form below, our engineers will contact you within 24 hours.