安全マイコンの故障検出機構(WDT・ロックステップ・ECC・BIST)

ランダムハードウェア故障を検出し安全状態へ導くための代表的な機構を、守る部位・対象故障・ISO 26262 の診断指標(DC・SPFM・LFM)の観点で対比する

区分用語・概念
版1.0
作成
更新
規格ISO 26262-5:2018(Hardware level) / ISO 26262-11:2018(Application to semiconductors)

一文定義

安全関連の車載マイコンが、動作中に確率的に生じる ランダムハードウェア故障 を検出して安全状態へ導くために備える機構群。代表が WDT(制御フロー監視)・ロックステップ(CPU の冗長実行と比較)・ECC(メモリのビット誤り訂正)・BIST(起動時/周期の自己診断)で、守る部位ごとに役割が分かれる。

ECU の構成とマイコンの位置

これらの機構が守る対象を掴むため、まずマイコンが置かれる ECU(電子制御ユニット) の全体像を見ておく。ECU は、電源 IC(SBC、多くは WDT を内蔵)から給電・監視を受けるマイコンを中心に、センサ入力を取り込む ADC、時間を刻むタイマ、外部と通信する通信コントローラ+トランシーバ、アクチュエータを駆動する出力ドライバから成る。マイコン内部には CPU コア・RAM(揮発性の作業メモリ)・フラッシュ(不揮発のプログラム格納)・内部バスがある。

電源 IC / SBC(レギュレータ + WDT)給電 / 監視マイコン(MCU)内部バスCPU コアRAMフラッシュADCタイマ通信センサ入力トランスシーバCAN/LIN バス出力ドライバアクチュエータ
図: 一般的な車載 ECU。電源 IC(SBC)がマイコンへ給電し WDT で監視、マイコンは CPU コア・RAM・フラッシュ・ADC・タイマ・通信を内蔵する。センサ入力を受け、通信はトランシーバ経由でバスへ、出力はドライバを介してアクチュエータを駆動する。

後述の機構は、この中の どの部位を守るか で役割が分かれる——CPU コアはロックステップ、RAM/フラッシュ/バスは ECC、チップ全体は BIST、実行の流れは(外部の)WDT、という具合である。

なぜ必要か — ISO 26262 の考え方

半導体は経年で必ず一定確率の故障を起こす(ランダムハードウェア故障)。これは設計で 0 にできないため、ISO 26262 は「起きても 検出して安全状態に持ち込む」ことを求める。鍵になる指標が 3 つある。

  • 診断カバレッジ(DC) — ある故障モードのうち、安全機構が検出できる割合。機構の"効き"を表す。
  • 単一点故障メトリクス(SPFM) — 1 つの故障がそのまま安全目標を侵害する(単一点故障)割合をどれだけ抑えたか。安全機構で検出できれば残留単一点故障が減る。
  • 潜在故障メトリクス(LFM) — 表に出ずに潜む故障(潜在故障)をどれだけ検出できるか。安全機構そのものが壊れていないかを確かめる仕組み(BIST 等)が効く。

つまり各機構は「DC を稼いで SPFM・LFM を満たす」ための道具である。以下、守る部位ごとに見る。

WDT(ウォッチドッグタイマ)— 制御フローの監視

CPU が暴走・ハングして所定の処理を回さなくなる故障を検出する。ソフトが定期的に WDT を叩き(キック)、期限内に叩かれなければ WDT がリセットや安全状態遷移を起こす。

  • ウィンドウ WDT — 早すぎるキックも遅すぎるキックも異常とみなす(時間窓を上下限で挟む)。単純な周期キックより暴走検出力が高い。
  • Q&A(チャレンジ・レスポンス)WDT — WDT が出す問いに正しい答えを返させる。ソフトが正しい順序で正しい計算を通ったことまで確かめられ、DC が高い。

WDT は多くの場合 MCU の外部(独立電源・独立クロック)に置く。監視対象と同じ電源/クロックだと、共通原因で両方同時に倒れて監視が効かなくなるためである。

電源 IC / SBC(レギュレータ + WDT)給電 / 監視マイコン(MCU)内部バスCPU コアRAMフラッシュADCタイマ通信センサ入力トランスシーバCAN/LIN バス出力ドライバアクチュエータ
WDT の監視対象: 外部の WDT(電源 IC/SBC 側)が、MCU の CPU が正しく処理を回している=制御フローを監視する。

ロックステップ — CPU ロジックの冗長実行

