Functional Safety:機能安全の実際

Photo01:この図では詳細は省かれているが、CPUコアとしてはe200z4というPowerPCベースのものを最高120MHzで動作させている。e200z4そのものはそれほど高速ではなく、性能としてはそこらのマイコンよりやや高速程度と考えていただければいいだろう

 前回は機能安全という仕組みというか考え方そのものをご紹介したが、では実際にこれをどう実装しているか、という話をご紹介したい。

 Photo01は、米フリースケールが自動車のエンジン及び車体制御向けにリリースしている、「Qorivva(コリーヴァ) MPC5643L」というマイコンである。このマイコンはISO-26262 ASIL-DとIEC-61058 SIL3の安全規格に準拠したことを特徴としている。ISO-26262 ASIL-Dの基準は前回紹介したとおり

  • PFM:1億時間あたり1回未満
  • SPFM:99%以上
  • LFM:90%以上

が求められる、非常に厳しい規格である。これを満たすために、MPC5643Lでは

(1)CPUコアを2つ搭載し、この2つを協調動作させる(Lock step Mode)ことで故障率を下げる機能を搭載した。
(2)CPUコア以外の主要な機能ブロック(eDMA、クロスバースイッチ)も、SoR(Sphere of Replication)としてかならず2つ搭載することで冗長性を確保した
(3)FCCU(Fault Collection and Control Unit)を搭載し、これによって故障の検出と回復をおこなれるようにした。
(4)SoRとFCCUを繋ぐものとして、RCCU(Redundancy Control and Checker Unit)を搭載した。
(5)起動時の自己診断用に、MBIST(Built-In Self-Test for Memory)とLBIST(Built-In Self-Test for Logic)をハードウェアで搭載した。
(6)ADC(A/D Converter)とFlashメモリ用のBIST機能をソフトウェアから実行できるようにした
(7)Watchdog Timerを二重化した
(8)接合部温度センサーを二重化した
(9)マスク不能な緊急割り込み(NMI:Non-maskable interrupt)をサポート
(10)16リージョンのメモリ保護ユニット(MPU:Memory Protection Unit)を搭載
(11)クロック信号のモニタユニット(CMU:Clock Monitoring Unit)を搭載
(12)電源管理ユニット(PMU:Power management unit)を搭載
(13)CRCユニット(Cyclic Redundancy Check)を搭載

といった機能を搭載した、という事がデータシートに掲げられている。ちなみにこれ以前の話として、Flash MemoryとSRAMはECCによる保護が行われている(後述)。

 とまぁ、さらっと書いてしまったが、これの意味を見ただけでお分かりになる読者は少ないかと思う。僚誌PC Watchの読者の方でも、これらの意味を理解されている方は少ないであろう。ということで、もう少しちゃんと説明を。

図1

 まず一番要になるのがLock step Modeである。図1は、Photo01に出てくる「PowerPC e200z4」というコアの内部の概略図である。MPC5643Lは、このコアを2つ搭載している形になる。

 さて、ここでPFMの条件である「1億時間あたり1回未満」の条件を満たすための方法を考えてみよう。前回もちょっと説明したが、一般にMCUは1億時間あたり2回程度のエラーが発生する。なので、「2つのコアのうち、片方が故障したら即座にもう片方のコアに処理を引き継げば、結果として両方のコアが故障する頻度は1億回あたり1回程度に抑えられる」というのが基本的な発想である。これをDMR(Dual Modular Redundancy:2モジュールの冗長性)と呼ぶ。

 さて、問題は「故障が起きたときの引継ぎのやり方」である。例えばあるプログラムを実行中に、片方のコアがエラーを起こしたとする。このとき、もう片方のコアに処理を引き継ぐ、というのは案外に難しい。

 一番簡単な方法は、「もう片方のコアでプログラムを最初からやり直す」というものだ。用途によっては、この一番簡単な方法でも十分な冗長性が得られる場合があるのだが、車載向けでこれはありえない。走行中、エンジン制御MCUのコアに異常が起きたといって、いきなりもう片方のコアがエンジンのセルフテストを始めてしまったら、走行ができないとかいう以前に、危険な状態に陥りかねない。したがって、引継ぎをする際には「故障が起きる直前の状態をそのまま引き継ぐ」ことが要求される。

 これをするためには2つのコアが同じプログラムを同じように処理している必要がある。ここで難しいのは、同じプログラムを「同じように」処理させることだ。同じプログラムを2つの同じコアに投入して、ヨーイ、ドン!で実行させると、人間の目から見れば同じタイミングで動作し、同じタイミングでプログラムの処理が終わるように見える。が、実際には細かなタイミングのゆらぎなどがあるので、必ずしも全く同じ時間で処理が終わるとは限らない(μ秒単位での差が出る)し、これが要因となって内部の状態が同一でなくなる状況が発生する。こうした差がある状態で引き継ぎを行うと、処理そのものが異なった結果になる事も考えられる。

 こういう問題を防ぐための手法が(1)のLock stepである。Lock stepの元々の意味は、囚人を鎖などで繋いで、同じように歩かせる事を指すが、これが転じて複数のコアを同期させて動かす事をLock stepと呼ぶ。

 具体的には図2のように2つのコアがあるとき、それぞれの内部ユニット同士が1サイクル毎にお互いの状態が同じになるように同期させる、というものだ。この同期状態は、どちらかのコアに異常が起きたと判断されるまでの間はずっと継続される。

