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

AURIX TC3xx LBIST(ロジック内蔵自己テスト)の技術原理とエンジニアリング実装

著者: ジョニー・リュー

タイトル: Dowway VehicleのCEO

日付: 2026年6月24日

カテゴリ: 車載エレクトロニクス/機能安全/組み込みファームウェア

よくある質問

AURIX TC3xxにおけるLBISTとは何ですか? これは、マイクロコントローラのデジタル論理ゲートをチェックするハードウェア自己テストです。内部スキャンチェーンを使用し、擬似乱数テストパターンを実行して固有の署名を生成することで、ハードウェアに潜在的な構造的欠陥がないことを検証します。

LBISTを実行するとウォームリセットがトリガーされるのはなぜですか? スキャンテストはデジタル回路の状態を上書きし、混乱させます。これらの無効な状態をクリアし、システムを正常で予測可能な状態で再起動するには、ウォームリセットが必要です。

テストに必要な金色の署名はどこで見つけられますか? これは、事前に計算された静的な32ビット値です。特定のパターン数と周波数に対応するシグネチャは、Infineon AURIX TC3xxユーザーマニュアルのシステム制御ユニット(SCU)付録に記載されています。

このガイドが重要な理由(ISO 26262の観点から)

安全性が極めて重要な自動車設計(ASIL-B~ASIL-D)においては、ランダムなハードウェア障害を検出する必要があります。特に潜在的な障害は危険です。これらは通常の運転時には隠れたままですが、二次的な障害が発生すると安全違反につながる可能性があります。