同一の CPU コアを 2 つ用意し、同じプログラムを同じクロックで実行して、両者の出力を毎サイクル比較する。比較するのはソフトウェアではなく 専用の比較回路 である(後述)。食い違えば CPU 内部のランダム故障とみなし安全状態へ移す。CPU ロジックに対する DC が非常に高いのが特徴。

  • 遅延ロックステップ — 2 コアの実行をわずかに時間・空間でずらす。電源ノイズや宇宙線などの 共通原因故障(CCF) が両コアを同時に同じように誤らせるのを避けるためで、比較の独立性を保つ工夫である。
  • 冗長なのは検出のためで、多数決で動き続ける TMR とは違い、通常は「不一致を見つけて止める(フェイルセーフ)」構成をとる。
電源 IC / SBC(レギュレータ + WDT)給電 / 監視マイコン(MCU)内部バスCPU コアRAMフラッシュADCタイマ通信センサ入力トランスシーバCAN/LIN バス出力ドライバアクチュエータ
ロックステップの監視対象: CPU コアのロジック。同一コアを二重化し出力を毎サイクル比較する。

ECC(誤り訂正符号)— メモリのビット誤り

RAM やフラッシュ、内部バスのビットが化ける故障(宇宙線由来のソフトエラー=SEU、経年の永久故障)を、冗長ビットで検出・訂正する。検出・訂正はメモリへの経路に置いた 符号化・復号回路 が読み書きのたびに行い、CPU は訂正済みのデータを受け取るだけである(後述)。

  • SECDED — Single Error Correction, Double Error Detection。1 ビット誤りを訂正し、2 ビット誤りを検出(訂正はせず異常として扱う)。RAM で広く使われる構成。
  • 訂正できる範囲は黙って直し、検出のみの範囲は安全状態に落とす。パリティ(検出のみ・訂正不可)より強い。
電源 IC / SBC(レギュレータ + WDT)給電 / 監視マイコン(MCU)内部バスCPU コアRAMフラッシュADCタイマ通信センサ入力トランスシーバCAN/LIN バス出力ドライバアクチュエータ
ECC の監視対象: RAM・フラッシュ・内部バス。記憶と転送のビット誤りを冗長ビットで検出・訂正する。

BIST(組込み自己診断)— 起動時・周期の自己テスト

回路が自分自身をテストする仕組み。普段は使われず表に出ない 潜在故障(安全機構自体の故障を含む)を炙り出し、LFM を稼ぐ。

  • LBIST — ロジック回路の自己診断。既知パターンを流して応答の圧縮値(シグネチャ)を期待値と照合。
  • MBIST — メモリの自己診断。既知パターンの書き込み/読み出しでセル不良を検出。
  • 起動時(電源投入直後など)に、チップ内の テスト専用回路 で全体を検査するのが基本。テスト中は回路の状態を壊すため、プログラムの実行中には行えない(後述)。
  • 走行中の周期的な検査は、CPU 自身が結果の分かっている計算を実行して期待値と照合する ソフトウェア自己テスト で補うことが多い。
電源 IC / SBC(レギュレータ + WDT)給電 / 監視マイコン(MCU)内部バスCPU コアRAMフラッシュADCタイマ通信センサ入力トランスシーバCAN/LIN バス出力ドライバアクチュエータ
BIST の監視対象: チップ全体(ロジックとメモリ)。普段表に出ない潜在故障を起動時・周期の自己診断で炙り出す。
安全マイコン(チップ)Core 1Core 2比較ロックステップCPU ロジック故障RAM + ECCフラッシュ + ECCECCメモリのビット誤りBIST(LBIST / MBIST): 起動時・周期の自己診断 → 潜在故障WDT制御フロー/ハング(Q&A 監視)
図: 守る部位で機構が分かれる。CPU ロジックはロックステップ(2 コア比較)、メモリは ECC、チップ全体は BIST が起動時・周期に自己診断、外部の WDT が制御フローを監視する。

故障かどうかは誰が判定するか — 専用回路とソフトウェアの分担

4 つの機構で「故障か」を判定するのは、CPU が実行するソフトウェアではなく、ほぼ CPU とは別の専用回路 である。検査される側(CPU)が壊れていれば、その CPU で走る検査プログラムの結果も信用できない。検査する側を別の回路にしておくこと自体が目的で、外部 WDT を独立電源・独立クロックに置くのと同じ「独立性」の考え方である(CAN の CRC を CPU ではなく CAN コントローラの回路で計算するのとも同じ)。

