(57)【要約】【課題】故障診断に必要な記憶容量を削減しつつ、演算機能の診断を実施できる。【解決手段】ＣＰＵ１０１は、演算機能を有する。ＣＰＵ１０１は、第１の値を生成する。ＣＰＵ１０１は、第１の値に対して、算術演算命令で実行される検査対象の演算の逆演算を行い、逆演算の結果である第２の値を生成する。ＣＰＵ１０１は、検査対象の演算を実行する演算機能を用いて、第２の値に対して前記検査対象の演算を実行し、演算の結果である第３の値を生成する。ＣＰＵ１０１は、第１の値と第３の値を比較し、比較の結果に基づいて演算機能が正常に動作しているか否かを判定する。【選択図】図１
2020149425.tif 000002
【特許請求の範囲】
【請求項１】
演算機能を有するプロセッサと、
メモリとを有し、
前記プロセッサは、前記メモリからプログラムを読み出して実行することにより、
第１の値を生成し、
前記第１の値に対して、算術演算命令で実行される検査対象の演算の逆演算を行い、該逆演算の結果である第２の値を生成し、
前記検査対象の演算を実行する演算機能を用いて、前記第２の値に対して前記検査対象の演算を実行し、該演算の結果である第３の値を生成し、
前記第１の値と前記第３の値を比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定する半導体装置。
【請求項２】
前記プロセッサは、前記第２の値をオペランドとして、前記検査対象の演算を実行する算術演算命令を実行し、前記第３の値を生成する請求項１に記載の半導体装置。
【請求項３】
前記検査対象の演算は、前記プロセッサのハードウェア命令として実装される初等関数であり、前記逆演算は、前記初等関数の逆関数である請求項１に記載の半導体装置。
【請求項４】
前記プロセッサは、前記第１の値と前記第３の値を比較との比較では、前記第１の値と前記第３の値との差の絶対値と、数値演算に起因して発生する誤差とを比較し、前記絶対値が前記誤差以下の場合、前記演算機能が正常に動作していると判定する請求項１に記載の半導体装置。
【請求項５】
前記プロセッサは、ソフトウェア処理により、前記逆演算を実行する請求項１に記載の半導体装置。
【請求項６】
前記プロセッサは、四則演算命令を用いて、前記逆演算及び前記検査対象の演算を実行する請求項１に記載の半導体装置。
【請求項７】
前記プロセッサは、更に第４の値を生成し、
前記プロセッサは、前記逆演算では、加算命令及び減算命令の一方を用いて前記第１の値と第４の値との和又は差を演算し、
前記プロセッサは、前記検査対象の演算では、加算命令及び減算命令の他方を用いて前記第１の値と第４の値との和又は差と、前記第４の値との差又は和を演算する請求項６に記載の半導体装置。
【請求項８】
前記プロセッサは、更に第４の値を生成し、
前記プロセッサは、前記逆演算では、乗算命令及び除算命令の一方を用いて前記第１の値と第４の値との積又は商を演算し、
前記プロセッサは、前記検査対象の演算では、加算命令及び減算命令の他方を用いて前記第１の値と第４の値との積又は商と、前記第４の値との商又は積を演算する請求項６に記載の半導体装置。
【請求項９】
前記プロセッサは、更に、
前記第１の値の生成に使用した演算命令及び／又は演算回路とは異なる演算命令／及び又は演算回路を使用して第５の値を生成し、
前記第１の値と前記第５の値を比較して、前記第１の値の正当性を検証する請求項１に記載の半導体装置。
【請求項１０】
前記プロセッサは、
前記第１の値の生成では、最小値と最大値との間の範囲を、第１の演算を用いて、所定の分割数で均等に分割することによって前記第１の値を生成し、
前記第５の値の生成では、前記最小値と前記最大値との間の範囲を、前記第１の演算とは異なる第２の演算を用いて前記所定の分割数で均等に分割することによって前記第５の値を生成する請求項９に記載の半導体装置。
【請求項１１】
数値演算ユニットを更に有し、
前記プロセッサは、前記第１の値の生成では、該プロセッサ内部の演算命令及び／又は演算回路を用いて前記第１の値を生成し、前記第５の値の生成では、前記数値演算ユニットに前記第５の値を生成させる請求項９に記載の半導体装置。
【請求項１２】
前記プロセッサは、固定小数点型の演算で前記第１の値を生成し、前記数値演算ユニットは、浮動小数点型の演算で前記第５の値を生成する請求項１１に記載の半導体装置。
【請求項１３】
前記プロセッサは、前記第１の値の生成では、該プロセッサ内部の演算命令及び／又は演算回路を用いて前記第１の値を生成し、前記第５の値の生成では、外部のプロセッサに前記第５の値を生成させる請求項９に記載の半導体装置。
【請求項１４】
前記プロセッサは、更に、それぞれが１以上の演算命令により実行され、相互に等しい演算結果が得られる２つの演算を用いて第６の値及び第７の値を生成し、
前記プロセッサは、前記第１の値の生成では、前記第６の値に対して所定の演算を行うことにより前記第１の値を生成し、前記第５の値の生成では、前記第７の値に対して前記所定の演算を行うことにより前記第５の値を生成する請求項９に記載の半導体装置。
【請求項１５】
前記プロセッサは、更に、前記第１の値を他の半導体装置に送信し、かつ該他の半導体装置から、前記第１の値に対する前記逆演算の結果に対して前記検査対象の演算を実行した結果を受信し、
前記プロセッサは、更に、前記第３の値と前記他の半導体装置から受信した検査対象の演算の実行結果とを比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定する請求項１に記載の半導体装置。
【請求項１６】
前記プロセッサは、更に、前記第１の値、及び前記第２の値を他の半導体装置に送信し、かつ該他の半導体装置から、前記第１の値に対する前記逆演算の結果、及び前記第２の値に対して前記検査対象の演算を実行した結果を受信し、
前記プロセッサは、前記第３の値の生成では、前記第２の値に代えて、前記他の半導体装置から受信した前記第１の値に対する前記逆演算の結果に対して検査対象の演算を実行することによって前記第３の値を生成し、
前記プロセッサは、更に、前記第３の値と前記他の半導体装置から受信した検査対象の演算の実行結果とを比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定する請求項１に記載の半導体装置。
【請求項１７】
第１の値を生成し、
前記第１の値に対して、算術演算命令で実行される検査対象の演算の逆演算を行い、該逆演算の結果である第２の値を生成し、
前記検査対象の演算を実行する演算機能を用いて、前記第２の値に対して前記検査対象の演算を実行し、該演算の結果である第３の値を生成し、
前記第１の値と前記第３の値を比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定する演算機能診断方法。
【請求項１８】
第１の値を生成し、
前記第１の値に対して、算術演算命令で実行される検査対象の演算の逆演算を行い、該逆演算の結果である第２の値を生成し、
前記検査対象の演算を実行する演算機能を用いて、前記第２の値に対して前記検査対象の演算を実行し、該演算の結果である第３の値を生成し、
前記第１の値と前記第３の値を比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定するための処理をプロセッサに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体装置、演算機能診断方法、及びプログラムに関し、例えばプロセッサを有する半導体装置、及び半導体装置における演算機能診断方法、及びプログラムに関する。
【背景技術】
【０００２】
産業機器や自動車製品の機能安全対応の機器は、マイコンを搭載する。これらの機器に搭載されるマイコンは、一般に、ＣＰＵ（Central Processing Unit）、内蔵メモリ、及び周辺モジュールを含む。機能安全対応の機器は、マイコン内の各部において発生する故障を検出する。特に、ＣＰＵは、マイコン内において主要な演算や制御を行う。このため、ＣＰＵの診断は最も重要である。
【０００３】
関連技術として、特許文献１は、異常検出装置を開示する。異常検出装置は、複数の演算手段を有する中央処理装置の異常検出に用いられる。特許文献１に記載の異常検出装置において、演算命令入力手段は、演算手段に演算命令を入力する。演算結果記憶手段は、演算命令入力手段により演算手段に入力される演算命令の正しい演算結果をあらかじめ記憶する。演算結果比較手段は、演算手段の演算結果と、演算結果記憶手段が記憶する正しい演算結果とを比較する。異常検出手段は、演算結果比較手段による比較の結果に基づいて中央処理装置の異常を検出する。
【０００４】
特許文献１は、更に、演算命令入力手段により、演算結果が同一となる演算命令を複数の演算手段に入力することを開示する。その場合、演算結果比較手段は、演算命令入力手段により入力された演算命令を複数の演算手段が演算した演算結果を比較する。例えば、演算命令入力手段は、「３」を５回加算する演算命令と、「３」に「５」を乗算する演算命令とを、演算手段に入力する。演算結果比較手段は、異なる演算命令で演算された演算結果を相互に比較し、比較の結果に基づいて、中央処理装置の異常を検出する。
【０００５】
別の関連技術として、特許文献２は、故障診断装置を開示する。特許文献２に記載の故障診断装置は、あらかじめ設定した演算処理を実行する複数の信号処理系が正常に動作しているか否かを診断する。特許文献２において、第１の信号処理系の演算実行部は、入力データを基に演算処理を実行して出力データを生成する。通信部は、演算実行部によって生成された出力データを第２の信号処理系に送信する。第２の信号処理系の逆演算実行部は、第１の信号処理系から受信した出力データに対し、第１の信号処理系での演算処理に対応した逆演算処理を実行して検算データを生成する。照合部は、第１の信号処理系の演算実行部が用いた入力データと、第２の信号処理系の逆演実行部により生成された検算データとを照合する。照合部は、データの一致に応じて第１の信号処理系の正常動作を判断し、データの不一致に応じて第１の信号処理系の故障を判断する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−３１４５９号公報
【特許文献２】特開２００３−１６７７５５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、特許文献１は、演算手段への入力データと、演算命令の正しい演算結果との組を記憶手段に記憶する必要がある。このため、特許文献１は、入力データを増やすほど、記憶手段の記憶領域を圧迫するという問題を持つ。一方、特許文献２は、複数の信号処理系が共通の原因によって同時に誤るような障害にも対応できることを目的とする。特許文献２は、複数の信号処理系を連携させる必要がある。このため、特許文献２は、単一の信号処理系を持つ用途には適用できない。
【０００８】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００９】
一実施の形態によれば、半導体装置は、プロセッサとメモリとを有する。プロセッサは、第１の値に対して、検査対象の演算の逆演算を行い、その結果である第２の値を生成する。その後、プロセッサは、第２の値に対して検査対象の演算を実行し、その結果である第３の値を生成する。プロセッサは、第１の値と第３の値を比較し、その結果に基づいて演算機能が正常に動作しているか否かを判定する。
【発明の効果】
【００１０】
前記一実施の形態によれば、故障診断に必要な記憶容量を削減しつつ、演算機能の診断を実施できる。
【図面の簡単な説明】
【００１１】
【図１】本開示の実施形態１に係る半導体装置の物理構成を示すブロック図。
【図２】半導体装置の論理構成を示すブロック図。
【図３】ＣＰＵ故障診断の手順を示すフローチャート。
【図４】初等関数として平方根演算が選択された場合の概要動作を示すフローチャート。
【図５】診断対象の演算が平方根演算である場合の動作概要を示すグラフ。
【図６】診断対象の演算がＣＯＳ関数である場合の動作概要を示すグラフ。
【図７】余弦逆関数の浮動小数点型での演算実装例を示すグラフ。
【図８】浮動小数点型での動作例を示すフローチャート。
【図９】余弦逆関数の固定小数点型での演算実装例を示すグラフ。
【図１０】固定小数点型での動作例を示すフローチャート。
【図１１】実施形態３に係るＣＰＵ診断システムを示すブロック図。
【図１２】実施形態３において平方根演算命令が実行される場合の動作例を示すフローチャート。
【図１３】実施形態３において余弦演算命令が実行される場合の動作例を示すフローチャート
【図１４】実施形態４において平方根演算命令が実行される場合の動作例を示すフローチャート。
【図１５】実施形態４において余弦演算命令が実行される場合の動作例を示すフローチャート。
【図１６】実施形態５におけるＣＰＵ故障診断の一例を示すフローチャート。
【図１７】本実施形態５におけるＣＰＵ故障診断の別の例を示すフローチャート。
【図１８】本実施形態６におけるＣＰＵ故障診断の手順を示す。
【図１９】異なる演算器が使用される場合の入力値の生成及び診断の手順を示すフローチャート。
【図２０】異なる演算命令が使用される場合の入力値の生成及び診断の手順を示すフローチャート。
【図２１】均等分割入力方式における入力値と演算結果とを示すグラフ。
【発明を実施するための形態】
【００１２】
実施の形態の説明に先立って、下記の実施の形態を想到するに至った経緯が説明される。ＣＰＵ診断は、診断用の特定の命令を実行し、実行結果と期待値とを比較する。ＣＰＵ診断は、命令の実行結果と期待値とが一致しない場合、ＣＰＵ故障と判断する。以下では、初等関数の命令を診断する場合の代表例として、平方根命令によるＣＰＵ診断が説明される。
【００１３】
まず、テーブル方式が説明される。テーブル方式において、メモリは、平方根命令のオペランドとなる入力値と、演算結果の期待値とをデータテーブルとして記憶する。ＣＰＵは、入力値をオペランドとして平方根命令を実行する。ＣＰＵは、平方根命令の実行結果と期待値とを比較することにより、演算機能の故障を判定する。ＣＰＵは、実行結果と期待値とが一致しない場合、故障と判定する。
【００１４】
上記テーブル方式の場合、ＣＰＵは、実行結果と、データテーブルの期待値とを１対１で比較する。このため、故障検出精度は高い。故障検出精度に、丸め誤差又は打ち切り誤差はない。テーブル方式は、データテーブルの作成の際に、別途、演算回路のシミュレーション結果を考慮して入力値を選択できる。このため、故障検出範囲は広い。しかしながら、テーブル方式は、入力値と期待値とを格納するメモリが必要となる。
【００１５】
次いで、結果蓄積方式が説明される。結果蓄積方式において、ＣＰＵは、複数の演算結果を、算術演算（例えば剰余演算）、又は論理演算（排他的論理和、若しくはビットシフトなど）により蓄積する。メモリは、上記テーブル方式の場合と同様に、入力値と演算結果の期待値とをデータテーブルとして記憶する。ただし、期待値は、複数の演算結果を、算術演算又は論理演算により蓄積した値である。ＣＰＵは、複数回の演算命令の実行後、結果と期待値とを比較することにより、演算機能の故障を判定する。
【００１６】
上記結果蓄積方式の場合、複数回の演算結果を蓄積する過程で、故障検出に必要な情報が消える場合がある。例えば、排他的論理和による結果蓄積の場合、同じビットに対応する演算結果で２度同じ異常が発生される場合、蓄積した結果は正常動作と同じになる。その場合、ＣＰＵは故障を検出できない。このため、結果蓄積方式は、テーブル方式に比べて、故障検出精度は低下する場合がある。一方で、メモリは、複数回の演算命令に対して１つの期待値を記録する。このため、結果蓄積方式は、テーブル方式に比べて、データテーブルに必要なメモリ容量を削減できる。
【００１７】
次いで、均等分割入力方式が説明される。均等分割入力方式において、ＣＰＵは、平方根命令の定義域内で均等に分割した入力値をプログラムにより生成する。例えば、入力値の最小値をＸｍｉｎ、最大値をＸｍａｘとし、分割数をＮとする。その場合、ＣＰＵは、ｉを１≦ｉ≦Ｎを満たす整数値として、下記式により、ｉ番目の入力値Ｘｉを生成する。
Ｘｉ＝Ｘｍｉｎ＋（Ｘｍａｘ−Ｘｍｉｎ）×ｉ／Ｎ
均等分割入力方式において、メモリは、各入力値に対応する期待値を記憶する。ＣＰＵは、入力値を生成するたびに演算を実行する。ＣＰＵは、演算結果と期待値とを比較することにより、演算機能の故障を判定する。
【００１８】
上記均等分割入力方式の場合、入力値はＣＰＵが生成するため、メモリは、期待値を記憶する必要があるものの、入力値を記憶しなくてもよい。しかしながら、分割均等入力方式の場合、以下に説明するように、検査対象の演算内容（関数）に依存して、結果（出力）の分布に偏りが発生する場合がある。
【００１９】
図２１は、均等分割入力方式における入力値と演算結果とを示す。ＣＰＵは、例えばＸｍｉｎ＝０、Ｘｍａｘ＝１として、その差を１００分割して、入力値Ｘｉを生成する。その場合、図２１に示されるように、入力値Ｘｉが０に近い値の場合、入力値の変化Δｘに対して演算結果は急激に変化し、演算結果の変化量ΔｙはΔｙ＞＞Δｘとなる。これに対し、入力値Ｘｉが１に近い値の場合、入力値の変化Δｘに対して演算結果はあまり変化せず、演算結果の変化量ΔｙはΔｙ＜＜Δｘとなる。
【００２０】
上記のように、均等な入力値に対して演算結果の分布に偏りがある場合、入力値の範囲に応じて数値演算の近似が粗くなり、演算精度が低下する。また、近傍の演算結果となる場合、特定の範囲のみの回路が動作し、演算機能の回路における活性化範囲は限定される場合がある。このため、均等分割入力方式は、テーブル方式に比べて、故障検出精度及び故障検出範囲において劣る場合がある。本発明者は、故障検出精度などを低下させずに、必要なメモリ領域を削減可能な故障診断を検討した結果、下記の実施の形態を想到するに至った。
【００２１】
以下、図面を参照しつつ、上記課題を解決するための手段を適用した実施形態を詳細に説明する。説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、ＣＰＵ、メモリ、又はその他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、又はそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、何れかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００２２】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスク）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、及び半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（Random Access Memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の優先通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００２３】
以下の実施の形態においては便宜上その必要があるときは、複数のセクション又は実施の形態に分割して説明するが、特に明示した場合を除き、それらはお互いに無関係なものではなく、一方は他方の一部又は全部の変形例、応用例、詳細説明、又は補足説明等の関係にある。また、以下の実施の形態において、要素の数等（個数、数値、量、範囲等を含む）に言及する場合、特に明示した場合および原理的に明らかに特定の数に限定される場合等を除き、その特定の数に限定されるものではなく、特定の数以上でも以下でもよい。
【００２４】
さらに、以下の実施の形態において、その構成要素（動作ステップ等も含む）は、特に明示した場合及び原理的に明らかに必須であると考えられる場合等を除き、必ずしも必須のものではない。同様に、以下の実施の形態において、構成要素等の形状、又は位置関係等に言及するときは、特に明示した場合および原理的に明らかにそうでないと考えられる場合等を除き、実質的にその形状等に近似または類似するもの等を含むものとする。このことは、上記数等（個数、数値、量、範囲等を含む）についても同様である。
【００２５】
［実施形態１］
図１は、本開示の実施形態１に係る半導体装置の物理構成を示す。半導体装置１００は、ＣＰＵ１０１、ＦＰＵ（Floating Point Unit）１０２、ＲＯＭ１０３、及びＲＡＭ１０４を有する。ＣＰＵ１０１は、数値演算、誤差計算、故障判定、及び復帰処理などを行う。ＦＰＵ１０２は、数値演算を行う数値演算ユニットである。ＦＰＵ１０２は、浮動小数点演算を行う処理装置であり、数値演算を行う。ＲＯＭ１０３は、ＣＰＵ１０１により実行されるプログラムなどを格納する。ＲＡＭ１０４は、プログラム実行時に、一時的に使用されるワークデータを格納する。半導体装置１００は、例えば、産業向け機能安全規格に準拠した機器に搭載される。
【００２６】
図２は、半導体装置１００の論理構成を示す。半導体装置１００は、数値演算命令実行２０１、ＣＰＵ診断ソフトウェア２０２、数値演算ライブラリ２０３、及び安全アプリケーション２０４を論理的に含む。数値演算命令実行２０１は、ハードウェアにより構成される。数値演算命令実行２０１は、ＣＰＵ１０１及びＦＰＵ１０２において数値演算命令を実行する部分に対応する。ここで、数値演算命令は、例えば積和などの四則演算命令、及び平方根や余弦などの初等関数命令を含む。
【００２７】
ＣＰＵ診断ソフトウェア２０２及び数値演算ライブラリ２０３は、ミドルウェアとして構成される。ＣＰＵ診断ソフトウェア２０２は、ＣＰＵ１０１の演算機能が正常に動作するか否かを診断するプログラムである。数値演算ライブラリ２０３は、初等関数演算をソフトウェアで実行するためのライブラリである。安全アプリケーション２０４は、ユーザ固有の機能安全処理を実行するアプリケーションである。
【００２８】
ＲＯＭ１０３は、ＣＰＵ診断ソフトウェア２０２、数値演算ライブラリ２０３、及び安全アプリケーション２０４を格納する。ＣＰＵ１０１は、ＲＯＭ１０３から読み出したプログラムに従って動作し、ユーザ処理やＣＰＵ１０１の故障診断を実施する。なお、ＦＰＵ１０２は０必須ではなく、半導体装置１００はＦＰＵ１０２を有していなくてもよい。
【００２９】
ここで、本実施形態において、ＣＰＵの故障診断の対象は、算術演算回路、及びレジスタであるとする。算術演算回路は、算術演算命令を実行する回路である。レジスタは、演算途中のデータや符号などを格納する。ＣＰＵ１０１は、算術演算命令以外の命令を実行する回路、及び、他のＣＰＵの故障診断の対象となる回路を有していてもよい。具体的には、ＣＰＵ１０１は、プログラムカウンタ、スタックポインタ、割り込みコントローラ、プログラムを格納する内蔵ＲＯＭ、及びワークデータを格納する内蔵ＲＡＭなどを有していてもよい。
【００３０】
［ＣＰＵ故障診断］
図３は、ＣＰＵ故障診断の手順（演算機能診断方法）を示す。図３を参照して、数値演算回路の診断として、初等関数の命令が実行され診断される例を説明する。初等関数は、
標準の数値演算ライブラリ、及び／又はＣＰＵ１０１のハードウェア命令として実装される。以下において、故障診断の対象となる演算は、入力値をｘとしてｆ（ｘ）で表される。ＣＰＵ１０１は、入力値ｘを生成する（ステップＳ１０１）。ＣＰＵ１０１は、ステップＳ１０１では、例えば、所定の入力値の範囲を均等に分割した入力値を順次に生成する。ＣＰＵ１０１は、ｆ（ｘ）の逆演算を実行する（ステップＳ１０２）。ＣＰＵ１０１は、ステップＳ１０２では、ｇ（ｘ）＝ｆ−１（ｘ）を実施する。
【００３１】
ＣＰＵ１０１は、ステップＳ１０２で計算したｇ（ｘ）を入力値として、故障診断の対象となる演算を実施する（ステップＳ１０３）。ＣＰＵ１０１は、ステップＳ１０３では、ｆ（ｇ（ｘ））を実施する。ここで、逆演算ｇ（ｘ）は、ｆ（ｇ（ｘ））の値とｘの値とが解析的に同じ値になる演算として定義される。ｘ’＝ｆ（ｇ（ｘ））の演算が正常に実施された場合、ｘ’＝ｘとなる。例えば、ＣＰＵ１０１は、ステップＳ１０２では、ｇ（ｘ）の値をオペランドとしてｆ（ｘ）を実行する算術命令を実行することで、ｆ（ｇ（ｘ））を実施する。
【００３２】
ＣＰＵ１０１は、ステップＳ１０１で生成した入力値ｘと、ステップＳ１０３で実施したｆ（ｇ（ｘ））の演算結果とが一致するか否かを判断する（ステップＳ１０４）。ＣＰＵ１０１は、入力値ｘとｆ（ｇ（ｘ））の演算結果とを比較し、差（絶対値）が誤差範囲以内であるか否かを判断する。より詳細には、ＣＰＵ１０１は、ステップＳ１０４では、誤差をεとして、｜ｘ’−ｘ｜≦εが満たされるか否かを判断する。
【００３３】
ＣＰＵ１０１は、ステップＳ１０４で｜ｘ’−ｘ｜≦εが満たされると判断した場合、ＣＰＵ１０１の数値演算回路（演算機能）は故障していないと判断する（ステップＳ１０５）。ＣＰＵ１０１は、｜ｘ’−ｘ｜＞εである場合は、ＣＰＵの数値演算回路は故障していると判断する（ステップＳ１０６）。ＣＰＵ１０１は、所定の入力値の範囲で、ステップＳ１０１からステップＳ１０４を繰り返し実施し、数値演算回路の機能を診断する。
【００３４】
［演算例１］
図４は、初等関数として平方根演算が選択された場合の概要動作を示す。図４において、演算命令１５２は、図２の数値演算命令実行２０１で実行される演算命令を表す。また、パラメータ１５１は、図３のステップＳ１０２において逆演算を実行する際に使用されるパラメータである。誤差１５３は、ステップＳ１０４において比較される誤差である。パラメータ１５１と誤差１５３は、図２の数値演算ライブラリ２０３とＣＰＵ診断ソフトウェア２０２にそれぞれ含まれる。
【００３５】
ＣＰＵ１０１は、ステップＳ１０１では、入力値ｘｉを、下記式を用いて生成する。
ｘｉ＝ｘｍｉｎ＋（ｘｍａｘ−ｘｍｉｎ）×ｉ／Ｎ
ここで、Ｎは分割数を示し、ｉは０以上Ｎ以下の整数を表す。ｘｍｉｎは入力値の最小値を表し、ｘｍａｘは入力値の最大値を表す。ＣＰＵ１０１は、ｉの初期値を０として、ｉの値を１つずつ増加させながら、ステップＳ１０１において、入力値ｘｉを順次に生成する。ここでは、ＣＰＵ１０１は、ステップＳ１０１においてｘ２＝０．０２を生成したとする。なお、平方根の定義域はｘ≧０である。しかしながら、簡略化と数値計算固有の演算範囲を縮小する還元により、定義域が０≦ｘ≦１であるとして説明する。
【００３６】
ＣＰＵ１０１は、ステップＳ１０２では、ソフトウェア処理により、入力値ｘ２に対してｆ（ｘ）の逆演算ｇ（ｘ）を実行し、変数ａｎｓ１に実行結果を代入する。一般に、逆演算ｇは、関数近似で実装される。診断対象の演算が平方根演算である場合、逆演算はｘ×ｘで計算できる。このため、この例においては、逆演算は厳密な関数により実装できる。また、ＣＰＵ１０１は、ステップＳ１０２においてパラメータ１５１を参照せずに逆演算を実施できる。逆演算が関数近似で実装される場合、ＣＰＵ１０１は、パラメータ１５１から入力値ｘｉに対応した係数又は定数ａｉ及びｂｉを取得し、逆演算を実行する。ＣＰＵ１０１は、ステップＳ１０２において、変数ａｎｓ１に、０．０２×０．０２の演算結果を代入する。
【００３７】
ＣＰＵ１０１は、ステップＳ１０３では、ａｎｓ１に対して演算命令１５２に含まれる平方根演算ＳＱＲＴを実行した結果を、変数ａｎｓ２に代入する。この演算は、関数近似で実装される。演算結果は、アルゴリズムによる誤差、打切り誤差、及び丸め誤差を含み得る。ＣＰＵ１０１は、ステップＳ１０４では、ａｎｓ２と、ｘｉ±εｉとを比較する。ＣＰＵ１０１は、ａｎｓ２とｘ２とが、誤差ε２の範囲内で一致していない場合、図３のステップＳ１０６において故障があると判断する。ＣＰＵ１０１は、ａｎｓ２とｘ２とが、誤差ε２の範囲内で一致している場合、図３のステップＳ１０５において故障はないと判断する。
【００３８】
図５は、診断対象の演算が平方根演算である場合の動作概要をグラフにより示す。図５において、横軸ｘは入力値を表し、縦軸ｙは演算結果を表す。また、グラフＡはｙ＝ｘ１／２を表し、グラフＢはｙ＝ｘ２を表す。ＣＰＵ１０１は、ステップＳ１０２では、入力値ｘｉに対してｙ＝ｆ−１（ｘｉ）＝ｘｉ２を計算する。次いで、ＣＰＵ１０１は、ステップＳ１０３では、ｙ＝ｆ（ｆ−１（ｘｉ））＝（ｘｉ２）１／２を計算する。その後、ＣＰＵ１０１は、ｘｉ±εｉと、ｆ（ｆ−１（ｘｉ））の演算結果と比較する。ＣＰＵ１０１は、両者が一致する場合、故障はないと判断する。
【００３９】
［演算例２］
続いて、演算例２が説明される。演算例２は、余弦演算の診断を行う例である。図６は、診断対象の演算がＣＯＳ関数である場合の動作概要をグラフにより示す。図６において、横軸ｘは入力値を表し、縦軸ｙは演算結果を表す。また、グラフＡはｙ＝ｃｏｓ（ｘ）を表し、グラフＢはｙ＝ａｒｃｃｏｓ（ｘ）を表す。なお、ｙ＝ａｒｃｃｏｓ（ｘ）は多価関数であるが、定義域はｃｏｓ（ｘ）における０≦ｘ≦πに対応した−１≦ｘ≦１として説明する。
【００４０】
ＣＰＵ１０１は、ステップＳ１０１では、ｘｍｉｎ＝−１、ｘｍａｘ＝１、Ｎ＝１００、ｉ＝０，１，２、・・・，Ｎとして、入力値ｘｉを生成する。ＣＰＵ１０１は、ステップＳ１０２では、ｙ＝ｆ−１（ｘｉ）＝ａｒｃｘｏｓ（ｘｉ）を計算する。次いで、ＣＰＵ１０１は、ステップＳ１０３では、ｙ＝ｆ（ｆ−１（ｘｉ））＝ｃｏｓ（ａｒｃｃｏｓ（ｘｉ））を計算する。その後、ＣＰＵ１０１は、ステップＳ１０４では、ｘｉ±εｉと、ｆ（ｆ−１（ｘｉ））の演算結果と比較する。ＣＰＵ１０１は、両者が一致する場合、故障はないと判断する。
【００４１】
［まとめ］
本実施形態では、ＣＰＵ１０１は、前述の均等分割入力方式と同様に、入力値を生成する。ＣＰＵ１０１は、入力値に対して、診断対象の演算の逆演算を実施し、逆演算の演算結果に対して診断対象の演算を実施する。ＣＰＵ１０１は、入力値と診断対象の演算の演算結果とを比較し、比較結果に基づいて、演算機能が正常に動作しているか否かを判定する。本実施形態では、生成した入力値と演算結果とが比較される。このため、半導体装置１００は、演算結果の期待値をメモリに保持する必要がない。従って、本実施形態は、ＣＰＵ１０１の診断に必要なメモリ容量を削減することができる。また、本実施形態において、診断対象の演算結果の分布は偏らない。このため、本実施形態は、均等分割方式の場合に比べて、故障検出精度及び故障検出範囲を向上できる場合がある。
【００４２】
［実施形態２］
次いで、実施形態２を説明する。本実施形態に係る半導体装置の構成は、図１に示される実施形態１に係る半導体装置１００の構成と同様である。本実施形態は、ＣＰＵ１０１が余弦演算命令を実行し、浮動小数点型と固定小数点型（整数型）により診断を行う例を説明する。余弦の逆関数の仕様は、下記式１とする。なお、平方根の場合、逆関数はｙ＝ｘ２であり、逆関数の演算実装は不要である。
ｙ＝ａｒｃｃｏｓ（ｘ），−１≦ｘ≦１    （式１）
【００４３】
一般に、浮動小数点表現は指数を使用した表現であり、整数による固定小数点演算に比較して、オーバフローやアンダフローが発生する可能性は低い。一方で、浮動小数点表現は、仮数部のビット数が少なくなり、丸め誤差が大きくなる可能性がある。また、浮動小数点では、６４ビット（仮数部５２ビット）の倍精度演算がＣ９９の標準関数として定義されており、演算の実装が固定小数点に比較して容易である。
【００４４】
［浮動小数点型］
図７は、余弦逆関数の演算実装例を示す。本例において、余弦逆関数は、線形近似により近似された関数として表される。余弦逆関数の数値計算は、単精度浮動小数点（ｆｌｏａｔ）型により実施される。演算実装において、定義域は［−１，１］と定義され、その定義域は２５６分割される。２５６分割された各区間において、余弦逆関数ａｒｃｃｏｓ（ｘ）はａｒｃｃｏｓ（ｘ）＝ａｎ×ｘ＋ｂｎにより線形近似される。線形近似の係数ａｎ及び定数ｂｎは、それぞれ係数テーブル及び定数テーブルとして保持される。余弦逆演算では、係数テーブル及び定数テーブルから係数ａｎ及び定数ｂｎがそれぞれ取得され、入力値ｘに対する余弦逆演算が実施される。
【００４５】
図８は、浮動小数点型での動作例を示す。ＣＰＵ１０１は、入力値ｘを生成する（ステップＳ２０１）。入力値ｘは、図７において［−１，１］を均等に２５６分割した区間の１区間に相当するとする。具体的には、ＣＰＵは、ｎの初期値を０とし、Ｎ＝２５６として、ｘ＝−１＋２×ｎ／Ｎにより、入力値ｘの値を生成する。ＣＰＵ１０１は、入力値ｘを、整数型（固定小数点型）からｆｌａｏｔ型へ型変換する（ステップＳ２０２）。
【００４６】
ＣＰＵ１０１は、入力値ｘがどの区間にあるかを判定する（ステップＳ２０３）。ＣＰＵ１０１は、ステップＳ２０３では、ｎの値に基づいて、入力値ｘの区間を判定する。ＣＰＵ１０１は、係数テーブルから係数ａｎをロードする（ステップＳ２０４）。また、ＣＰＵ１０１は、定数テーブルから定数ｂｎをリードする（ステップＳ２０５）。ＣＰＵ１０１は、ロードした係数ａｎ及びｂｎを使用し、単精度浮動小数点（ｆｌｏａｔ）型で積和演算する（ステップＳ２０６）。具体的には、ＣＰＵ１０１は、ｆｌｏａｔ型の変数ａｎｓ１に、ａｎ×ｘ＋ｂｎの演算結果を代入する。
【００４７】
ＣＰＵ１０１は、ステップＳ２０６の演算結果を入力のオペランドとして、ｆｌｏａｔ型の余弦演算命令を実行する（ステップＳ２０７）。ＣＰＵ１０１は、ステップＳ２０７では、ｆｌｏａｔ型の変数ａｎｓ２に、ｃｏｓ（ａｎｓ１）の演算結果を代入する。ここで、ｆｌｏａｔ型の余弦演算命令はＦＣＯＳで表されるとする。
【００４８】
ＣＰＵ１０１は、ステップＳ２０７の演算結果と、入力値ｘとを比較し、比較結果に基づいて、故障があるか否かを判定する（ステップＳ２０８）。ＣＰＵ１０１は、ステップＳ２０８では、｜ａｎｓ２−ｘ｜が誤差εを超えている場合、故障を検出し、エラー終了する。誤差εは、数値演算による誤差を示し、ステップＳ２０２、Ｓ２０６、及びＳ２０７の数値演算により発生し得る誤差の最大値であるとする。
【００４９】
ＣＰＵ１０１は、故障を検出しない場合、全区間の演算が終了したか否かを判断する（ステップＳ２０９）。ＣＰＵ１０１は、ｎ＞２５５が満たされる場合、全区間の演算が終了したと判断する。その場合、ＣＰＵ１０１は、故障が検出されないとして、処理を正常終了する。全区間の演算が終了していない場合、ＣＰＵ１０１は、カウンタを更新し、ｎの値を１つ増加させる（ステップＳ２１０）。ＣＰＵ１０１は、ｎの値の更新後、ステップＳ２０１に戻り、更新したｎの値を用いて、入力値ｘを生成する。
【００５０】
［固定小数点型（整数型）］
図９は、余弦逆関数の演算の別の実装例を示す。本例において、余弦逆関数は、多項式により近似された関数として表される。余弦逆関数の数値計算は、固定小数点型（整数型）により実施される。演算実装において、定義域は［−１，１］と定義され、その定義域において余弦逆関数ａｒｃｃｏｓ（ｘ）は５次多項式により近似される。近似された余弦逆関数ａｒｃｃｏｓ（ｘ）は、ａｒｃｃｏｓ（ｘ）＝ｃ０ｘ５＋ｃ１ｘ４＋ｃ２ｘ３＋ｃ３ｘ２＋ｃ４ｘ＋ｃ５により表される。各係数は、例えば最良多項式近似により求められる。
【００５１】
図１０は、固定小数点型での動作例を示す。ＣＰＵ１０１は、入力値ｘを生成する（ステップＳ３０１）。入力値ｘは、図９において［−１，１］を均等に２５６分割した区間の１区間に相当するとする。具体的には、ＣＰＵは、ｎの初期値を０とし、Ｎ＝２５６として、ｘ＝−１＋２×ｎ／Ｎにより、入力値ｘの値を生成する。
【００５２】
ＣＰＵ１０１は、例えば３２ビットの固定小数点（ｌｏｎｇ）型で、５次の多項式近似した式を積和演算することにより、ａｒｃｃｏｓ（ｘ）を演算する（ステップＳ３０２）。ＣＰＵ１０１は、ステップＳ３０２では、ｌｏｎｇ型の変数ａｎｓ１に、ｃ０ｘ５＋ｃ１ｘ４＋ｃ２ｘ３＋ｃ３ｘ２＋ｃ４ｘ＋ｃ５の演算結果を代入する。ＣＰＵ１０１は、ステップＳ３０２の演算結果を、整数型からｆｌｏａｔ型へ型変換する（ステップＳ３０３）。
【００５３】
ＣＰＵ１０１は、ステップＳ３０３で型変換された変数ａｎｓ１を入力のオペランドとして、ｆｌｏａｔ型の余弦演算命令を実行する（ステップＳ３０４）。ＣＰＵ１０１は、ステップＳ３０４では、ｆｌｏａｔ型の変数ａｎｓ２に、ｃｏｓ（ａｎｓ１）の演算結果を代入する。ＣＰＵ１０１は、ステップＳ３０４の演算結果をｆｌｏａｔ型から整数型へ型変換する（ステップＳ３０５）。
【００５４】
ＣＰＵ１０１は、ステップＳ３０５で型変換された余弦演算の演算結果と、入力値ｘとを比較し、比較結果に基づいて、故障があるか否かを判定する（ステップＳ３０６）。ＣＰＵ１０１は、ステップＳ３０６では、｜ａｎｓ２−ｘ｜が誤差εを超えている場合、故障を検出し、エラー終了する。誤差εは、数値演算による誤差を示し、ステップＳ３０２、Ｓ３０５、Ｓ３０４、及びＳ３０５の数値演算により発生し得る誤差の最大値であるとする。
【００５５】
ＣＰＵ１０１は、故障を検出しない場合、全区間の演算が終了したか否かを判断する（ステップＳ３０７）。ＣＰＵ１０１は、ｎ＞２５５が満たされる場合、全区間の演算が終了したと判断する。その場合、ＣＰＵ１０１は、故障が検出されないとして、処理を正常終了する。全区間の演算が終了していない場合、ＣＰＵ１０１は、カウンタを更新し、ｎの値を１つ増加させる（ステップＳ３０８）。ＣＰＵ１０１は、ｎの値の更新後、ステップＳ３０１に戻り、更新したｎの値を用いて、入力値ｘを生成する。
【００５６】
［まとめ］
本実施形態では、浮動小数点型又は固定小数点型（整数型）で初等関数の逆関数演算が実装される。ＣＰＵ１０１は、適切な型変換を実施することで、実施形態１と同様に、診断に必要なメモリ容量を削減しつつ、演算機能の診断を実施できる。
【００５７】
［実施形態３］
続いて、実施形態３を説明する。図１１は、実施形態３に係るＣＰＵ診断システムを示す。ＣＰＵ診断システム３００は、半導体装置１００Ａと半導体装置１００Ｂとを有する。半導体装置１００Ａは、ＣＰＵ１０１Ａ、ＦＰＵ１０２Ａ、ＲＯＭ１０３Ａ、ＲＡＭ１０４Ａ、割込み制御ニット（ＩＣＵ：Interrupt Controller Unit）１０５Ａ、及びシリアル周辺インタフェース（ＳＰＩ：Serial peripheral Interface）１０６Ａを有する。半導体装置１００Ｂは、ＣＰＵ１０１Ｂ、ＲＯＭ１０３Ｂ、ＲＡＭ１０４Ｂ、ＩＣＵ１０５Ｂ、及びＳＰＩ１０６Ｂを有する。
【００５８】
ＣＰＵ診断システム３００において、半導体装置１００Ａは、例えばメインマイコンとして構成される。半導体装置１００Ｂは、サブマイコンとして構成される。半導体装置１００Ａ（以下、メインマイコンとも呼ぶ）と半導体装置１００Ｂ（以下、サブマイコンとも呼ぶ）とは、例えば、クロック同期式のシリアル通信により相互通信する。ここで、マイコンを２個搭載する構成は、ＣＰＵ診断が必要な機能安全対応機器では一般的な構成である。メインマイコン１００Ａとサブマイコン１００Ｂとは、計算結果や計算途中のデータを互いに送受信し比較することで故障を検出する。本実施形態では、ＣＰＵ診断システム３００が２つのマイコンを含む例を説明する。ＣＰＵ診断システム３００に含まれるマイコンの数は２つには限定されない。ＣＰＵ診断システム３００は、３以上のマイコンを有し得る。
【００５９】
メインマイコン１００ＡのＣＰＵ１０１Ａは、ユーザアプリケーションを実行する。メインマイコン１００Ａにおいて、ＦＰＵ１０２Ａは、ユーザアプリケーションの処理において浮動小数点計算に用いられる。ユーザ処理において数値計算に浮動小数点が使用されるか、又は固定小数点が使用されるかは、ユーザ又はシステムに依存する。本実施形態では、ユーザ処理の数値計算において浮動小数点が使用されることを想定しており、メインマイコン１００ＡはＦＰＵ１０２Ａを有している。
【００６０】
ＣＰＵ１００Ａは、実施形態１又は実施形態２で説明したＣＰＵ故障診断を実行する。ＲＯＭ１０３Ａは、ユーザの安全アプリケーション２０４（図２を参照）、ＣＰＵ診断ソフトウェア２０２、及び数値演算ライブラリ２０３などを格納する。ＲＡＭ１０４Ａは、プログラム実行時に、一時的に使用されるワークデータを格納する。ＩＣＵ１０５Ａは、ポート経由での外部割込み要求をＣＰＵ１０１Ａに通知する。ＳＰＩ１０６Ａは、例えば、クロック同期式シリアルの全２重通信により、サブマイコン１００Ｂとの間でシリアル通信を行う。
【００６１】
一方、サブマイコン１００ＢのＣＰＵ１０１Ｂは、主にＣＰＵ故障診断を実行する。ＲＯＭ１０３Ｂは、ＣＰＵ診断ソフトウェア２０２、及び数値演算ライブラリ２０３を格納する。ＲＡＭ１０４Ｂは、プログラム実行時に、一時的に使用されるワークデータを格納する。ＩＣＵ１０５Ｂは、ポート経由での外部割込み要求をＣＰＵ１０１Ｂに通知する。ＳＰＩ１０６Ｂは、例えば、クロック同期式シリアルの全２重通信により、メインマイコン１００Ａとの間でシリアル通信を行う。
【００６２】
［動作例］
以下において、ＣＰＵ診断システムにおいて平方根演算命令及び余弦演算命令が実行され、メインマイコン１００Ａとサブマイコン１００Ｂとの間で相互診断が行われる場合の動作例が説明される。以下では、浮動小数点演算についてはコンパイラに組み込みの数学関数ライブラリ（ｍａｔｈ．ｈ）が数値演算ライブラリとして使用される例が説明される。また、固定小数点演算については、固定小数点ライブラリ（ｆｉｘｍａｔｈ．ｈ）が使用される例が説明される。本実施形態において、これらライブラリに代えて、実施形態２で説明した近似式などが用いられてもよい。また、以下では、浮動小数点型はｆｌｏａｔ型であるとするが、倍精度のｄｏｕｂｌｅ型などの他の型でもよい。
【００６３】
図１２は、ＣＰＵ診断システムにおいて平方根演算命令が実行される場合の動作例を示す。メインマイコン１００Ａのユーザアプリケーション（安全アプリケーション）は入力値ｘを生成し、ＣＰＵ診断ソフトウェアに対して浮動小数点の平方根演算を要求する。ＣＰＵ１０１Ａは、浮動小数点の平方根演算が要求されると、入力値ｘに対して平方根演算の逆演算を実行する（ステップＳ４０１）。ＣＰＵ１０１Ａは、ステップＳ４０１では、ｆｌｏａｔ型の変数ａｎｓ１１に、ｘ×ｘの演算結果を代入する。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、サブマイコン１００Ｂに、演算要求を送信する（ステップＳ４０２）。演算要求は、入力値ｘと、平方根演算を示す情報とを含む。
【００６４】
ＣＰＵ１０１Ａは、ステップＳ４０１の演算結果を入力（オペランド）として、ｆｌｏａｔ型の平方根演算命令を実行する（ステップＳ４０３）。ＣＰＵ１０１Ａは、ステップＳ４０３では、ｆｌｏａｔ型の変数ａｎｓ１２に、ｓｑｒｔ（ａｎｓ１１）の演算結果を代入する。ここで、ｆｌｏａｔ型の平方根演算命令をＦＳＱＲＴとする。
【００６５】
ＣＰＵ１０１Ａは、ステップＳ４０３の演算結果ａｎｓ１２と、入力値ｘとを比較する（ステップＳ４０４）。ＣＰＵ１０１Ａは、ステップＳ４０４では、演算結果ａｎｓ１２と入力値ｘとの差の絶対値が、数値演算による誤差ε１を超えているか否かを判断する。誤差ε１は、ステップＳ４０１及びＳ４０３の演算において発生し得る誤差の最大値であるとする。差の絶対値が誤差ε１を超えている場合、ＣＰＵ１０１Ａは故障を検出し、エラー終了する。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、ステップＳ４０３の演算結果ａｎｓ１２をサブマイコン１００Ｂに送信する（ステップＳ４０５）。
【００６６】
一方、サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して演算要求を受信する。ＣＰＵ１０１Ｂは、入力値ｘに対して平方根演算の逆演算を行う（ステップＳ５０１）。ＣＰＵ１０１Ｂは、ステップＳ５０１では、固定小数点ライブラリｆｉｘｍａｔｈ．ｈに含まれるＦＩＸ＿ｆｒｏｍｆｌｏａｔ（）を利用して、メインマイコン１００Ａから受信した入力値ｘを固定小数点型の入力値ｙに変換する。その後、ＣＰＵ１０１Ｂは、固定小数点型の変数ａｎｓ２１に、ｙ×ｙの演算結果を代入する。
【００６７】
ＣＰＵ１０１Ｂは、ステップＳ５０１の演算結果を入力として、固定小数点型の平方根演算命令を実行する（ステップＳ５０２）。ＣＰＵ１０１Ｂは、ステップＳ５０２では、固定小数点型の変数ａｎｓ２２に、ＦＩＸ＿ＳＱＲＴ（ａｎｓ２１）の演算結果を代入する。ここで、固定小数点型の平方根演算命令をＦＩＸ＿ＳＱＲＴとする。
【００６８】
ＣＰＵ１０１Ｂは、ステップＳ５０２の演算結果ａｎｓ２２と、ステップＳ５０１で型変換された入力値ｙとを比較する（ステップＳ５０３）。ＣＰＵ１０１Ｂは、ステップＳ５０３では、演算結果ａｎｓ２２と入力値ｙとの差の絶対値が、数値演算による誤差ε２を超えているか否かを判断する。誤差ε２は、ステップＳ５０１とステップＳ５０２の演算において発生し得る誤差の最大値であるとする。差の絶対値が誤差ε２を超えている場合、ＣＰＵ１０１Ｂは故障を検出し、エラー終了する。
【００６９】
ＣＰＵ１０１Ｂは、ステップＳ５０２の演算結果ａｎｓ２２をｆｌｏａｔ型に変換する（ステップＳ５０４）。ＣＰＵ１０１Ｂは、ステップＳ５０４では、固定小数点ライブラリｆｉｘｍａｔｈ．ｈに含まれるＦＩＸ＿ｔｏｆｌｏａｔ（）を利用して、固定小数点型のａｎｓ２２を、浮動小数点型のａｎｓ２２’に型変換する。ＣＰＵ１００Ｂは、ＳＰＩ１０６Ｂを通じて、ｆｌｏａｔ型に変換した演算結果ａｎｓ２２’をメインマイコン１００Ａに送信する（ステップＳ５０５）。
【００７０】
メインマイコン１００ＡのＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを介して、ステップＳ５０５でＣＰＵ１０１Ｂが送信した演算結果ａｎｓ２２’を受信する。ＣＰＵ１０１Ａは、ステップＳ４０３の演算結果ａｎｓ１２と、サブマイコン１００Ｂから受信した演算結果ａｎｓ２２’とを比較する（ステップＳ４０６）。ＣＰＵ１０１Ａは、ステップＳ４０６では、演算結果ａｎｓ１２と演算結果ａｎｓ２２’との差の絶対値が、数値演算による誤差ε３を超えているか否かを判断する。誤差ε３は、ステップＳ４０１、Ｓ５０１、Ｓ５０２、及びＳ５０４の演算等において発生し得る誤差の最大値であるとする。差の絶対値が誤差ε３を超えている場合、ＣＰＵ１０１Ａは故障を検出し、エラー終了する。
【００７１】
サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して、ステップＳ４０５でＣＰＵ１０１Ａが送信した演算結果ａｎｓ１２を受信する。ＣＰＵ１０１Ｂは、演算結果ａｎｓ１２を固定小数点型に型変換し、型変換した演算結果ａｎｓ１２と、ステップＳ５０２の演算結果ａｎｓ２２とを比較する（ステップＳ５０６）。ＣＰＵ１０１Ｂは、ステップＳ５０６では、固定小数点ライブラリに含まれるＦＩＸ＿ｆｒｏｍｆｌａｏｔ（）を利用して、固定小数点型の変数ｚに、演算結果ａｎｓ１２の値を代入する。ＣＰＵ１０１Ｂは、演算結果ａｎｓ２２と演算結果ａｎｓ１２（変数ｚ）との差の絶対値が、数値演算による誤差ε４を超えているか否かを判断する。誤差ε４は、ステップＳ４０１、Ｓ４０３、Ｓ５０１、Ｓ５０２、及びＳ５０６の演算等において発生し得る誤差の最大値であるとする。差の絶対値が誤差ε４を超えている場合、ＣＰＵ１０１Ｂは故障を検出し、エラー終了する。
【００７２】
図１３は、ＣＰＵ診断システムにおいて余弦演算命令が実行される場合の動作例を示す。メインマイコン１００Ａのユーザアプリケーションは入力値ｘを生成し、ＣＰＵ診断ソフトウェアに対して浮動小数点の余弦演算を要求する。ＣＰＵ１０１Ａは、浮動小数点の余弦演算が要求されると、入力値ｘに対して余弦演算の逆演算を実行する（ステップＳ６０１）。ＣＰＵ１０１Ａは、ステップＳ６０１では、数学関数ライブラリｍａｔｈ．ｈに含まれるａｃｏｓ（）を利用し、ｆｌｏａｔ型の変数ａｎｓ１１に、ａｃｏｓ（ｘ）の演算結果を代入する。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、サブマイコン１００Ｂに、演算要求を送信する（ステップＳ６０２）。演算要求は、入力値ｘと、余弦演算を示す情報とを含む。
【００７３】
ＣＰＵ１０１Ａは、ステップＳ６０１の演算結果を入力として、ｆｌｏａｔ型の余弦演算命令を実行する（ステップＳ６０３）。ＣＰＵ１０１Ａは、ステップＳ６０３では、ｆｌｏａｔ型の変数ａｎｓ１２に、ｃｏｓ（ａｎｓ１１）の演算結果を代入する。ここで、ｆｌｏａｔ型の余弦演算命令をＦＣＯＳとする。
【００７４】
ＣＰＵ１０１Ａは、ステップＳ６０３の演算結果ａｎｓ１２と、入力値ｘとを比較する（ステップＳ６０４）。ステップＳ６０４は、図１２のステップＳ４０４と同様でよい。ＣＰＵ１０１Ａは、演算結果ａｎｓ１２と入力値ｘとの差の絶対値が誤差ε１を超えている場合、故障を検出し、エラー終了する。
【００７５】
一方、サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して演算要求を受信する。ＣＰＵ１０１Ｂは、入力値ｘに対して余弦演算の逆演算を行う（ステップＳ７０１）。ＣＰＵ１０１Ｂは、ステップＳ７０１では、固定小数点ライブラリｆｉｘｍａｔｈ．ｈに含まれるＦＩＸ＿ｆｒｏｍｆｌｏａｔ（）及びＦＩＸ＿ａｃｏｓ（）を利用する。ＣＰＵ１０１Ｂは、ＦＩＸ＿ｆｒｏｍｆｌｏａｔ（）を利用して、メインマイコン１００Ａから受信した入力値ｘを固定小数点型の入力値ｙに変換する。その後、ＣＰＵ１０１Ｂは、固定小数点型の変数ａｎｓ２１に、ＦＩＸ＿ａｃｏｓ（ｙ）の演算結果を代入する。
【００７６】
ＣＰＵ１０１Ｂは、ステップＳ７０１の演算結果を入力として、固定小数点型の余弦演算命令を実行する（ステップＳ７０２）。ＣＰＵ１０１Ｂは、ステップＳ７０２では、固定小数点型の変数ａｎｓ２２に、ＦＩＸ＿ＣＯＳ（ａｎｓ２１）の演算結果を代入する。ここで、固定小数点型の余弦演算命令をＦＩＸ＿ＣＯＳとする。
【００７７】
ＣＰＵ１０１Ｂは、ステップＳ７０２の演算結果ａｎｓ２２と、ステップＳ７０１で型変換された入力値ｙとを比較する（ステップＳ７０３）。ステップＳ７０３は、図１２のステップＳ５０３と同様でよい。ＣＰＵ１０１Ｂは、演算結果ａｎｓ２２と入力値ｙとの差の絶対値が誤差ε２を超えている場合、故障を検出し、エラー終了する。
【００７８】
メインマイコン１００ＡのＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、ステップＳ６０３の演算結果ａｎｓ１２をサブマイコン１００Ｂに送信する（ステップＳ６０５）。ＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して、ＣＰＵ１０１Ａが送信した演算結果ａｎｓ１２を受信する。ＣＰＵ１０１Ｂは、演算結果ａｎｓ１２を固定小数点型に型変換し、型変換した演算結果ａｎｓ１２と、ステップＳ７０２の演算結果ａｎｓ２２とを比較する（ステップＳ７０６）。ステップＳ６０５及びＳ７０６は、図１２のステップＳ４０５及びＳ５０６と同様でよい。ＣＰＵ１０１Ｂは，演算結果ａｎｓ２２と演算結果ａｎｓ１２（変数ｚ）との差の絶対値が誤差ε４を超えている場合、故障を検出し、エラー終了する。
【００７９】
ＣＰＵ１０１Ｂは、ステップＳ７０２の演算結果ａｎｓ２２をｆｌｏａｔ型に変換する（ステップＳ７０４）。ＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを通じて、ｆｌｏａｔ型に変換した演算結果ａｎｓ２２’をメインマイコン１００Ａに送信する（ステップＳ７０５）。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを介して、ＣＰＵ１０１Ｂが送信した演算結果ａｎｓ２２’を受信する。ＣＰＵ１０１Ａは、ステップＳ６０３の演算結果ａｎｓ１２と、サブマイコン１００Ｂから受信した演算結果ａｎｓ２２’とを比較する（ステップＳ６０６）。ステップＳ６０６、Ｓ７０４、及びＳ７０５は、図１２のステップＳ４０６、Ｓ５０４、及びＳ５０５と同様でよい。ＣＰＵ１０１Ａは、演算結果ａｎｓ１２と演算結果ａｎｓ２２’との差の絶対値が誤差ε３を超えている場合、故障を検出し、エラー終了する。
【００８０】
［まとめ］
本実施形態は、２つのＣＰＵが、互いに演算結果を送受信し、相互にＣＰＵの演算機能を診断する。このようにすることで、ＣＰＵ診断システム３００は、より実装水準が高い機能安全システムを構築できる。他の効果は、実施形態１又は実施形態２と同様である。
【００８１】
［実施形態４］
実施形態４を説明する。本実施形態は、ＣＰＵ診断システムを提供する。本実施形態に係るＣＰＵ診断システムの構成は、図１１に示される実施形態３に係るＣＰＵ診断システム３００の構成と同様である。本実施形態において、メインマイコン１００Ａは、サブマイコン１００Ｂによって演算された逆演算の結果を使用して演算機能を診断する。また、サブマイコン１００Ｂは、メインマイコン１００Ａによって演算された逆演算の結果を使用して演算機能を診断する。他の点は、実施形態３と同様でよい。
【００８２】
［動作例］
図１４は、ＣＰＵ診断システムにおいて平方根演算命令が実行される場合の動作例を示す。メインマイコン１００Ａのユーザアプリケーションは入力値ｘを生成し、ＣＰＵ診断ソフトウェアに対して浮動小数点の平方根演算を要求する。ＣＰＵ１０１Ａは、浮動小数点の平方根演算が要求されると、入力値ｘに対して平方根演算の逆演算を実行する（ステップＳ８０１）。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、サブマイコン１００Ｂに、演算要求を送信する（ステップＳ８０２）。演算要求は、入力値ｘと、平方根演算を示す情報とを含む。ステップＳ８０１及びＳ８０２は、図１２のステップＳ４０１及びＳ４０２と同様でよい。ＣＰＵ１０１Ａは、ステップＳ８０１の演算結果をａｎｓ１１、ＳＰＩ１０６Ａを通じてサブマイコン１００Ｂに送信する（ステップＳ８０３）。
【００８３】
サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して演算要求を受信する。ＣＰＵ１０１Ｂは、入力値ｘに対して平方根演算の逆演算を行う（ステップＳ９０１）。ＣＰＵ１０１Ｂは、ステップＳ９０１では、固定小数点ライブラリｆｉｘｍａｔｈ．ｈに含まれるＦＩＸ＿ｆｒｏｍｆｌｏａｔ（）を利用して、メインマイコン１００Ａから受信した入力値ｘを固定小数点型の入力値ｙに変換する。ＣＰＵ１０１Ｂは、固定小数点型の変数ａｎｓ２１に、ｙ×ｙの演算結果を代入する。更に、ＣＰＵ１０１Ｂは、固定小数点ライブラリｆｉｘｍａｔｈ．ｈに含まれるＦＩＸ＿ｔｏｆｌｏａｔ（）を利用して、固定小数点型の演算結果ａｎｓ２１を、ｆｌｏａｔ型の演算結果ａｎｓ２１’に変換する。ＣＰＵ１０１Ｂは、ｆｌｏａｔ型の演算結果ａｎｓ２１’を、ＳＰＩ１０６Ｂを通じてメインマイコン１００Ａに送信する（ステップＳ９０２）。
【００８４】
ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、サブマイコン１００Ｂからｆｌｏａｔ型の演算結果ａｎｓ２１’を受信する。ＣＰＵ１０１Ａは、受信した演算結果ａｎｓ２１’を入力として、ｆｌｏａｔ型の平方根演算命令を実行する（ステップＳ８０４）。ステップＳ８０４は、入力がサブマイコン１００Ｂから受信した演算結果ａｎｓ２１’に変わる点を除けば、図１２のステップＳ４０３と同様でよい。
【００８５】
ＣＰＵ１０１Ａは、ステップＳ８０４の演算結果ａｎｓ１２と、入力値ｘとを比較する（ステップＳ８０５）。ＣＰＵ１０１Ａは、演算結果ａｎｓ１２と入力値ｘとの差の絶対値が、数値演算による誤差ε１を超えている場合、故障を検出し、エラー終了する。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、ステップＳ８０４の演算結果ａｎｓ１２をサブマイコン１００Ｂに送信する（ステップＳ８０６）。ステップＳ８０５及びＳ８０６は、図１２のステップＳ４０４及びＳ４０５と同様でよい。
【００８６】
一方、ＣＰＵ１０１Ｂは、メインマイコン１００Ａから受信した演算結果ａｎｓ１１を固定小数点型に型変換し、型変換した演算結果ａｎｓ１１を入力として、固定小数点型の平方根演算命令を実行する（ステップＳ９０３）。ＣＰＵ１０１Ｂは、ステップＳ９０３では、固定小数点ライブラリに含まれるＦＩＸ＿ｆｒｏｍｆｌａｏｔ（）を利用して、固定小数点型の変数ｚに、演算結果ａｎｓ１１の値を代入する。ＣＰＵ１０１Ｂは、固定小数点型の変数ａｎｓ２２に、ＦＩＸ＿ＳＱＲＴ（ｚ）の演算結果を代入する。ステップＳ９０３は、入力がメインマイコン１００Ａから受信した演算結果の値に変わる点を除けば、図１２のステップＳ５０２と同様でよい。
【００８７】
ＣＰＵ１０１Ｂは、ステップＳ９０３の演算結果ａｎｓ２２と、ステップＳ９０１で型変換された入力値ｙとを比較する（ステップＳ９０４）。ＣＰＵ１０１Ｂは、演算結果ａｎｓ２２と入力値ｙとの差の絶対値が、誤差ε２を超えている場合、故障を検出し、エラー終了する。ＣＰＵ１０１Ｂは、ステップＳ９０３の演算結果ａｎｓ２２をｆｌｏａｔ型に変換する（ステップＳ９０５）。ＣＰＵ１００Ｂは、ＳＰＩ１０６Ｂを通じて、ｆｌｏａｔ型に変換した演算結果ａｎｓ２２’をメインマイコン１００Ａに送信する（ステップＳ９０６）。ステップＳ９０４〜Ｓ９０６は、図１２のステップＳ５０３〜Ｓ５０５と同様でよい。
【００８８】
メインマイコン１００ＡのＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを介して、ステップＳ９０６でＣＰＵ１０１Ｂが送信した演算結果ａｎｓ２２’を受信する。ＣＰＵ１０１Ａは、ステップＳ８０４の演算結果ａｎｓ１２と、サブマイコン１００Ｂから受信した演算結果ａｎｓ２２’とを比較する（ステップＳ８０７）。ＣＰＵ１０１Ａは、演算結果ａｎｓ１２と演算結果ａｎｓ２２’との差の絶対値が、誤差ε３を超えている場合、故障を検出し、エラー終了する。ステップＳ８０７は、図１２のステップＳ４０６と同様でよい。
【００８９】
サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して、ステップＳ８０６でＣＰＵ１０１Ａが送信した演算結果ａｎｓ１２を受信する。ＣＰＵ１０１Ｂは、演算結果ａｎｓ１２を固定小数点型に型変換し、型変換した演算結果ａｎｓ１２と、ステップＳ９０３の演算結果ａｎｓ２２とを比較する（ステップＳ９０７）。ＣＰＵ１０１Ｂは、演算結果ａｎｓ２２と演算結果ａｎｓ１２（変数ｚ）との差の絶対値が、誤差ε４を超えている場合、故障を検出し、エラー終了する。ステップＳ９０７は、図１２のステップＳ５０６と同様でよい。
【００９０】
図１５は、ＣＰＵ診断システムにおいて余弦演算命令が実行される場合の動作例を示す。メインマイコン１００Ａのユーザアプリケーションは入力値ｘを生成し、ＣＰＵ診断ソフトウェアに対して浮動小数点の余弦演算を要求する。ＣＰＵ１０１Ａは、浮動小数点の余弦演算が要求されると、入力値ｘに対して余弦演算の逆演算を実行する（ステップＳ１００１）。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、サブマイコン１００Ｂに、演算要求を送信する（ステップＳ１００２）。ステップＳ１００１及びＳ１００２は、図１３のステップＳ６０１及びＳ６０２と同様でよい。ＣＰＵ１０１Ａは、ステップＳ１００１の演算結果をａｎｓ１１、ＳＰＩ１０６Ａを通じてサブマイコン１００Ｂに送信する（ステップＳ１００３）。
【００９１】
サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して演算要求を受信する。ＣＰＵ１０１Ｂは、入力値ｘに対して余弦演算の逆演算を行う（ステップＳ１１０１）。ＣＰＵ１０１Ｂは、ステップＳ１１０１では、固定小数点ライブラリｆｉｘｍａｔｈ．ｈに含まれるＦＩＸ＿ｆｒｏｍｆｌｏａｔ（）、ＦＩＸ＿ｔｏｆｌｏａｔ（）、及びＦＩＸ＿ａｃｏｓ（）を利用する。ＣＰＵ１０１Ｂは、ＦＩＸ＿ｆｒｏｍｆｌｏａｔ（）を利用して、メインマイコン１００Ａから受信した入力値ｘを固定小数点型の入力値ｙに変換する。ＣＰＵ１０１Ｂは、固定小数点型の変数ａｎｓ２１に、ＦＩＸ＿ａｃｏｓ（ｙ）の演算結果を代入する。更に、ＣＰＵ１０１Ｂは、ＦＩＸ＿ｔｏｆｌｏａｔ（）を利用して、固定小数点型の演算結果ａｎｓ２１を、ｆｌｏａｔ型の演算結果ａｎｓ２１’に変換する。ＣＰＵ１０１Ｂは、ｆｌｏａｔ型の演算結果ａｎｓ２１’を、ＳＰＩ１０６Ｂを通じてメインマイコン１００Ａに送信する（ステップＳ１１０２）。
【００９２】
ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、サブマイコン１００Ｂからｆｌｏａｔ型の演算結果ａｎｓ２１’を受信する。ＣＰＵ１０１Ａは、受信した演算結果ａｎｓ２１’を入力として、ｆｌｏａｔ型の余弦演算命令を実行する（ステップＳ１００４）。ステップＳ１００４は、入力がサブマイコン１００Ｂから受信した演算結果ａｎｓ２１’に変わる点を除けば、図１３のステップＳ６０３と同様でよい。
【００９３】
ＣＰＵ１０１Ａは、ステップＳ１００４の演算結果ａｎｓ１２と、入力値ｘとを比較する（ステップＳ１００５）。ＣＰＵ１０１Ａは、演算結果ａｎｓ１２と入力値ｘとの差の絶対値が誤差ε１を超えている場合、故障を検出し、エラー終了する。ＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを通じて、ステップＳ１００４の演算結果ａｎｓ１２をサブマイコン１００Ｂに送信する（ステップＳ１００６）。ステップＳ１００５及びＳ１００６は、図１３のステップＳ６０４及びＳ６０５と同様でよい。
【００９４】
一方、ＣＰＵ１０１Ｂは、メインマイコン１００Ａから受信した演算結果ａｎｓ１１を固定小数点型に型変換し、型変換した演算結果ａｎｓ１１を入力として、固定小数点型の余弦演算命令を実行する（ステップＳ１１０３）。ＣＰＵ１０１Ｂは、ステップＳ１１０３では、固定小数点ライブラリに含まれるＦＩＸ＿ｆｒｏｍｆｌａｏｔ（）を利用して、固定小数点型の変数ｚに、演算結果ａｎｓ１１の値を代入する。ＣＰＵ１０１Ｂは、固定小数点型の変数ａｎｓ２２に、ＦＩＸ＿ＣＯＳ（ｚ）の演算結果を代入する。ステップＳ１１０３は、入力がメインマイコン１００Ａから受信した演算結果の値に変わる点を除けば、図１３のステップＳ７０２と同様でよい。
【００９５】
ＣＰＵ１０１Ｂは、ステップＳ１１０３の演算結果ａｎｓ２２と、ステップＳ１１０１で型変換された入力値ｙとを比較する（ステップＳ１１０４）。ＣＰＵ１０１Ｂは、演算結果ａｎｓ２２と入力値ｙとの差の絶対値が、誤差ε２を超えている場合、故障を検出し、エラー終了する。ＣＰＵ１０１Ｂは、ステップＳ１１０３の演算結果ａｎｓ２２をｆｌｏａｔ型に変換する（ステップＳ１１０５）。ＣＰＵ１００Ｂは、ＳＰＩ１０６Ｂを通じて、ｆｌｏａｔ型に変換した演算結果ａｎｓ２２’をメインマイコン１００Ａに送信する（ステップＳ１１０６）。ステップＳ１１０４〜Ｓ１１０６は、図１３のステップＳ７０３〜Ｓ７０５と同様でよい。
【００９６】
メインマイコン１００ＡのＣＰＵ１０１Ａは、ＳＰＩ１０６Ａを介して、ステップＳ１１０６でＣＰＵ１０１Ｂが送信した演算結果ａｎｓ２２’を受信する。ＣＰＵ１０１Ａは、ステップＳ１００４の演算結果ａｎｓ１２と、サブマイコン１００Ｂから受信した演算結果ａｎｓ２２’とを比較する（ステップＳ１００７）。ＣＰＵ１０１Ａは、演算結果ａｎｓ１２と演算結果ａｎｓ２２’との差の絶対値が、誤差ε３を超えている場合、故障を検出し、エラー終了する。ステップＳ１００７は、図１３のステップＳ６０６と同様でよい。
【００９７】
サブマイコン１００ＢのＣＰＵ１０１Ｂは、ＳＰＩ１０６Ｂを介して、ステップＳ１００６でＣＰＵ１０１Ａが送信した演算結果ａｎｓ１２を受信する。ＣＰＵ１０１Ｂは、演算結果ａｎｓ１２を固定小数点型に型変換し、型変換した演算結果ａｎｓ１２と、ステップＳ９０３の演算結果ａｎｓ２２とを比較する（ステップＳ１１０７）。ＣＰＵ１０１Ｂは、演算結果ａｎｓ２２と演算結果ａｎｓ１２（変数ｚ）との差の絶対値が、誤差ε４を超えている場合、故障を検出し、エラー終了する。ステップＳ１１０７は、図１３のステップＳ７０６と同様でよい。
【００９８】
［まとめ］
本実施形態は、２つのＣＰＵが、互いに演算結果を送受信するのに加えて、逆演算の演算結果を送受信する。各ＣＰＵは、他のＣＰＵによって実行された逆演算の演算結果を用いて、ＣＰＵの演算機能を診断する。このようにすることで、ＣＰＵ診断システム３００は、より実装水準が高い機能安全システムを構築できる。他の効果は、実施形態３と同様である。
【００９９】
実施形態５を説明する。実施形態５は、半導体装置を提供する。実施形態５に係る半導体装置の構成は、図１に示される実施形態１に係る半導体装置１００の構成と同様である。本実施形態では、故障検出用の演算に四則演算を使用する。他の点は、実施形態１又は実施形態２と同様でよい。
【０１００】
［動作手順］
図１６は、本実施形態におけるＣＰＵ故障診断の一例を示す。ここでは、故障検出用の演算は「減算」であり、逆演算は「加算」であるとする。故障検出用の演算と逆演算とは逆でもよい。ＣＰＵ１０１は、入力値ｘ及びｙを生成する（ステップＳ１２０１）。ＣＰＵ１０１は、ステップＳ１２０１では、例えば、それぞれ、所定の入力値の範囲を均等に分割した入力値ｘ及びｙを順次に生成する。ＣＰＵ１０１は、入力値ｘに入力値ｙを加算する演算（逆演算）を行う（ステップＳ１２０２）。ＣＰＵ１０１は、ステップＳ１２０２では、変数ａｎｓ１に、ｘ＋ｙの演算結果を代入する。この演算命令は、例えばＡＤＤ  ｘ，ｙ，ａｎｓ１で表される。
【０１０１】
ＣＰＵ１０１は、ステップＳ１２０２で計算したａｎｓ１と入力値ｙとを入力として、故障診断の対象となる演算を実施する（ステップＳ１２０３）。ＣＰＵ１０１は、ステップＳ１２０３では、変数ａｎｓ２に、ａｎｓ１−ｙの演算結果を代入する。この演算命令は、例えば、ＳＵＢ  ｙ，ａｎｓ１，ａｎｓ２で表される。演算が正常に実施された場合、数値演算の誤差範囲内ではａｎｓ２＝ｘとなる。
【０１０２】
ＣＰＵ１０１は、ステップＳ１２０１で生成した入力値ｘと、ステップＳ１２０３の演算結果ａｎｓ２を比較し、差（絶対値）が誤差範囲以内であるか否かを判断する（ステップＳ１２０４）。ＣＰＵ１０１は、ステップＳ１２０４では、誤差をεとして、｜ａｎｓ１−ｘ｜≦εが満たされるか否かを判断する。ＣＰＵ１０１は、ステップＳ１２０４で｜ａｎｓ１−ｘ｜≦εが満たされると判断した場合、ＣＰＵ１０１の数値演算回路（演算機能）は故障していないと判断する（ステップＳ１２０５）。ＣＰＵ１０１は、｜ａｎｓ１−ｘ｜＞εである場合は、ＣＰＵの数値演算回路は故障していると判断する（ステップＳ１２０６）。ＣＰＵ１０１は、所定の入力値の範囲で、ステップＳ１２０１からステップＳ１２０４を繰り返し実施し、数値演算回路の機能を診断する。
【０１０３】
図１７は、本実施形態におけるＣＰＵ故障診断の別の例を示す。ここでは、故障検出用の演算は「除算」であり、逆演算は「乗算」であるとする。故障検出用の演算と逆演算とは逆でもよい。ＣＰＵ１０１は、入力値ｘ及びｙを生成する（ステップＳ１３０１）。ＣＰＵ１０１は、ステップＳ１３０１では、例えば、それぞれ、所定の入力値の範囲を均等に分割した入力値ｘ及びｙを順次に生成する。ＣＰＵ１０１は、入力値ｘと入力値ｙを乗算する演算（逆演算）を行う（ステップＳ１３０２）。ＣＰＵ１０１は、ステップＳ１３０２では、変数ａｎｓ１に、ｘ×ｙの演算結果を代入する。この演算命令は、例えばＭＵＬ  ｘ，ｙ，ａｎｓ１で表される。
【０１０４】
ＣＰＵ１０１は、ステップＳ１３０２で計算したａｎｓ１と入力値ｙとを入力として、故障診断の対象となる演算を実施する（ステップＳ１３０３）。ＣＰＵ１０１は、ステップＳ１３０３では、変数ａｎｓ２に、ａｎｓ１／ｙの演算結果を代入する。この演算命令は、例えば、ＤＩＶ  ａｎｓ１，ｙで表される。演算が正常に実施された場合、数値演算の誤差範囲内ではａｎｓ２＝ｘとなる。
【０１０５】
ＣＰＵ１０１は、ステップＳ１３０１で生成した入力値ｘと、ステップＳ１３０３の演算結果ａｎｓ２を比較し、差（絶対値）が誤差範囲以内であるか否かを判断する（ステップＳ１３０４）。ステップＳ１３０４は、図１６のステップＳ１２０４と同様でよい。ＣＰＵ１０１は、ステップＳ１３０４で｜ａｎｓ２−ｘ｜≦εが満たされると判断した場合、ＣＰＵ１０１の数値演算回路（演算機能）は故障していないと判断する（ステップＳ１３０５）。ＣＰＵ１０１は、｜ａｎｓ２−ｘ｜＞εである場合は、ＣＰＵの数値演算回路は故障していると判断する（ステップＳ１３０６）。ＣＰＵ１０１は、所定の入力値の範囲で、ステップＳ１３０１からステップＳ１３０４を繰り返し実施し、数値演算回路の機能を診断する。
【０１０６】
［まとめ］
一般に、四則演算命令は、初等関数より使用頻度が高いと考えられる。本実施形態は、加算と減算、及び乗算と除算を、逆演算として用い、四則演算命令を故障検出用の演算とする。このようにすることで、本実施形態は、四則演算命令の故障を診断できる。また、本実施形態は、２入力のオペランドを持つ演算命令の故障を診断できる。他の効果は、実施形態１又は実施形態２と同様である。
【０１０７】
［実施形態６］
実施形態６を説明する。実施形態６は、半導体装置を提供する。実施形態６に係る半導体装置の構成は、図１に示される実施形態１に係る半導体装置１００の構成と同様である。逆演算方式による命令診断では、入力値が診断における期待値となる。このため、プログラムで生成した入力値の信頼性を高めることが課題となる。そこで、本実施形態では、算術演算命令のオペランドとなる入力を２種の互いに異なる独立な演算により生成する。本実施形態は、それら２種の演算で生成した結果を互いに比較することで、入力値の正当性の検証する方法を説明する。
【０１０８】
［動作手順］
図１８は、本実施形態におけるＣＰＵ故障診断の手順を示す。ＣＰＵ１０１は、演算Ａにより入力値ｘ１を生成する（ステップＳ１４０１）。ＣＰＵ１０１は、ステップＳ１４０１では、例えば、入力値の最大値と最小値とを設定する。ＣＰＵ１０１は、最小値から最大値の間の範囲を、演算Ａを用いて所定の分割数で均等に分割した入力値ｘ１を、ソフトウェアループにより生成する。ＣＰＵ１０１は、演算Ｂにより入力値ｘ２を生成する（ステップＳ１４０２）。ＣＰＵ１０１は、ステップＳ１４０２では、例えば、最小値から最大値の間の範囲を、演算Ｂを用いて所定の分割数で均等に分割した入力値ｘ２を、ソフトウェアループにより生成する。ここで、演算Ｂは、演算Ａとは異なる演算器（例えばコプロセッサ、他のＣＰＵ）を使用する演算、及び／又は、演算Ａとは異なる演算命令で実行される演算である。
【０１０９】
ＣＰＵ１０１は、入力値ｘ１と入力値ｘ２とを誤差範囲で比較し、両者が一致するか否かを判断する（ステップＳ１４０３）。演算Ａにより生成される入力値ｘ１と、演算Ｂによる入力値ｘ２とは、互いに異なる演算器、及び／又は演算命令を用いて生成されている。このため、入力値ｘ１と入力値ｘ２とは、数値演算の誤差範囲で一致する。ＣＰＵ１０１は、ステップＳ１４０３では、入力値ｘ１と入力値ｘ２との差の絶対値が数値演算による誤差ε０以下であるか否かを判断する。ＣＰＵ１０１は、入力値ｘ１と入力値ｘ２との差の絶対値が誤差ε０より大きい場合、入力値の障害ありと判定する（ステップＳ１４０４）。
【０１１０】
ＣＰＵ１０１は、入力値ｘ１と入力値ｘ２との差の絶対値が誤差ε０以下である場合、入力値の障害はないと判定する。その場合、ＣＰＵ１０１は、ｆ（ｘ１）の逆演算ｇ（ｘ１）＝ｆ−１（ｘ１）を実行する（ステップＳ１４０５）。ＣＰＵ１０１は、ステップＳ１４０５で計算したｇ（ｘ１）を入力値として、故障診断の対象となる演算ｘ１’＝ｆ（ｇ（ｘ１））を実施する（ステップＳ１４０６）。
【０１１１】
ＣＰＵ１０１は、ステップＳ１４０１で生成した入力値ｘ１と、ステップＳ１４０６で実施したｆ（ｇ（ｘ１））の演算結果とを比較し、差（絶対値）が誤差範囲以内であるか否かを判断する（ステップＳ１４０７）。ＣＰＵ１０１は、ステップＳ１４０７では、誤差をεとして、｜ｘ１’−ｘ１｜≦εが満たされるか否かを判断する。
【０１１２】
ＣＰＵ１０１は、｜ｘ１’−ｘ１｜≦εが満たされると判断した場合、ＣＰＵ１０１の数値演算回路（演算機能）は故障していないと判断する（ステップＳ１４０８）。ＣＰＵ１０１は、｜ｘ１’−ｘ１｜＞εである場合は、ＣＰＵの数値演算回路は故障していると判断する（ステップＳ１４０９）。ステップＳ１４０６〜Ｓ１４０９は、図３のステップＳ１０２〜Ｓ１０６と同様でよい。
【０１１３】
［入力値生成］
以下では、２種の互いに異なる独立な演算として、ＣＰＵとＦＰＵなどの異なる演算器を使用する場合、及び加算と減算（減算と符号反転）などの異なる演算命令を使用する場合の２例が説明される。半導体装置１００は、図１に示されるように、ＣＰＵ１０１とＦＰＵ１０２とを有しているものとする。
【０１１４】
まず、ＣＰＵとＦＰＵなどの異なる演算器を使用する場合を説明する。半導体装置１００において、ＣＰＵ１０１は、上記した入力値ｘ１を生成する。ＦＰＵ１０２は、入力値ｘ２を生成する。ＣＰＵ１０１は、入力値ｘ１と、入力値ｘ２とを比較し、入力値を診断する。以下において、ＦＰＵ１０２は、一般にＣＰＵ１０１と独立に実装されることが多いｄｏｕｂｌｅ型のＦＰＵであるとする。
【０１１５】
図１９は、異なる演算器が使用される場合の入力値の生成及び診断の手順を示す。ＣＰＵ１０１は、入力値ｘ１を生成する（ステップＳ１５０１）。入力値ｘ１は、例えば図７において、定義域［−１，１］を均等に２５６分割した区間の１区間に相当するとする。ＣＰＵ１０１は、ステップＳ１５０１では、分割数をＮ＝２５６とし、ｎ＝０を初期値として、整数型の演算であるｘ１＝−１＋２×ｎ／Ｎにより、入力値ｘ１を生成する。ステップＳ１５０１は、図１８のステップＳ１４０１に対応する。
【０１１６】
ＣＰＵ１０１は、入力値ｘ１の生成に使用した整数型のｎをＦＰＵ１０２に転送する。ＦＰＵ１０２は、ｎを整数型からｄｏｕｂｌｅ型に変換する（ステップＳ１５０２）。ＦＰＵ１０２は、ｄｏｕｂｌｅ型に変換したｎを用いて、入力値ｘ２を生成する（ステップＳ１５０３）。ＦＰＵ１０２は、ステップＳ１５０３では、ｄｏｕｂｌｅ命令（ｄｏｕｂｌｅ型の演算）を用いて、ｘ２＝−１＋２×ｎ／Ｎにより、入力値ｘ２を生成する。ステップＳ１５０３は、図１８のステップＳ１４０２に対応する。ＦＰＵ１０２は、ｄｏｕｂｌｅ型のｘ２を、整数型に変換し、ＣＰＵ１０１に転送する（ステップＳ１５０４）。
【０１１７】
ＣＰＵ１０１は、入力値ｘ１と、ＦＰＵ１０２から転送された入力値ｘ２とを比較し、入力値に障害があるか否かを判断する（ステップＳ１５０５）。ＣＰＵ１０１は、ステップＳ１５０５では、入力値ｘ１と入力値ｘ２との差の絶対値が、数値演算による誤差ε０を超えているか否かを判断する。誤差ε０は、ステップＳ１５０２、Ｓ１５０３、及びＳ１５０４の数値演算により発生し得る誤差の最大値とする。ＣＰＵ１０１は、差の絶対値が誤差ε０を超える場合、入力値ｘ１に障害ありと判定し、エラー終了する。ステップＳ１５０５は、図１８のステップＳ１４０３に対応する。
【０１１８】
ＣＰＵ１０１は、入力値ｘ１と入力値ｘ２との差の絶対値が誤差ε０以下の場合、入力値ｘ１を用いて、ＣＰＵ故障診断を実施する（ステップＳ１５０６）。ステップＳ１５０６は、図１８のステップＳ１４０５〜Ｓ１４０９に対応する。ＣＰＵ１０１は、ｎの値に基づいて、全区間の演算が終了したか否かを判断する（ステップＳ１５０７）。ＣＰＵ１０１は、ｎ＞２５５であれば、演算終了と判断し、正常終了する。
【０１１９】
ＣＰＵ１０１は、演算終了でない場合、カウンタを更新し、ｎの値を１つ増加させる（ステップＳ１５０８）。その後、処理はステップＳ１５０１に戻り、更新されたｎの値を用いて入力値ｘ１が生成される。
【０１２０】
図２０は、異なる演算命令が使用される場合の入力値の生成及び診断の手順を示す。この例において、ＣＰＵ１０１は、定義域［−１，１］を均等に２５６分割した区間の１区間を示す識別子ｎの値を生成する。ＣＰＵ１０１は、識別子ｎの生成では、それぞれが１以上の演算命令により実行され、相互に等しい演算結果が得られる２つの演算を用いる。図２０の例では、ＣＰＵ１０１は、加算と減算（減算と符号反転）の異なる演算命令を用いて識別子ｎを生成する。ＣＰＵ１０１は、加算回路、減算回路、及び符号反転回路などを有する。ＣＰＵ１０１において、これら回路は独立に実装されているとする。ＣＰＵ１０１は、入力値の生成では、独立に実装されている回路を使用して、例えば上記識別子ｎを生成する。
【０１２１】
ＣＰＵ１０１は、加算命令を用いて生成された識別子ｎ（ｎ１）を用いて、入力値ｘ１を生成する（ステップＳ１６０１）。ＣＰＵ１０１は、ステップＳ１６０１では、ｘ１＝−１＋２×ｎ１／Ｎにより、入力値ｘ１を生成する。また、ＣＰＵ１０１は、減算命令を用いて生成された識別子ｎ（ｎ２）を用いて、入力値ｘ２を生成する（ステップＳ１６０２）。ＣＰＵ１０１は、ステップＳ１６０２では、ｘ２＝−１＋２×ｎ２／Ｎにより、入力値ｘ２を生成する。ここで、ｎ１及びｎ２の初期値は０であるとする。ステップＳ１６０１及びＳ１６０２は、図１８のステップＳ１４０１及びＳ１４０２に対応する。
【０１２２】
ＣＰＵ１０１は、ステップＳ１６０１で生成した入力値ｘ１と、ステップＳ１６０２で生成した入力値ｘ２とを比較し、入力値に障害があるか否かを判断する（ステップＳ１６０３）。ＣＰＵ１０１は、ステップＳ１６０３では、入力値ｘ１と入力値ｘ２との差の絶対値が、数値演算による誤差ε０を超えているか否かを判断する。誤差ε０は、ステップＳ１６０１及びＳ１６０２の数値演算により発生し得る誤差の最大値とする。ＣＰＵ１０１は、差の絶対値が誤差ε０を超える場合、入力値ｘ１に障害ありと判定し、エラー終了する。ステップＳ１６０３は、図１８のステップＳ１４０３に対応する。
【０１２３】
ＣＰＵ１０１は、入力値ｘ１と入力値ｘ２との差の絶対値が誤差ε０以下の場合、入力値ｘ１を用いて、ＣＰＵ故障診断を実施する（ステップＳ１６０４）。ステップＳ１６０４は、図１８のステップＳ１４０５〜Ｓ１４０９に対応する。ＣＰＵ１０１は、識別子ｎ１又はｎ２の値に基づいて、全区間の演算が終了したか否かを判断する（ステップＳ１６０５）。ＣＰＵ１０１は、ｎ＞２５５であれば、演算終了と判断し、正常終了する。
【０１２４】
ＣＰＵ１０１は、演算終了でない場合、加算命令を用いて識別子ｎ１の値を１つ増加させる（ステップＳ１６０６）。ＣＰＵ１０１は、ステップＳ１６０６では、例えば加算命令ＡＤＤ  ｎ１，１を実行することにより、識別子ｎ１の値を１つ増加させる。
【０１２５】
ＣＰＵ１０１は、減算命令を用いて識別子ｎ２の値を１つ減算する（ステップＳ１６０７）。ＣＰＵ１０１は、ステップＳ１６０２では、例えば減算命令ＳＵＢ  ｎ２，１を実行することにより、識別子ｎ２の値を１つ減少させる。その後、ＣＰＵ１０１は、識別子ｎ２を符号反転させる（ステップＳ１６０８）。ＣＰＵ１０１は、ステップＳ１６０８では、例えば符号判定命令ＮＥＧ  ｎ２を実行することにより、識別子ｎ２の各ビットの符号を反転させる。結果、識別子ｎ２の値は、ステップＳ１６０７を実行する前の値より１つ大きい値となる。その後、処理はステップＳ１６０１に戻り、更新された識別子ｎ１及びｎ２を用いて入力値ｘ１及びｘ２が生成される。
【０１２６】
［まとめ］
本実施形態では、ＣＰＵ１０１は、異なる演算器、及び／又は異なる演算命令を用いて生成された入力値ｘ１と入力値ｘ２とを比較する。入力値ｘ１及びｘ２は、互いに異なる故障因子を持つ。このため、入力値ｘ１及びｘ２が同時に同じだけ誤る確率は低い。本実施形態は、入力値の正当性を検証した後に、ＣＰＵ故障診断において入力値と演算結果と比較する。このようにすることで、本実施形態は、逆演算方式による命令診断では期待値となる入力値の信頼性を高めることができる。他の効果は、実施形態１又は実施形態２と同様である。
【０１２７】
なお、実施形態６は、２つの入力値を生成し、比較する例を説明したが、本開示はこれに限定されない。実施形態６において、ＣＰＵ１０１は、異なる演算器、及び／又は異なる演算命令を用いて３以上の入力値を生成し、それら入力値を相互に比較することで、入力値の障害を判定してもよい。その場合、ＣＰＵ１０１は、比較の結果、最も精度のよい演算器による入力値を選択してもよい。
【０１２８】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
【０１２９】
例えば、上記の実施形態の一部又は全部は、以下の付記のようにも記載され得るが、以下には限られない。
【０１３０】
［付記１］
演算機能を有する第１のプロセッサ及び第１のメモリを有する第１の半導体装置と、
演算機能を有する第２のプロセッサ及び第２のメモリを有する第２の半導体装置とを有し、
前記第１のプロセッサは、前記第１のメモリからプログラムを読み出して実行することにより、
第１の値を生成し、
前記第１の値を前記第２の半導体装置に送信し、
前記第１の値に対して、算術演算命令で実行される検査対象の演算の逆演算を行い、該逆演算の結果である第２の値を生成し、
前記検査対象の演算を実行する演算機能を用いて、前記第２の値に対して前記検査対象の演算を実行し、該演算の結果である第３の値を生成し、
前記第１の値と前記第３の値を比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定し、
前記第３の値を前記第２の半導体装置に送信し、
前記第２のプロセッサは、前記第２のメモリからプログラムを読み出して実行することにより、
前記第１の値を前記第１の半導体装置から受信し、該受信した第１の値に対して、前記検査対象の演算の逆演算を行い、該逆演算の結果である第４の値を生成し、
前記検査対象の演算を実行する演算機能を用いて、前記第４の値に対して前記検査対象の演算を実行し、該演算の結果である第５の値を生成し、
前記第１の値と前記第５の値を比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定し、
前記第５の値を前記第１の半導体装置に送信し、
前記第１のプロセッサは、更に、前記第５の値を前記第２の半導体装置から受信し、該受信した第５の値と前記第３の値を比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定し、
前記第２のプロセッサは、更に、前記第３の値を前記第１の半導体装置から受信し、該受信した第３の値と前記第５の値とを比較し、該比較の結果に基づいて前記演算機能が正常に動作しているか否かを判定する演算機能診断システム。
【０１３１】
［付記２］
前記第１のプロセッサは、更に、前記第２の値を前記第２の半導体装置に送信し、
前記第２のプロセッサは、更に、前記第４の値を前記第１の半導体装置に送信し、
前記第１のプロセッサは、前記第３の値の生成では、前記第２の値に代えて、前記第２のプロセッサから送信された前記第４の値に対する前記逆演算の結果に対して前記検査対象の演算を実行することによって前記第３の値を生成し、
前記第２のプロセッサは、前記第５の値の生成では、前記第４の値に代えて、前記第１のプロセッサから送信された前記第２の値に対する前記逆演算の結果に対して前記検査対象の演算を実行することによって前記第５の値を生成する付記１に記載の演算機能診断システム。
【符号の説明】
【０１３２】
１００：半導体装置
１００Ａ：メインマイコン
１００Ｂ：サブマイコン
１０１：ＣＰＵ
１０２：ＦＰＵ
１０３：ＲＯＭ
１０４：ＲＡＭ
１０５：ＩＣＵ
１０６：ＳＰＩ
１５１：パラメータ
１５２：演算命令
１５３：誤差
２０１：数値演算命令実行
２０２：ＣＰＵ診断ソフトウェア
２０３：数値演算ライブラリ
２０４：安全アプリケーション
３００：ＣＰＵ診断システム
【図１】
2020149425.tif 000003
【図２】
2020149425.tif 000004
【図３】
2020149425.tif 000005
【図４】
2020149425.tif 000006
【図５】
2020149425.tif 000007
【図６】
2020149425.tif 000008
【図７】
2020149425.tif 000009
【図８】
2020149425.tif 000010
【図９】
2020149425.tif 000011
【図１０】
2020149425.tif 000012
【図１１】
2020149425.tif 000013
【図１２】
2020149425.tif 000014
【図１３】
2020149425.tif 000015
【図１４】
2020149425.tif 000016
【図１５】
2020149425.tif 000017
【図１６】
2020149425.tif 000018
【図１７】
2020149425.tif 000019
【図１８】
2020149425.tif 000020
【図１９】
2020149425.tif 000021
【図２０】
2020149425.tif 000022
【図２１】
2020149425.tif 000023