図2

 この状態が崩れるのは、コアに故障が起きたと判断された場合である。具体的にはコア外部に様々な異常検出回路((4)のRCCU)が装備されている。この回路の出力は(先ほど出てきた)FCCUに集められ、その結果としてFCCUが「コアのどちらかに異常が生じた」と判断した場合、このLock step動作は中止され、以後は異常が起きてない方のコアの出力のみが利用されることになるという訳だ。

 ちなみに片方のコアに異常が起きたケースで、そのコアだけを動作中にリセットして復活させる、ということは通常は無い。これは

  • リセットしたことで復旧する場合もあるが、復旧できないこともある。
  • コアをリセットした後で、正常なまま稼動を続けているコアと再び同期状態にするためには、しばらくの間コアを停止させて「現在の状態」を読み出し、それをリセットした側にコピーする必要がある。これが許されるような用途であれば可能だが、例えば「同期のためにエンジンが30秒止まります」は通常許されない。

というわけで、こうした用途ではシステム全体の再起動(エンジンを止めて、またエンジンを掛ける)が起きるまで片方のコアは停止状態に置かれるのが普通だ。

 (2)のSoRも同じ事である。eDMAは「Enhanced Direct Memory Access」の略で、周辺回路とデータを高速転送するための仕組みであり、クロスバースイッチとはCPUとその他の回路を繋ぐためのものである。これらについても二重化を行い、片方に異常が出てももう片方で処理を継続できるようにしている。またこれを、コア同様に(3)のFCCUで管理して、可能な範囲で異常発生やその回復を図れるようにしている。

 (5)とか(6)は、自己診断に関係するものである。通常安価なマイコンは、自身の機能が正常かどうかというテスト機能は搭載していない。テスト機能自身の正当性の確認も必要なこともあり、こうした機能を搭載すると回路規模が大幅に増える(=コストが上がる)関係で、通常は内蔵せず、必要ならばソフトウェアで簡単に動作を確認する程度の機能しかないが、これではISO-26262 ASIL-DやIEC-61058 SIL3の基準は満たせないため、専用ハードウェアを搭載している。

 (7)のWatchdog Timerとは、コアの動作確認に必要なものである。(1)のLock stepなどにより、CPUのハードウェア的な異常に関しては専用回路で検出可能だが、例えばソフトウェアの異常などで暴走しているといったケースは当然対象外である。こうした場合に役に立つのがWatchdog Timerである。これは一定期間毎にCPUに割り込みをかける機能であり、通常はこの割り込みがかかったら一定期間内にプログラムはその応答を返すことになっている。

 ところがもしプログラムが暴走していると、割り込みが入ってもそれに対する応答が返せない。このため一定期間待ってもプログラムから応答が得られない事になる。この場合Watchdog Timerは「プログラムが異常状態である」と判断し、強制的にシステムのリセットを掛けることで、異常状態から脱却させるシステムである。これはマイコンにしばしば搭載される普遍的な機能であるが、こちらについても二重化することで故障に対する耐性を高めている。同様に(8)は、回路内部が異常発熱をしていないか検出するための温度計であるが、これも二重化している。

 (9)/(10)はやや細かい話であるが、何か異常があったときに、それに対する対応を他の処理に先駆けて実施するための仕組みが(9)、メモリに対する不正なアクセス(本来書き換えてはいけないデータが書き換わるとか、隠してある場所を読み出したりするなど)を防止するための仕組みである。普通はこの仕組み、外部からの攻撃(侵入者に対する防御)のために用いられるが、ここでは何らかの故障や異常動作を防止するために利用されている。

 これに関係するのが、先ほどちょっと出たECCの保護である。ECCというのはError Check and Correct memory(エラー検出及び修正)機能で、例えば宇宙線とか放射線などの影響でデータが書き換わるとか、物理的な故障で一部がおかしくなったという場合にこれの検出・修正を自動的に行うためのものである。勿論限度はあるのだが、MPC5643Lの場合は32bit分のデータに対して

  • 1bitのエラー修正
  • 2bitのエラー検出