機構判定する回路CPU(ソフトウェア)がやること
WDT別チップ(電源 IC 側)のカウンタと比較回路。自前のクロックで数え、期限切れ・窓外・答えの誤りを判定する期限内のキック。Q&A 方式では問いへの答えの計算(CPU が正しく計算できることを見るため、あえて計算させる)
ロックステップ2 コアの出力信号を毎クロック突き合わせる比較回路2 コアとも普通にプログラムを実行するだけ。片方の出力は比較にしか使わない
ECCメモリ経路の符号化・復号回路なし。訂正済みのデータを受け取り、訂正できない誤りのときだけ異常の通知を受ける
BISTチップ内のテスト専用回路開始の指示と結果の読み出し程度

ソフトウェアが担うのは、キックと Q&A の答え、検出後の処理(異常の割り込みを受けて安全状態へ移す、診断コードを残す。リセット自体は外部 WDT が回路で直接かけることもある)、そして走行中の ソフトウェア自己テスト である。

なぜ回路の方が速いか

「速い」には 2 つの意味があり、どちらでも回路が勝る。

  1. 1 回の判定にかかる時間。 32 ビットの値 A・B の一致判定を例にとる。CPU は「A を読む → B を読む → 比較する → 分岐する」を、命令ごとに取り出し・解読・実行するので数クロックかかる(何でもできる汎用性の代償)。専用回路は下図のように 32 個の XOR が同時に動き、その出力を OR ゲートの木(log⁡232=5\log_2 32 = 5 段)で束ねるだけなので、ゲート 6 段分の伝搬遅延で結果が出る。1 クロックの中に余裕で収まる。
  2. 判定の頻度。 ソフトウェアはアプリの処理の合間にしか検査を差し込めない。例えば 10 ms 周期のタスクで検査すれば、検出が最大 10 ms 遅れ、検査を増やすほどアプリの時間を削る。専用回路は CPU と並んで常に動くので、毎クロック・毎アクセス判定しても CPU の時間を使わない。
A0  ⊕ B0  ┐
A1  ⊕ B1  ┤
   ...     ├→ 32 入力の OR → 1 なら不一致
A31 ⊕ B31 ┘

ISO 26262 では、故障の検出から安全状態への移行までを FTTI(フォールト許容時間間隔) 内に収める必要があり、検出の遅れはその持ち時間を直接削る。速さは性能ではなく安全要件として効く。

加えて、ロックステップが比べるのはコア内部の多数の信号である。ソフトウェアから見えるのはレジスタとメモリだけなので、ソフトウェアではそもそも同じ比較ができない。

専用回路の中身

部品は AND・OR・XOR・NOT の 論理ゲート と、1 ビットを覚える フリップフロップ である。ゲートだけの回路は入力が変わればすぐ出力が変わり(比較・符号検査に使う)、フリップフロップを含む回路はクロックに合わせて状態を持つ(カウンタ・エラーの記録に使う)。CPU 自体も同じ部品でできており、違いは「どんなプログラムでも実行できる」組み方か「決まった 1 つの機能だけをする」組み方かにある。専用回路は CPU と同じチップ(WDT は電源 IC 側)に、製造時に焼き込まれている。

機構回路の中身いつ判定するか
ECCXOR の木メモリの読み書きのたびに毎回
ロックステップXOR と OR の比較回路 + エラーを覚えるフリップフロップ毎クロック
WDTカウンタ(フリップフロップ + 加算回路)+ 上限・下限との比較回路数え続け、キック時・期限切れ時に判定
BISTパターン生成回路 + 応答の要約回路 + 期待値との比較回路起動時など決まったときだけ

ECC が XOR だけでできる理由。 偶数パリティは、全ビットの XOR を 1 ビット足して保存しておき、読み出し時に取り直して食い違えば「どこかが化けた」と分かる方式である。ただし位置は分からない。

データ 1011 → 1⊕0⊕1⊕1 = 1 → パリティ 1 を付けて保存
読み出し時に再計算 → 保存したパリティと違えば「どこかが化けた」

そこで ビットの組み合わせを変えた XOR を複数本 取っておく(ハミング符号)。読み出し時にすべて取り直し、どの検査が食い違ったかのパターン(シンドローム)を見ると化けたビットの位置が決まり、そのビットに XOR 1 をかければ元に戻る。SECDED はこれに全体パリティを 1 本足し、2 ビット誤りを「訂正不能」と見分けられるようにしたものである。検出も訂正も XOR の組み合わせだけで済むので、読み出しとほぼ同時に終わる。

BIST の中身。 フリップフロップを数珠つなぎにし、ところどころの出力を XOR して先頭へ戻すと、ランダムに見える 0/1 の列が次々に出てくる(LFSR、線形帰還シフトレジスタ)。これをテスト対象に流し、出力を同様の仕組みに流し込み続けて最後に残った値を要約値(シグネチャ)とし、期待値と照合する。ロジックの BIST では、コア内部のフリップフロップを一列につないで外からパターンを出し入れできるようにする(スキャンチェーン)。このためテスト中は普段の状態が上書きされ、CPU がプログラムを動かしている間は実行できない。これが「起動時に行う」理由である。