ロジック内蔵自己テスト (LBIST) は、重要なハードウェア安全メカニズムです (SM:MCU:LBISTAURIX TC3xx 上で LBIST を実行します。これは潜在故障メトリック (LFM) を対象としています。デジタルコアゲートをチェックするため、LBIST が正常に実行されると、起動時に CPU、バス、および安全コントローラを検証できます。これにより、後で時間のかかる複雑なソフトウェアベースのロジックチェックを行う必要がなくなります。

起動時の自己診断テストの簡単な比較

設計を簡潔に保つため、LBIST をこのプラットフォームの他の組み込みテストと混同しないでください。

試験機構検査内容原因リセット?いつ実行するか主な目標
LBIST内部デジタルロジックはい (ウォームリセット)早期起動(コールドポート/スタンバイウェイクアップ)LFMの構造ゲート欠陥を検出します
MBISTSRAMとフラッシュメモリいいえ (設定可能)起動時または実行時メモリセルおよびアドレスラインの障害を検出します
モンビストPMS電圧モニターいいえ早期起動電圧モニターのバックアップパスを検証します
ファームウェアチェックキーレジスタ構成いいえリセット後/ランタイムレジスタとファームウェアのフットプリントをチェックします

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. キャプチャーフェーズ: このシステムは1つ以上の機能クロックで動作する。論理ゲートがパターンを処理し、フリップフロップがその出力を取得する。
  4. シフトアウトと圧縮: キャプチャされたデータはマルチインプットシグネチャレジスタ(MISR)にシフトアウトされ、そこで長いビット列が単一のデータに圧縮されます。 32ビット署名
  5. 評価: ソフトウェアはこの署名を基準値と比較することで、ハードウェアが正常であることを確認します。

LBISTでカバーされないもの

以下のハードウェア制限事項にご注意ください。

  • アナログモジュール: PMS、EVR、ADCのアナログブロックはテストされません。
  • SRAMの内容: メモリテストはMBISTに任されています。LBISTはハードウェアをスクランブルするため、特定のメモリテストユニット(MTU)レジスタが破損します。ソフトウェアはこれらのレジスタ値をバックアップおよび復元する必要があります。

知っておくべきハードウェアレジスタ

テストの設定とは、システム制御ユニット(SCU)のレジスタに書き込むことを意味します。これらの書き込みは、 安全終了(SEINIT) 誤実行を防ぐため。

  • LBISTCTRL0 (コントロール0): 冗長なトリガービットが含まれています(LBISTREQ そして LBISTREQRED) コントローラのリセットビット (イビストル)、および完了フラグ (LBISTDONE)
  • LBISTCTRL1 (コントロール1): テストクロック周波数分周器を設定します(頻度)、論理構造レイアウト()現在の急増を管理するために速度制限を変更する(スプリットシュ)、および LFSR シード (シード)
  • LBISTCTRL2 (コントロール2): 実行するテストパターンの数を設定します(長さ)
  • LBISTCTRL3 (コントロール3): 最終的な 32 ビットのテスト署名を保持します (サイン)
  • RSTSTAT (ステータスのリセット): テストがどのように終了したかを監視します LBTERM (テストは正常に終了しました) LBPORST (テストは電源投入リセットによって中断されませんでした)フラグ。

ウォームリセット境界

テストが終了すると、ハードウェアは必ずシステムを強制的にウォームリセットします。これは意図的なハードウェア設計上の選択です。

スキャンテストではチップ全体にランダムな値が強制的に書き込まれるため、ロジックゲートの内部状態が無効になります。ウォームリセットはすべてのレジスタをフラッシュし、MCUをクリーンな状態から起動します。

SRAMはウォームリセット後もデータを保持するが、リセットによってMTUの一部が破損する。ソフトウェアはこの移行を慎重に処理する必要がある。

クロスリセット状態機械の設計

テストによってウォームリセットがトリガーされるため、ソフトウェアドライバを 2 つの部分に分割する必要があります。 リセット前トリガーフェーズ そして リセット後の分析フェーズ

                    +--------------------+
                    |     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. ソフトウェアの流れと手順

フェーズA:プリリセットトリガー

  1. リセット原因の確認: 読む RSTSTAT. リセットが コールドポート または スタンバイ起動. ソフトウェアによるリセットの場合は、この手順をスキップしてください。
  2. 現在の状態を読み取る: 読む g_LbistContext.state. コールドブート時にこれを初期化します LBIST_STATE_START
  3. MTUレジスタのバックアップ: リセット後に復元できるように、重要なMTUレジスタの状態はすべて保持RAMに保存してください。
  4. ハードウェアの設定: 割り込みを無効にします。セーフティ エンドイット保護を解除します (UnlockSEINIT()) シード、周波数、パターンカウントの設定を書き込みます。 LBISTCTRL1 そして LBISTCTRL2
  5. 書き込み意図の検証: 設定のCRCを計算して、それを書き込みます。 g_LbistContext.callerIntentCheck. これにより、ソフトウェアの重大なバグによってテストが意図せず実行されるのを防ぎます。
  6. 状態を「実行」に設定する: 書く LBIST_STATE_RUNg_LbistContext.state
  7. 冗長なトリガー: 書く 1 両方へ LBISTCTRL0.LBISTREQ そして LBISTCTRL0.LBISTREQRED 同じクロックサイクル内で。
  8. CPUをロックする: 無限アセンブリループに入ります(while(1);)そしてハードウェアリセットが完了するまで待ちます。

フェーズB:リセット後の分析

  1. ブートエントリ: MCUが起動します。ソフトウェアが読み上げます。 RSTSTAT そして、ウォームリセットを検出します。
  2. 状態を確認してください: ソフトウェアは読み上げます g_LbistContext.state そして、それが設定されているのを見つける LBIST_STATE_RUN
  3. 意図を確認する: CRCを計算して比較します g_LbistContext.callerIntentCheck. 一致しない場合は、データ破損エラーを報告し、テストをスキップしてブートループを回避します。
  4. フラグを確認してください: 確認してください RSTSTAT.LBTERM == 1RSTSTAT.LBPORST == 0、 そして LBISTCTRL0.LBISTDONE == 1
  5. 署名の確認: 署名を読む LBISTCTRL3.署名 そしてそれを黄金比と比較する。
    • 一致する場合: 状態を次のように設定します LBIST_STATE_PASS. LBIST コントローラーをリセットするには、 イビストル. コールドリセットフラグをクリアします RSTSTAT 後続のウォームリセット時にテストが再実行されないようにするため、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電源設定

スタンバイモード中、システムが保持RAMへの電源供給を遮断する場合があります。この場合、状態変数がリセットされ、MCUは起動のたびに新たなテストを実行するため、無限ブートループが発生します。

  • 修正方法: 設定する セントビラムセル そして PROCONRAM.LMUINSEL SCU のレジスタを操作して、スタンバイ中に LMU RAM セクタに電源を供給し続けるようにします。また、リンカ スクリプトが g_LbistContext 変数 .noinit 起動時のC初期化コードがウェイクアップ時にそれをクリアしないように、このセクションを追加します。

2. 初期データアクセスの落とし穴

コールドブート直後に初期化されていないSRAMセクターを読み取ると、 データアクセスの落とし穴 一部のAURIXシリコン製造工程において、ECCまたはパリティビットの不具合が原因で発生しています。

  • 修正方法: トラップハンドラは、例外が起動初期段階の保持メモリ空間で発生したかどうかを確認する必要があります。発生した場合は、CPUを停止させるのではなく、ダミーデータを書き込んでECCビットを初期化し、トラップステータスをクリアして実行を再開します。

3. マルチコアブートの協調

AURIXはマルチコアプラットフォームです。ウォームリセットサイクル中にすべてのコアが同時に起動すると、ステートマシンに干渉する可能性があります。

  • 修正方法: マスタースレーブブートシーケンスを設定します。起動中は、すべての補助コアを(ブートモードヘッダーまたはSCU制御を使用して)停止状態に保持します。 コア0 LBIST ステートマシンを実行します。コア 0 がテストを検証して書き込みを行うと、 LBIST_STATE_PASSそうすれば、他のコアを起動のために解放できます。

ラボ試験および検証

機能安全評価者による設計の検証には、以下のテスト方法を使用できます。

  • 黄金の道筋を確認する: デバッガーを使用して、ステートマシンが遷移を正常に完了したことを確認してください: $$\text{START} \longrightarrow \text{Warm Reset} \longrightarrow \text{RUN} \longrightarrow \text{PASS}$$
  • データエラーを挿入する: CPU を停止する 始める フェーズ、手動で破損させる g_LbistContext.callerIntentCheck メモリ上でCRCチェックを実行し、処理を再開します。ソフトウェアがエラーを検知し、テストを実行せずに安全な状態に移行することを確認します。
  • 署名挿入失敗: テスト構成を少し変更します(パターン数を変更するなど)。 LBISTCTRL2これにより署名が変更されます。以下の点を確認してください。
    1. このコードは、テストを最大3回実行しようとします。
    2. MCUは3回目の試行失敗時にセーフ状態に移行します。

まとめ

AURIX TC3xx上でLBISTを実行することは、デジタルロジックのISO 26262診断要件を満たすための非常に信頼性の高い方法です。内部スキャンチェーンと擬似ランダムパターンを使用することで、ハードウェアは構造的なゲート障害を正確に特定します。

これを安全に実行するには、クリーンでクロスリセット可能なステートマシンを構築する必要があります。保持RAM構成の保護、起動時のトラップの管理、CPUコアの連携、そして確実な再試行制限の設定に重点を置いてください。これにより、自己テストの安全性と信頼性が確保されます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Need a Quote or Have Questions?

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