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

Технические принципы и инженерная реализация AURIX TC3xx LBIST (встроенное логическое самотестирование)

Автор: Джонни Лю

Заголовок: Генеральный директор компании Dowway Vehicle

Дата: 24 июня 2026 г.

Категория: Автомобильная электроника / Функциональная безопасность / Встроенное программное обеспечение

Краткий раздел часто задаваемых вопросов

Что означает LBIST на AURIX TC3xx? Это аппаратная самодиагностика, которая проверяет цифровые логические элементы микроконтроллера. Она использует внутренние цепочки сканирования, запускает псевдослучайные тестовые шаблоны и создает уникальную сигнатуру для подтверждения отсутствия скрытых структурных дефектов в оборудовании.

Почему запуск LBIST вызывает «теплый сброс»? Тест сканирования искажает и дезорганизует состояние цифровых цепей. Для сброса этих некорректных состояний и загрузки системы в чистом, предсказуемом состоянии необходима «тепловая перезагрузка».

Где найти золотой сертификат для теста? Это статическое, предварительно вычисленное 32-битное значение. Сигнатуру для конкретного количества и частоты шаблонов можно найти в приложении «Блок управления системой (SCU)» руководства пользователя Infineon AURIX TC3xx.

Почему это руководство важно (Угол ISO 26262)

В конструкциях автомобилей, критически важных с точки зрения безопасности (от ASIL-B до ASIL-D), необходимо выявлять случайные аппаратные неисправности. Особенно опасны скрытые неисправности. Это неисправности, которые остаются незамеченными во время обычной езды, но могут привести к нарушению правил безопасности при возникновении второй неисправности.

Встроенная функция самотестирования логики (LBIST) — это ключевой механизм обеспечения безопасности оборудования.SM:MCU:LBIST) на AURIX TC3xx. Он нацелен на метрику скрытых ошибок (LFM). Поскольку он проверяет цифровые логические элементы ядра, успешный запуск LBIST позволяет нам проверить ЦП, шину и контроллеры безопасности при загрузке. Это устраняет необходимость в медленных и сложных программных проверках логики на более поздних этапах.

Быстрое сравнение тестов для самотестирования стартапов

Чтобы ваша разработка оставалась чистой, не путайте LBIST с другими встроенными тестами на этой платформе:

Механизм испытанийЧто именно проверяетсяПричины перезагрузки?Когда это запускатьОсновная цель
ЛБИСТВнутренняя цифровая логикаДа (Теплая перезагрузка)Ранняя загрузка (холодный PORST / пробуждение в режиме ожидания)Обнаруживает структурные неисправности затвора для LFM.
МБИСТSRAM и флэш-памятьНет (Настраиваемый)Запуск или среда выполненияОбнаруживает сбои в работе ячеек памяти и адресных линий.
МОНБИСТМониторы напряжения PMSНетРанняя загрузкаПроверяет пути резервного копирования монитора напряжения.
FwCheckКонфигурации ключевых регистровНетПосле сброса / Во время выполненияРегистр проверок и следы встроенного программного обеспечения

Как TC3xx LBIST работает в аппаратном обеспечении

Цепочки сканирования и сжатие сигнатур

LBIST основан на структурном сканирующем тестировании. В процессе производства разработчики микросхем соединяют внутренние триггеры вместе, образуя последовательные регистры, называемые сканирующими цепочками.

+---------------------------------------------------------------------------------+
|                                 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)    |   |
|   +-------------------+                     +-------------------------------+   |
+---------------------------------------------------------------------------------+

Аппаратное обеспечение проходит чистый, автоматизированный цикл:

  1. Генерация шаблонов: Линейный регистр сдвига с обратной связью (LFSR) создает псевдослучайные тестовые шаблоны на основе начального значения ( Семя).
  2. Перемещение внутрь: Контроллер переносит эти шаблоны во внутренние цепочки сканирования.
  3. Этап захвата: Система использует один или несколько функциональных тактовых генераторов. Логические элементы обрабатывают сигналы, а триггеры захватывают выходной сигнал.
  4. Сдвиг наружу и сжатие: Захваченные данные поступают в многовходовой регистр подписи (MISR), который сжимает длинный поток битов в один. 32-битная подпись.
  5. Оценка: Программное обеспечение сравнивает эту сигнатуру с эталонным значением, чтобы подтвердить исправность оборудования.

Что не охватывает LBIST

Учитывайте следующие аппаратные ограничения:

  • Аналоговые модули: Он не тестирует аналоговые блоки PMS, EVR или ADC.
  • Состав SRAM: Проверка памяти выполняется программой MBIST. Поскольку LBIST шифрует аппаратные данные, она повреждает некоторые регистры блока тестирования памяти (MTU). Ваше программное обеспечение должно создавать резервные копии и восстанавливать значения этих регистров.