回路とソフトウェアの役割分担

回路は機能が固定で後から変えられず、チップ面積も使う。そこで 単純で毎回やる判定(比較・符号検査・カウンタ)は回路、複雑でたまにやる処理(検出後の対応・記録)はソフトウェア と分ける。信号処理で FFT のような定型の重い演算を専用の演算器に任せ、判断をソフトウェアで行うのと同じ切り分けである。

混同されやすい概念との対比

機構主に守る部位対象の故障判定の担い手検出タイミング主に効く指標
WDT制御フロー(実行の流れ)暴走・ハング外部のカウンタ・比較回路常時(キック期限)DC・SPFM
ロックステップCPU コアのロジック演算・論理の誤り2 コア出力の比較回路毎サイクル比較DC・SPFM
ECCメモリ・バスビット誤り(SEU/永久)符号化・復号回路アクセスごとDC・SPFM
BISTチップ全体(機構自身も)潜在故障テスト専用回路(走行中はソフトウェア自己テスト)起動時(走行中は周期)LFM

4 つは競合せず 役割分担である。WDT は「流れ」、ロックステップは「演算」、ECC は「記憶」、BIST は「潜んだ故障」を受け持つ。単一点故障を抑えるのが前 3 者、その機構が生きているかを確かめて潜在故障を抑えるのが BIST、と整理できる。

II-1 答案例(600字)

安全関連の車載マイコンでは、動作中に確率的に生じるランダムハードウェア故障を検出し安全状態へ導く必要がある。ISO 26262 は診断カバレッジ(DC)を高めて単一点故障メトリクス(SPFM)と潜在故障メトリクス(LFM)を満たすことを求め、これを担うのが以下の機構である。

WDT は制御フローを監視する。ソフトが期限内に WDT を叩かなければ暴走・ハングとみなしリセットや安全状態遷移を起こす。時間窓で挟むウィンドウ方式や、正しい応答を返させる Q&A 方式で検出力を高め、共通原因を避けるため独立電源・独立クロックの外部に置く。

ロックステップは同一 CPU コアを二重化し、同じプログラムの出力を毎サイクル比較して不一致で異常を検出する。CPU ロジックに対する DC が高い。電源ノイズ等の共通原因故障を避けるため実行を時間・空間でずらす遅延ロックステップが用いられる。

ECC はメモリやバスのビット誤り(ソフトエラーや永久故障)を冗長ビットで検出・訂正する。SECDED は 1 ビットを訂正し 2 ビットを検出する。

BIST は回路の自己診断で、普段表に出ない潜在故障を起動時や周期に炙り出し LFM を稼ぐ。ロジック用の LBIST とメモリ用の MBIST がある。

これらは競合せず、流れ・演算・記憶・潜在故障を分担して受け持つことで、システム全体の故障検出を成立させる。

用語メモ

