(57)【要約】【課題】非数が発生した原因に応じて適切な制御を実行する。【解決手段】演算装置（１０）は、汎用レジスタ（１１０）、浮動小数点演算器（１２０）、及び固定小数点演算器（１３０）を有するＣＰＵ（１００）と、ＣＰＵにデータバス（１５０）を介して接続されたＲＯＭ（２００）及びＲＡＭ（３００）とを備える。演算装置は、演算制御における浮動小数点演算器の演算結果が非数であった場合に、汎用レジスタ、浮動小数点演算器、データバス、ＲＯＭ、又はＲＡＭのいずれが原因で演算結果が非数になったのかを特定する特定手段と、（ｉ）特定された原因が、浮動小数点演算器、ＲＯＭ、又はＲＡＭのいずれかであった場合には、演算制御を継続させ、（ｉｉ）特定された原因が、汎用レジスタ、又はデータバスのいずれかであった場合には、演算制御を中止して、フェールセーフ処理へと移行させる対処手段とを備える。【選択図】図１
2019106042.tif 000002
【特許請求の範囲】
【請求項１】
汎用レジスタ、浮動小数点演算器、及び固定小数点演算器を有するＣＰＵと、前記ＣＰＵにデータバスを介して接続されたＲＯＭ及びＲＡＭとを備える演算装置であって、
演算制御における前記浮動小数点演算器の演算結果が非数であった場合に、前記汎用レジスタ、前記浮動小数点演算器、前記データバス、前記ＲＯＭ、又は前記ＲＡＭのいずれが原因で前記演算結果が非数になったのかを特定する特定手段と、
（ｉ）前記特定された原因が、前記浮動小数点演算器、前記ＲＯＭ、又は前記ＲＡＭのいずれかであった場合には、前記演算制御を継続させ、（ｉｉ）前記特定された原因が、前記汎用レジスタ、又は前記データバスのいずれかであった場合には、前記演算制御を中止して、フェールセーフ処理へと移行させる対処手段と
を備えることを特徴とする演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、各種演算処理を実行する演算装置の技術分野に関する。
【背景技術】
【０００２】
この種の装置として、浮動小数点演算を行うものが知られている。浮動小数点演算では、非数（ＮａＮ：Ｎｏｔ  ａ  Ｎｕｍｂｅｒ）が発生すると、以降の演算が正常に実行できなくなるおそれがある。このため、例えば特許文献１では、浮動小数点演算において非数が発生した場合に、対象のブロックを初期化して制御不良を防止するという技術が提案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００４−２７８４８３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
非数が発生した場合の対応策としては、フェールセーフへの移行や、演算結果データの上書きが挙げられる。フェールセーフへ移行すると、通常の制御が中止されるため、確実に異常の発生を抑制することができる一方で、システム全体の機能を著しく低下させてしまうおそれがある。他方、演算結果データの上書きをして制御を続行すると、重大な欠陥が生じている場合に、エラー対策処理が多重発生し、演算不能に陥るおそれがある。このため、フェールセーフへの移行と演算データの上書きとは、非数発生の原因に応じて選択されることが好ましい。しかしながら、上述した特許文献１においては、このようなケースは全く想定されておらず、十分に改善の余地がある。
【０００５】
本発明は、例えば上記問題点に鑑みてなされたものであり、非数が発生した原因に応じて適切な制御を実行することが可能な演算装置を提供することを課題とする。
【課題を解決するための手段】
【０００６】
本発明に係る演算装置の一態様では、汎用レジスタ、浮動小数点演算器、及び固定小数点演算器を有するＣＰＵと、前記ＣＰＵにデータバスを介して接続されたＲＯＭ及びＲＡＭとを備える演算装置であって、演算制御における前記浮動小数点演算器の演算結果が非数であった場合に、前記汎用レジスタ、前記浮動小数点演算器、前記データバス、前記ＲＯＭ、又は前記ＲＡＭのいずれが原因で前記演算結果が非数になったのかを特定する特定手段と、（ｉ）前記特定された原因が、前記浮動小数点演算器、前記ＲＯＭ、又は前記ＲＡＭのいずれかであった場合には、前記演算制御を継続させ、（ｉｉ）前記特定された原因が、前記汎用レジスタ、又は前記データバスのいずれかであった場合には、前記演算制御を中止して、フェールセーフ処理へと移行させる対処手段とを備える。
【図面の簡単な説明】
【０００７】
【図１】本実施形態に係る演算装置の構成を示すブロック図である。
【図２】本実施形態に係る演算装置によるエラー処理の流れを示すフローチャートである。
【図３】本実施形態に係る演算装置による演算処理の最上位処理の流れを示すフローチャートである。
【図４】本実施形態に係る演算装置による通常処理の流れを示すフローチャートである。
【図５】非数発生要因とその場合の対処方法とを示す表である。
【発明を実施するための形態】
【０００８】
以下、図面を参照して演算装置の実施形態について説明する。
【０００９】
＜システム構成＞
まず、本実施形態に係る演算装置の構成について、図１を参照して説明する。図１は、本実施形態に係る演算装置の構成を示すブロック図である。
【００１０】
図１に示すように、本実施形態に係る演算装置１０は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１００、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２００、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３００、及び割り込みコントローラ４００を備えて構成されている。
【００１１】
ＣＰＵ１００は、汎用レジスタ１１０、ＡＬＵ.Ｆ（浮動小数点演算器）１２０、及びＡＬＵ（固定小数点演算器）１３０を備えている。汎用レジスタ１１０は、ＲＯＭ２００及びＲＡＭ３００からデータバス１５０を介して読み出したデータを一時的に格納する記憶装置である。ＡＬＵ.Ｆ１２０及びＡＬＵ１３０は、汎用レジスタ１１０に記憶されているデータを適宜読み出して演算処理を行うことが可能に構成されている。
【００１２】
ＲＯＭ２００は、予め記憶されたデータを格納している記憶装置であり、ＣＰＵ１００に対してデータバス１５０を介してデータを出力可能に構成されている。また、ＲＯＭ２００は、ＣＰＵに対して命令バス２５０を介して命令コードを出力可能に構成されている。
【００１３】
ＲＡＭ３００は、データの読み書きが可能な記憶装置であり、ＣＰＵ１００との間でデータバス１５０を介してデータのやり取りが行えるように構成されている。
【００１４】
割り込みコントローラ４００は、ＡＬＵ.Ｆ１２０の演算結果に非数が発生したことを示す非数発生通知を受信可能に構成されている。割り込みコントローラ４００は、非数発生通知を受信すると、ＣＰＵ１００に対してエラー処理を起動するように命令を出力することができる。エラー処理については、以下で詳しく説明する。
【００１５】
＜エラー処理＞
次に、本実施形態に係る演算装置１０によるエラー処理（即ち、非数が発生した場合の処理）について、図２を参照して説明する。図２は、本実施形態に係る演算装置によるエラー処理の流れを示すフローチャートである。
【００１６】
図２に示すように、エラー処理時には、まず汎用レジスタ１１０のチェック（即ち、非数が発生した原因が汎用レジスタ１００にあるか否かをチェックする処理）を実行する（ステップＳ１１）。汎用レジスタ１１０のチェックは、例えば非数発生要因となり得る値（非数、＋∞、−∞、０等）以外の特定値を汎用レジスタ１１０に書き込んだ後、書き込んだ値を読み出して、任意の値が書き込めるかチェックすればよい。この際には、命令に直接値を記載してＲＯＭ２００からデータを読み出さないようにする。
【００１７】
汎用レジスタ１１０のチェック後には、チェックの結果としてエラーがなかったか否か（即ち、非数が発生した原因が汎用レジスタ１１０でなかったか否か）を判定する（ステップＳ１２）。エラーがなかった場合（ステップＳ１２：ＹＥＳ）、ステップＳ１４へと進む。一方、エラーがあった場合（ステップＳ１２：ＮＯ）、エラーを管理する値であるＦｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ１”を入力して（ステップＳ１３）、ステップＳ２５へと進む。
【００１８】
続いて、データバス１５０のチェック（即ち、非数が発生した原因がデータバス１５０にあるか否かをチェックする処理）を実行する（ステップＳ１４）。データバス１５０のチェックは、例えば非数発生要因となり得る値（非数、＋∞、−∞、０等）以外の特定値をＲＯＭ２００に書き込んだ後、書き込んだ値を読み出して、読み出したデータが書き込んでおいたデータと一致するか否かをチェックすればよい。
【００１９】
データバス１５０のチェック後には、チェックの結果としてエラーがなかったか否か（即ち、非数が発生した原因がデータバス１５０でなかったか否か）を判定する（ステップＳ１５）。エラーがなかった場合（ステップＳ１５：ＹＥＳ）、ステップＳ１７へと進む。一方、エラーがあった場合（ステップＳ１５：ＮＯ）、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ２”を入力して（ステップＳ１６）、ステップＳ２５へと進む。
【００２０】
続いて、ＡＬＵ.Ｆ１２０のチェック（即ち、非数が発生した原因がＡＬＵ.Ｆ１２０にあるか否かをチェックする処理）を実行する（ステップＳ１７）。ＡＬＵ.Ｆ１２０のチェックは、例えば浮動小数点演算により絶対に非数が発生しないデータの組み合わせ（例えば、非数、＋∞、−∞、０以外）を使って演算を行い、演算結果が非数となっていないことをチェックすればよい。
【００２１】
ＡＬＵ.Ｆ１２０のチェック後には、チェックの結果としてエラーがなかったか否か（即ち、非数が発生した原因がＡＬＵ.Ｆ１２０でなかったか否か）を判定する（ステップＳ１８）。エラーがなかった場合（ステップＳ１８：ＹＥＳ）、ステップＳ２０へと進む。一方、エラーがあった場合（ステップＳ１８：ＮＯ）、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ３”を入力して（ステップＳ１９）、ステップＳ２５へと進む。
【００２２】
続いて、ＲＯＭ２００のデータチェック（即ち、非数が発生した原因がＲＯＭ２００のデータにあるか否かをチェックする処理）を実行する（ステップＳ２０）。ＲＯＭ２００のデータのチェックは、例えばＲＯＭ２００からデータを読み出して非数を発生させるような値（例えば、非数、＋∞、−∞、０以外）でないことをチェックすればよい。
【００２３】
ＲＯＭ２００のデータのチェック後には、チェックの結果としてエラーがなかったか否か（即ち、非数が発生した原因がＲＯＭ２００のデータでなかったか否か）を判定する（ステップＳ２１）。エラーがなかった場合（ステップＳ２１：ＹＥＳ）、ステップＳ２４へと進む。一方、エラーがあった場合（ステップＳ２２：ＮＯ）、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ４”を入力し（ステップＳ２２）、更にエラーが発生したアドレスを示す値であるＥｒｒ＿ＡＤＤＲに異常のあったＲＯＭ２００のデータのアドレスを入力して、ステップＳ２５へと進む。
【００２４】
本実施形態に係る演算装置において、非数を発生させる原因となり得るのは、汎用レジスタ１１０、データバス１５０、ＡＬＵ.Ｆ１２０、ＲＯＭ２００、及びＲＡＭ３００のいずれかである。よって、ここまでのチェック処理（即ち、ステップＳ１１、ステップＳ１４、ステップＳ１７、ステップＳ２０の各処理）のいずれでもエラーがなかった場合には、残るＲＡＭ３００に非数が発生する原因があると判断できる。このため、ステップＳ２０の処理でもエラーがなかった場合には（ステップＳ２１：ＹＥＳ）、ＲＡＭ３００にエラーがあると判断して、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ５”を入力する（ステップＳ２４）。ただし、ＲＯＭ２００のデータをチェックした場合と同様に、実際にＲＡＭ３００のデータをチェックしてエラーの有無を判断してもよい。
【００２５】
非数が発した原因となる部位が判明したら（即ち、チェク処理の結果としてＦｌａｇ＿Ｅｒｒに何らかの入力が完了したら）、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ５”が入力されているか否かを判定する（ステップＳ２５）。即ち、非数が発生した原因がＲＡＭ３００のデータであるか否かを判定する。Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ５”が入力されている場合には（ステップＳ２５：ＹＥＳ）、演算データを上書きして（ステップＳ２６）、一連の処理を終了する。一方、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ５”が入力されていない場合には（ステップＳ２５：ＮＯ）、演算データは上書きせずに（即ち、ステップＳ２６は省略して）、一連の処理を終了する。
【００２６】
＜演算処理の最上位処理＞
次に、本実施形態に係る演算装置１０による演算処理の最上位処理について、図３を参照して説明する。図３は、本実施形態に係る演算装置による演算処理の最上位処理の流れを示すフローチャートである。
【００２７】
図３に示すように、演算処理の最上位処理では、まずＦｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ１”及び“ＥＲＲＯＲ２”が入力されていない状態であるか否かを判定する（ステップＳ３１）。即ち、非数が発生した要因が汎用レジスタ１１０及びデータバス１５０のいずれでもないのか否かを判定する。
【００２８】
Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ１”及び“ＥＲＲＯＲ２”が入力されていない状態である場合（ステップＳ３１：ＹＥＳ）、通常処理１、通常処理２、…、通常処理Ｎをコールして順次実行していく（ステップＳ３２〜ステップＳ３４）。一方で、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ１”又は“ＥＲＲＯＲ２”が入力されている状態である場合（ステップＳ３１：ＹＥＳ）、フェールセーフを実行する（ステップＳ３５）。
【００２９】
上述したように、本実施形態に係る演算装置１０では、非数が発生した要因が汎用レジスタ１１０及びデータバス１５０のいずれでもない場合には、通常の演算処理が実行され、非数が発生した要因が汎用レジスタ１１０又はデータバス１５０のいずれかであった場合には、フェールセーフが実行される（言い換えれば、通常の演算処理は実行されない）。なお、フェールセーフは、演算結果に非数が発生したことに起因する不具合を防止するための処理である。
【００３０】
＜通常処理＞
次に、本実施形態に係る演算装置１０による通常処理（即ち、図３のステップＳ３２からステップＳ３４の各処理）について、図４を参照して説明する。図４は、本実施形態に係る演算装置による通常処理の流れを示すフローチャートである。
【００３１】
図４に示すように、通常処理時には、まずＦｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ４”が入力されていない状態であるか否かを判定する（ステップＳ４１）。即ち、非数が発生した要因がＲＯＭ２００のデータではないのか否か（言い換えれば、非数が発生した要因が、この時点で残された可能性であるＡＬＵ.Ｆ１２０であるか否か）を判定する。
【００３２】
Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ４”が入力されていない状態ではない場合（ステップＳ４１：ＮＯ）、簡易制御ロジックによる演算処理を実行する（ステップＳ４２）。即ち、非数の発生した原因がＲＯＭ２００ではなく、ＡＬＵ.Ｆ１２０にあると判定できる場合には、簡易制御ロジックが採用された上で、通常の演算処理が実行される。簡易制御ロジックでは、例えば、制御状態等の主要パラメータによって、当該処理の代表値を返すようにすればよい。より具体的には、例えば代表値テーブルを、制御状態の入力データによって探索すればよい。この場合、エラーのあるＡＬＵ.Ｆ１２０を使用しないように、扱うパラメータは浮動小数点ではなく、整数型のデータとする。
【００３３】
Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ４”が入力されていない状態である場合（ステップＳ４１：ＹＥＳ）、Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ３”が入力されており、且つ、演算処理がＥｒｒ＿ＡＤＤＲのデータを使用するものであるか否かを判定する（ステップＳ４３）。即ち、非数が発生した要因がＲＯＭ２００のデータであり、且つ、異常の見つかったアドレスのデータを使用して演算処理を実行するのか否かを判定する。
【００３４】
Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ３”が入力されており、且つ、演算処理がＥｒｒ＿ＡＤＤＲのデータを使用するものであると判定された場合（ステップＳ４３：ＹＥＳ）、ＲＯＭ値を使用しない制御ロジックで演算処理を実行する（ステップＳ４４）。この場合の制御ロジックは、上述した簡易制御ロジックと同じであってもよい。また、ＡＬＵ.Ｆに以上はないと判断できる状態なので、浮動小数点演算を実施してもよい。
【００３５】
Ｆｌａｇ＿Ｅｒｒに“ＥＲＲＯＲ３”が入力されていない、又は、演算処理がＥｒｒ＿ＡＤＤＲのデータを使用するものではないと判定された場合（ステップＳ４３：ＮＯ）、通常の演算処理（浮動小数点演算）を実行する（ステップＳ４５）。
【００３６】
＜技術的効果＞
次に、本実施形態に係る演算装置１０によって得られる技術的効果について、図５を参照して説明する。図５は、非数発生要因とその場合の対処方法とを示す表である。なお、図中の〇は“正常”、×は“異常（エラー）”、−は“チェック不要”を意味している。
【００３７】
図５に示すように、本実施形態に係る演算装置１０では、エラー処理を実行することで、ＡＬＵ.Ｆの演算結果に非数が発生した原因（非数発生要因）がどの部位にあるか否かを判定し、その判定結果に応じて相異なる対処を行う。
【００３８】
具体的には、（１）の汎用レジスタ１１０のチェック（即ち、図２のステップＳ１１の処理）でエラーが見つかった場合には、非数発生要因が汎用レジスタ１１０のハード故障であると判断し、コントロール（即ち、通常の演算処理）を継続しない。（２）のデータバス１５０のチェック（即ち、図２のステップＳ１４の処理）でエラーが見つかった場合には、データバス１５０の故障であると判断し、同様にコントロールを継続しない。
【００３９】
汎用レジスタ１１０又はデータバス１５０でエラーが見つかった場合には、その後の演算処理を継続することが極めて困難となる。このため、コントロールを継続しないことを選択する（フェールセーフを実行する）ことで、システム異常による不具合を最小限に抑えることができる。
【００４０】
（３）のＡＬＵ.Ｆ１２０のチェック（即ち、図２のステップＳ１７の処理）でエラーが見つかった場合には、非数発生要因がＡＬＵ.Ｆ１２０の故障であると判断し、ＡＬＵ１３０だけを使った簡易ロジックでコントロールを継続する。（４）のＲＯＭ２００のデータチェック（即ち、図２のステップＳ２０の処理）でエラーが見つかった場合には、非数発生要因がＲＯＭ２００のデータ値の異常であると判断し、異常のあるデータを使用しない範囲でコントロールを継続する。（５）のＲＡＭ３００のデータチェック（すでに説明したように、省略可能）でエラーが見つかった場合には、非数発生要因がＲＡＭ３００のデータ値の異常であると判断し、演算結果のデータを書き換えてコントロールを継続する。
【００４１】
ＡＬＵ.Ｆ１２０、ＲＯＭ２００、又はＲＡＭ３００のいずれかでエラーが見つかった場合には、何らかの対策を行うことで演算処理自体は継続して実行することが可能である。このため、コントロールを継続しない場合と比較すると、演算装置の機能低下を抑制することができる。
【００４２】
＜付記＞
以上説明した実施形態から導き出される発明の各種態様を以下に説明する。
【００４３】
（付記１）
付記１に記載の演算装置は、汎用レジスタ、浮動小数点演算器、及び固定小数点演算器を有するＣＰＵと、前記ＣＰＵにデータバスを介して接続されたＲＯＭ及びＲＡＭとを備える演算装置であって、演算制御における前記浮動小数点演算器の演算結果が非数であった場合に、前記汎用レジスタ、前記浮動小数点演算器、前記データバス、前記ＲＯＭ、又は前記ＲＡＭのいずれが原因で前記演算結果が非数になったのかを特定する特定手段と、（ｉ）前記特定された原因が、前記浮動小数点演算器、前記ＲＯＭ、又は前記ＲＡＭのいずれかであった場合には、前記演算制御を継続させ、（ｉｉ）前記特定された原因が、前記汎用レジスタ、又は前記データバスのいずれかであった場合には、前記演算制御を中止して、フェールセーフ処理へと移行させる対処手段とを備える。
【００４４】
付記１に記載の演算装置によれば、浮動小数点演算器の演算結果が非数であった原因が、演算装置のどの部位であるかによって、相異なる対処が実行される。具体的には、浮動小数点演算器、ＲＯＭ、又はＲＡＭのいずれかであった場合には、演算制御が続行される。一方、浮動小数点演算器の演算結果が非数であった原因が、汎用レジスタ又はデータバスのいずれかであった場合には、演算制御が中止され、フェールセーフへと移行する。
【００４５】
非数の原因が、浮動小数点演算器、ＲＯＭ、又はＲＡＭのいずれかである場合には、フェールセーフへと移行せずとも、条件次第で演算制御を続行することが可能である。具体的には、例えば演算データの上書き、一部データの不使用、簡易ロジックの設定等を行うことで、演算制御を続行することができる。このように、演算結果が非数となった場合であっても、簡易的な対処を行いつつ演算制御を続行することで、演算装置としての機能が大きく低下してしまうことを抑制できる。
【００４６】
他方、非数の原因が、汎用レジスタ又はデータバスのいずれかである場合には、演算制御を続行することが非常に困難であるため、即座にフェールセーフへと移行することが好ましい。演算制御を中止してフェールセーフへと移行すれば、演算結果が非数であることに起因する異常の発生を、確実に抑制することが可能である。
【００４７】
本発明は、上述した実施形態に限られるものではなく、請求の範囲及び明細書全体から読み取れる発明の要旨或いは思想に反しない範囲で適宜変更可能であり、そのような変更を伴う演算装置もまた本発明の技術的範囲に含まれるものである。
【符号の説明】
【００４８】
１０  演算装置
１００  ＣＰＵ
１１０  汎用レジスタ
１２０  ＡＬＵ.Ｆ
１３０  ＡＬＵ
１５０  データバス
２００  ＲＯＭ
２５０  命令バス
３００  ＲＡＭ
４００  割り込みコントローラ
【図１】
2019106042.tif 000003
【図２】
2019106042.tif 000004
【図３】
2019106042.tif 000005
【図４】
2019106042.tif 000006
【図５】
2019106042.tif 000007