Знания о аппаратных регистрах

Настройка теста включает в себя запись в регистры блока управления системой (БИС). Эти записи защищены Safety Endinit (SEINIT) чтобы предотвратить случайное исполнение.

  • LBISTCTRL0 (Управление 0): Содержит избыточные биты запуска (ЛБИСТРЕК и LBISTREQRED), бит сброса контроллера (ЛБИСТРЫ), и флаг завершения (ЛБИСТДОНЕ).
  • LBISTCTRL1 (Контрольный образец 1): Устанавливает делитель частоты тестового тактового сигнала (ЧАСТО), логическая структурная схема (ТЕЛО), изменение ограничений скорости для управления текущими скачками (РАЗДЕЛЕНИЕ), и начальное значение LFSR (СЕМЯ).
  • LBISTCTRL2 (Контроль 2): Задает количество тестовых шаблонов для выполнения (ДЛИНА).
  • LBISTCTRL3 (Контроль 3): Содержит окончательную 32-битную тестовую подпись (ПОДПИСЬ).
  • РССТАТ (Сброс статуса): Отслеживает, как завершилось тестирование, посредством ЛБТЕРМ (тест завершился в обычном режиме) и ЛБПОРСТ (тест не был прерван перезагрузкой при включении питания) флаги.

Граница «Теплой перезагрузки»

Аппаратное обеспечение всегда принудительно выполняет «тепловую перезагрузку» системы после завершения теста. Это преднамеренное конструктивное решение.

Поскольку при сканировании через микросхему пропускаются случайные значения, внутренние состояния логических элементов становятся недействительными. Функция «Теплый сброс» очищает все регистры и запускает микроконтроллер из чистого состояния.

Хотя SRAM сохраняет свои данные при «теплой перезагрузке», эта перезагрузка повреждает части MTU. Программное обеспечение должно тщательно обрабатывать этот переход.

Разработка конечного автомата с перекрестным сбросом

Поскольку тест запускает «теплую перезагрузку», вам необходимо разделить драйвер программного обеспечения на две части: Фаза запуска предварительной перезагрузки и Этап анализа после сброса.

                    +--------------------+
                    |     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. Настройка постоянного хранилища

Для передачи информации о состоянии при «теплой перезагрузке» необходим небольшой блок памяти, который не очищается во время перезагрузки. В AURIX TC3xx мы используем выделенный сегмент памяти. DLMU SRAM настроено на сохранение питания в режиме ожидания.

Вот как можно настроить этот блок памяти в языке 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. Процесс разработки программного обеспечения и этапы его выполнения.

Этап А: Предварительный триггер сброса

  1. Причина сброса настроек: Читать РССТАТ. Запускайте тест только в том случае, если сброс был выполнен. Холодный ПОРТС или Режим ожидания Пробуждение. Для сбросов, инициированных программным обеспечением, этот шаг можно пропустить.
  2. Ознакомьтесь с текущим состоянием: Читать g_LbistContext.state. При холодном запуске инициализируйте это значение. LBIST_STATE_START.
  3. Резервное копирование регистров MTU: Сохраните все критически важные состояния регистров MTU в оперативной памяти для сохранения, чтобы вы могли восстановить их после перезагрузки.
  4. Настройка оборудования: Отключить прерывания. Разблокировать защиту Safety Endinit.UnlockSEINIT()Запишите параметры начального значения, частоты и количества шаблонов в файл. LBISTCTRL1 и LBISTCTRL2.
  5. Проверка намерения записи: Вычислите контрольную сумму (CRC) конфигурации и запишите её. g_LbistContext.callerIntentCheck. Это предотвращает случайное срабатывание теста из-за серьезных программных ошибок.
  6. Установить состояние на ВЫПОЛНЕНИЕ: Писать LBIST_STATE_RUN к g_LbistContext.state.
  7. Избыточный триггер: Писать 1 к обоим LBISTCTRL0.LBISTREQ и LBISTCTRL0.LBISTREQRED в том же тактовом цикле.
  8. Блокировка ЦП: Войдите в бесконечный цикл ассемблера (while(1);) и дождитесь завершения аппаратной перезагрузки.