本文で使った用語の平易な説明。厳密さより、本文のイメージをつかむことを優先している。

  • ランダムハードウェア故障 — 部品が経年や偶発で確率的に壊れる故障。設計ミス由来(系統的故障)と違い、良い設計でも一定確率で必ず起きるので「検出して安全に倒す」しかない。
  • 安全状態 — 危険を避けられる決められた状態(例: 出力を止める、縮退運転にする)。故障を検出したらここへ移す。
  • 診断カバレッジ(DC) — 安全機構が「どれだけの故障を捕まえられるか」の割合。網の目の細かさ。
  • 単一点故障 — たった 1 つの故障が、他の防御なしにそのまま危険につながるもの。これを減らすのが SPFM。
  • 潜在故障 — 表に出ずに潜んでいる故障。とくに安全機構そのものが密かに壊れていると、いざという時に効かない。これを見つけるのが LFM で、BIST が受け持つ。
  • 共通原因故障(CCF) — 1 つの原因(電源変動・クロック・熱・宇宙線など)が、冗長化したはずの複数箇所を同時に倒す故障。冗長化の効果を無にするので、電源やクロックや実行タイミングを分けて避ける。
  • ソフトエラー(SEU) — 宇宙線などでメモリのビットが一時的に反転する故障。素子は壊れておらず、書き直せば直る。ECC が訂正する主対象。
  • SECDED — メモリ ECC の定番。1 ビット誤りは自動訂正、2 ビット誤りは訂正せず異常として検出する。
  • フェイルセーフ — 故障したら安全側に倒して止める考え方。多数決で動作を続ける冗長(TMR)とは狙いが違う。
  • キック(WDT を叩く) — ソフトが「まだ正常に回っています」と WDT に定期的に知らせる操作。止まれば異常とみなされる。
  • CPU(中央処理装置) — 命令を取り込んで演算・制御を行う「頭脳」。プログラムを実行する主体。
  • CPU コア(core) — CPU の演算を担う中核ユニット 1 つ分。1 チップに複数コアを載せられる。ロックステップは 2 コアに同じ処理をさせて突き合わせる。
  • RAM — 実行中の変数やデータを置く 揮発性 メモリ(電源を切ると消える)。読み書きが速い。ECC の主対象。
  • フラッシュ — プログラム本体や設定を保持する 不揮発性 メモリ(電源を切っても残る)。書換え回数に上限がある。ここも ECC で守る。
  • 内部バス — チップ内で CPU・メモリ・周辺回路をつなぐ配線群(データ・アドレス・制御線)。ここを通るビットも化けるのでパリティや ECC で守る。
  • TMR(三重冗長) — 同じものを 3 つ並列動作させ多数決を取る方式。1 つ壊れても残り 2 つの多数決で正しい出力を出し 続けられる(フェイルオペレーショナル)。不一致で止めるロックステップ(2 重・フェイルセーフ)と狙いが異なる。コストが高く、車載マイコンでは全体 TMR は稀で重要部に限られる。
  • 論理ゲート(AND・OR・XOR・NOT) — 0/1 を入れて 0/1 を出す最小の部品。AND は「両方 1 なら 1」、OR は「どちらか 1 なら 1」、XOR は「2 つが違えば 1」、NOT は反転。XOR は「違えば 1」なので、一致判定やパリティ計算の主役になる。
  • フリップフロップ — 1 ビットを覚えておく回路。クロックが来た瞬間の入力を取り込み、次のクロックまでその値を保持し続ける。「クロックの合図でだけシャッターが切れるカメラ」のようなもの。ゲートだけの回路は入力が変わると出力もすぐ変わってしまい何も覚えられないが、フリップフロップがあると「状態」を持てる。数珠つなぎにすればシフトレジスタ、加算回路と組めばカウンタになる。CPU のレジスタもこれでできている。
  • 伝搬遅延 — ゲートの入力が変わってから出力が変わるまでのごく短い時間。回路の速さは、この遅延が何段分積み重なるかで決まる。
  • 比較回路 — 2 つの値が一致するかを判定する回路。ビットごとに XOR を取り、どれか 1 つでも 1 なら不一致。
  • ソフトウェア自己テスト — CPU 自身が、結果の分かっている計算を実行して期待値と照合するテストプログラム。回路の状態を壊さないので走行中の合間に周期実行できる。ただし判定する側も CPU なので、専用回路の BIST より独立性は弱い。
  • パリティ — データ中の 1 の個数が偶数か奇数かを表す 1 ビット。1 ビット化けると合わなくなるので「化けた」ことは分かるが、どこが化けたかは分からない。
  • ハミング符号・シンドローム — 組み合わせを変えたパリティを複数持たせ、どの検査が食い違ったかのパターン(シンドローム)から化けたビットの位置を特定する符号。「北半分にある?」「東半分にある?」と yes/no を重ねると宝の位置が決まるのと同じ。
  • LFSR(線形帰還シフトレジスタ) — フリップフロップの数珠つなぎに XOR で帰還をかけ、ランダムに見える 0/1 の列を作る回路。部品が少なく、テストパターン作りに向く。
  • シグネチャ — テスト対象の長い応答列を、短い値に圧縮した要約値。1 ビットでも応答が違えばほぼ確実に別の値になるので、期待値 1 つと比べるだけで全体の正しさを確かめられる。ファイルのハッシュ値のようなもの。
  • スキャンチェーン — テストのときだけ、回路内部のフリップフロップを一列につないで長いシフトレジスタにする仕組み。外からパターンを流し込み、結果を取り出せる。そのぶん普段の状態は上書きされる。
  • FTTI(フォールト許容時間間隔) — 故障が起きてから危険な事象に至るまでの猶予時間。故障の検出と安全状態への移行をこの時間内に終える必要がある。

出典

  • ISO 26262-5:2018, Road vehicles — Functional safety — Part 5: Product development at the hardware level
  • ISO 26262-11:2018, Road vehicles — Functional safety — Part 11: Guideline on application of ISO 26262 to semiconductors

更新履歴

版日付変更内容
1.02026-08-11初版(ドラフト)

関連ノート