が可能である。つまり32bitのうち1bitだけが壊れたケースでは、その値を自動的に修正して処理が続行できる。また2bit壊れた場合、修正は不可能だが「メモリが故障した」という報告は上げることができる。3bit以上はお手上げであるが、通常3bit以上が同時に異常になるケースは殆どなく(物理的に損傷といった、機能安全の想定外の状況になる)、このため通常はこの程度のECCで十分とされる。

 (11)と(12)は、MPC5643Lの外部から供給されるものに対するチェックである。クロック信号とは、MPC5643Lを動作させるタイミングを決めるためのもので、この信号を基準にMPC5643Lは動作する。普通はこの信号の品質とか異常の有無は、信号生成側の責任であるが、MPC5643Lは内部でもこの信号の品質や異常の有無を確認する仕組みが搭載されている。(12)は名前の通り電源の管理だが、単にMPC5643Lの各ブロックに正確な電圧で電源を供給するのみならず、動作周波数に応じて電圧を可変したり、供給される電圧のチェックを行うといった機能も搭載されている。

 最後の(13)とは、巡回冗長検査などと日本語では訳されるが、要するにデータを受け渡しをするときに「データが壊れていないか」を確認するための方法である。CRCには幾つかの方法があるが、どれも原則として多項式演算を使い、受け渡しするデータから独自のCRCコードを生成するもので、送信側と受信側がそれぞれCRCコードを計算し、これが同じ値だったらデータは壊れていない(逆にCRCコードが異なっていれば、途中で壊れた)と判断する。壊れていた場合は再送するなり破棄するなり、このあたりは使い方次第であるが、そんなわけでCRCコードは非常に広い範囲で利用されるものである。

 ただ計算は簡単ながら処理が大変(多項式演算で、やたらに掛け算の回数が多い)ので、マイコン自身にやらせると結構処理時間がかかる。そこでCRC専用の計算回路を用意した、というのがこの(13)である。MPC5643Lを使うような用途では、システムの各コンポーネント間の通信が正常かどうかを確認するためにこのCRCを多用するケースが多く、そのため専用回路を設けたという話である。

 今回はやや細かな話が多くなったが、そんなわけで機能安全を実現するためには、内部の回路にも専用の配慮が必要になってくる。加えて言えば、ISO-26262 ASIL-DにしてもIEC-61058 SIL3にしても、それぞれに求められている要件を満たしていることを説明するために、膨大な故障率やら安全性やらに関するドキュメントを提出する必要があり、MPC5643Lなどの製品はこうしたドキュメントがマイコンメーカーから提供されているのも大きい。

 普通のマイコンを使う場合、こうしたドキュメントの生成(やそのベースになるデータの収集)は自動車メーカーの責任になる訳で、そうした観点からも機能安全に向けた専用のマイコンを使う事で、開発を少しでも楽にしようと考えるわけだ。

カーエレWatch バックナンバー
http://car.watch.impress.co.jp/docs/series/cew/


(大原雄介 )
2012年 9月 5日