Этап B: Анализ после сброса настроек

  1. Запись при загрузке: Микроконтроллер загружается. Программное обеспечение считывает данные. РССТАТ и обнаруживает функцию “Теплый сброс”.
  2. Проверить штат: Программа читает g_LbistContext.state и обнаруживает, что он установлен на LBIST_STATE_RUN.
  3. Подтверждение намерения: Рассчитайте CRC и сравните его с g_LbistContext.callerIntentCheck. Если они не совпадают, отметьте ошибку повреждения данных и пропустите тест, чтобы избежать циклической перезагрузки.
  4. Отметьте флаги: Подтвердите это RSTSTAT.LBTERM == 1, RSTSTAT.LBPORST == 0, и LBISTCTRL0.LBISTDONE == 1.
  5. Подтвердите подпись: Прочитайте подпись от LBISTCTRL3.SIGNATURE и сравните его с золотым знаменателем.
    • Если совпадает: Установить состояние на LBIST_STATE_PASS. Перезагрузите контроллер LBIST через ЛБИСТРЫ. Сбросить флаги холодной перезагрузки в РССТАТ Чтобы предотвратить повторный запуск теста при последующих перезагрузках, восстановите регистры MTU и запустите приложение.
    • Если не совпадает: Запустить логику повторной попытки.

3. Внедрение продукта C

Вот чистая, готовая к использованию в производственной среде реализация драйвера:

#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;
        }
    }
}

Практические инженерные ловушки

1. Настройки питания SRAM в режиме ожидания

В режиме ожидания система может отключить питание оперативной памяти. В этом случае переменная состояния сбрасывается, и микроконтроллер будет запускать новую проверку при каждом пробуждении, что приведет к бесконечному циклу загрузки.

  • Как исправить: Настройте СТБЫРАМЕЛЬ и ПРОКОНРАМ.ЛМУИНСЕЛЬ регистры в SCU, чтобы принудительно поддерживать питание секторов LMU RAM в режиме ожидания. Также убедитесь, что ваш скрипт компоновщика добавляет g_LbistContext переменная в .noinit этот раздел, чтобы ваш код инициализации на языке C при запуске не очищал его при пробуждении.

2. Ловушки раннего доступа к данным

Чтение неинициализированных секторов SRAM сразу после холодного запуска может вызвать Ловушка доступа к данным На некоторых этапах разработки микросхем AURIX это происходит из-за неисправных битов ECC или битов четности.

  • Как исправить: Обработчик прерываний должен проверить, произошло ли исключение в области памяти сохранения во время ранней загрузки. Если да, то записать фиктивные данные для инициализации битов ECC, очистить состояние прерывания и возобновить выполнение вместо остановки процессора.

3. Координация загрузки многоядерных процессоров

AURIX — это многоядерная платформа. Если все ядра загружаются одновременно во время циклов «теплой перезагрузки», это может помешать работе конечного автомата.

  • Как исправить: Настройте последовательность загрузки по принципу «ведущий-ведомый». Во время запуска удерживайте все вспомогательные ядра в состоянии остановки (используя заголовки режима загрузки или элементы управления SCU). Разрешите только… Ядро 0 Для запуска конечного автомата LBIST. После того, как ядро ​​0 проверит тест и запишет результат, оно запустит тест. LBIST_STATE_PASS, это позволит освободить и другие ядра для загрузки.

Лабораторные испытания и валидация

Для проверки вашей конструкции перед экспертами по функциональной безопасности можно использовать следующие методы тестирования:

  • Проверьте Золотой Путь: Используйте отладчик, чтобы убедиться, что конечный автомат успешно завершил переход: $$\text{START} \longrightarrow \text{Теплый сброс} \longrightarrow \text{RUN} \longrightarrow \text{PASS}$$
  • Ошибки внедрения данных: Остановите процессор во время НАЧИНАТЬ фаза, вручную повредить g_LbistContext.callerIntentCheck Контрольная сумма CRC в памяти и возобновление работы. Убедитесь, что программное обеспечение перехватывает ошибку и переходит в безопасное состояние без запуска теста.
  • Сбои при внедрении подписи: Немного измените конфигурацию теста (например, измените количество шаблонов в LBISTCTRL2Это изменит подпись. Убедитесь, что:
    1. Код пытается запустить тест до 3 раз.
    2. Микроконтроллер переходит в безопасное состояние на третьей неудачной попытке.

Подведение итогов

Запуск LBIST на AURIX TC3xx — это высоконадежный способ удовлетворить диагностические требования ISO 26262 для цифровой логики. Используя внутренние цепочки сканирования и псевдослучайные шаблоны, оборудование точно определяет структурные сбои в логических элементах.

Для безопасного выполнения этой операции необходимо создать чистый, кросс-сбрасываемый конечный автомат. Сосредоточьтесь на защите конфигураций оперативной памяти, управлении ловушками при запуске, координации работы ядер ЦП и установке надежного лимита повторных попыток. Это гарантирует безопасность и надежность самотестирования.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Need a Quote or Have Questions?

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