(57)【特許請求の範囲】
【請求項１】
レジスタと、
演算対象となる数値を前記レジスタに格納する前処理回路と、
前記レジスタに数値が格納されるごとに、前記レジスタに格納された数値に基づいて、前記演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測する解予測回路と、
前記解予測回路で予測された前記部分解を用いた所定の演算により、中間値を示す数値を生成し、前記中間値に対して符号拡張により拡張符号ビットを付加した数値を前記レジスタに格納する中間値計算回路と、
前記解予測回路で予測された前記部分解を順次取得し、前記解を生成する解生成回路と、
前記レジスタに格納された前記中間値の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力するエラー検出回路と、
を有することを特徴とする演算回路。
【請求項２】
前記エラー検出回路は、前記レジスタにおける前記中間値の前記符号ビットの位置と、前記拡張符号ビットの位置とに接続された排他的論理和回路であることを特徴とする請求項１記載の演算回路。
【請求項３】
除算における除数を格納する除数レジスタを更に有し、
前記前処理回路は、除算における被除数を前記レジスタに格納し、除算における前記除数を前記除数レジスタに格納し、
前記解予測回路は、前記被除数を前記除数で除算した商の前記部分解を予測し、
前記中間値計算回路は、前記レジスタに格納された数値から、前記解予測回路で予測された前記部分解と前記除数との乗算結果を減算して中間剰余を生成し、前記中間剰余を前記中間値とすることを特徴とする請求項１または２記載の演算回路。
【請求項４】
前記中間値計算回路は、
前記解予測回路で予測された前記部分解と前記除数とを乗算し、乗算結果の符号を反転して加算値を生成する加算値生成回路と、
前記加算値生成回路で生成された前記加算値を、前記レジスタ内の数値に加算する加算器と、
を有することを特徴とする請求項３記載の演算回路。
【請求項５】
前記前処理回路は、平方根演算における演算対象の数値を前記レジスタに格納し、
前記解予測回路は、前記演算対象の数値の平方根の前記部分解を予測することを特徴とする請求項１または２記載の演算回路。
【請求項６】
前記中間値計算回路は、
前記解予測回路で予測された前記部分解を平方根演算の解に含めた場合の解の自乗と前記演算対象の数値との差分を得るのに用いられる、前記レジスタに格納されている数値への加算値を算出する加算値生成回路と、
前記加算値生成回路で生成された前記加算値を、前記レジスタ内の数値に加算する加算器と、
を有することを特徴とする請求項５記載の演算回路。
【請求項７】
前記レジスタは、第１のレジスタと第２のレジスタとの２つであり、
前記解予測回路は、前記第１のレジスタと前記第２のレジスタとに格納された数値に基づいて前記部分解を予測し、
前記中間値計算回路は、前記所定の演算の最終段階で行われる加算における繰り上げを除外した各桁の和を前記第１のレジスタに格納し、最終段階で行われる加算の各桁の繰り上げを示す値を前記第２のレジスタに格納し、
前記エラー検出回路は、前記第１のレジスタと前記第２のレジスタとに格納された数値を加算し、加算結果の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力することを特徴とする請求項１記載の演算回路。
【請求項８】
前記排他的論理和回路は、前記レジスタにおける前記中間値の前記符号ビットの位置と、前記符号ビットの１ビット上位の位置とに接続されていることを特徴とする請求項２記載の演算回路。
【請求項９】
演算対象となる数値を格納する記憶装置と、
レジスタと、
前記演算対象となる数値を、前記記憶装置から読み出し、前記レジスタに格納する前処理回路と、
前記レジスタに数値が格納されるごとに、前記レジスタに格納された数値に基づいて、前記演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測する解予測回路と、
前記解予測回路で予測された前記部分解を用いた所定の演算により、中間値を示す数値を生成し、前記中間値に対して符号拡張により拡張符号ビットを付加した数値を前記レジスタに格納する中間値計算回路と、
前記解予測回路で予測された前記部分解を順次取得し、前記解を生成する解生成回路と、
前記レジスタに格納された前記中間値の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力するエラー検出回路と、
を有することを特徴とする演算処理装置。
【請求項１０】
前記エラー検出回路は、前記レジスタにおける前記中間値の前記符号ビットの位置と、前記拡張符号ビットの位置とに接続された排他的論理和回路であることを特徴とする請求項９記載の演算処理装置。
【請求項１１】
演算回路の演算処理方法において、
前記演算回路が有する前処理回路が、演算対象となる数値をレジスタに格納するステップと、
前記演算回路が有する解予測回路が、前記レジスタに数値が格納されるごとに、前記レジスタに格納された数値に基づいて、前記演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測するステップと、
前記演算回路が有する中間値計算回路が、前記解予測回路で予測された前記部分解を用いた所定の演算により、中間値を示す数値を生成し、前記中間値に対して符号拡張により拡張符号ビットを付加した数値を前記レジスタに格納するステップと、
前記演算回路が有する解生成回路が、前記解予測回路で予測された前記部分解を順次取得し、前記解を生成するステップと、
前記演算回路が有するエラー検出回路が、前記レジスタに格納された前記中間値の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力するステップと、
を有することを特徴とする演算処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算回路および演算処理装置ならびに演算処理方法に関する。
【背景技術】
【０００２】
論理演算回路には、加減算器、除算器、平方根演算器などがある。電子回路による除算や平方根演算手法としては、引戻し法（復元法・回復型）・引離し法（非回復型）・ＳＲＴ法などがある。これらの演算アルゴリズムは、商または平方根をｎ桁（ｎは自然数）ずつ求める演算を繰り返し行う計算手法である。商または平方根の桁数は、演算の繰り返し回数に比例することが特徴である。以下、このような演算手法は、筆算と同様に減算と桁のシフトとを繰り返すことから、減算シフト型演算と呼ぶことにする。
【０００３】
減算シフト型演算回路は、誤作動検出装置で誤作動を検出することで、信頼性を向上させることができる。例えば、被除数および除数が零でないのに、除算装置で求めた商を正規化する前の中間的な商の最上位の桁、および最上位の桁よりも１桁上位の商のあふれの桁の２桁が零の場合、誤作動信号を発生させる誤動作検出回路が考えられている。これにより、商が誤って零になるような誤動作が検出できる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開昭６２−２１２７２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、減算シフト型演算論理に発見される論理障害の中には、演算過程で生じる演算データのデータパターンのうち、極めて稀なデータパターンでのみ異常動作をしてしまうものがある。減算シフト型演算回路でこのようなエラーが発生し易い論理的な場所は分かっているが、その部分の論理に間違いがないことを証明する方法が見つかっていない。そのため現状では、極めて稀なデータパターンで発生する論理障害を発見するためには、論理図面などの目視確認と論理シミュレーションによる動作検証実績の積み重ねに頼るしかない。ここで、論理図面などの目視確認による論理障害検出は、論理障害を適切に検出できるか否かが作業者の能力に依存することとなり、確実な信頼性確保手段とはいえない。他方、論理シミュレーションによる論理障害検出は、演算器レベルでの小規模な回路であれば、時間を十分にかけて検証実績を積めば高い信頼性を確保できる。
【０００６】
しかし、論理シミュレーションによる動作検証を行ったとしても、回路規模が大きくなると、減算シフト型演算器の十分な信頼性を得ることは困難である。すなわち、大規模システムレベルでの論理シミュレーションや、実機検証では一演算器のチェックにかけられる時間には限界がある。このような時間的制約のため、論理シミュレーションで減算シフト型演算器バグを確実に発見するのは困難である。そのため、演算器の論理品質の向上に限界があった。
【０００７】
完全な動作検証による障害の事前回避が困難であったとしても、誤った計算結果を後処理に渡さないようにできれば、信頼性を担保できる。そのため、演算動作中に希に発生する誤動作であっても、その誤動作を確実に検出する技術が求められる。
【０００８】
本発明はこのような点に鑑みてなされたものであり、演算動作中に発生する誤動作を確実に検出することができる演算回路および演算処理装置ならびに演算処理方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、以下の演算回路が提供される。演算回路は、レジスタ、前処理回路、解予測回路、中間値計算回路、解生成回路、およびエラー検出回路を有する。前処理回路は、演算対象となる数値をレジスタに格納する。解予測回路は、レジスタに数値が格納されるごとに、レジスタに格納された数値に基づいて、演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測する。中間値計算回路は、解予測回路で予測された部分解を用いた所定の演算により、中間値を示す数値を生成し、中間値に対して符号拡張により拡張符号ビットを付加した数値をレジスタに格納する。解生成回路は、解予測回路で予測された部分解を順次取得し、解を生成する。エラー検出回路は、レジスタに格納された中間値の符号ビットと、拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力する。
【発明の効果】
【００１０】
上記演算回路では、演算動作中に発生する誤作動を確実に検出することができる。
【図面の簡単な説明】
【００１１】
【図１】第１の実施の形態に係る演算回路を示す図である。
【図２】第２の実施の形態に係る除算器の例を示す図である。
【図３】中間剰余レジスタと排他的論理和回路との接続例を示す図である。
【図４】部分商の判定が正常に行われた除算の例を示す図である。
【図５】部分商の判定を誤った除算の例を示す図である。
【図６】第３の実施の形態に係る除算器の例を示す図である。
【図７】第４の実施の形態に係る平方根演算器の例を示す図である。
【図８】部分平方根の判定が正常に行われた平方根演算の例を示す図である。
【図９】部分平方根の判定を誤った平方根演算の例を示す図である。
【図１０】第５の実施の形態に係る平方根演算器の例を示す図である。
【図１１】演算処理装置の例を示す図である。
【発明を実施するための形態】
【００１２】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態に係る演算回路を示す図である。演算回路は、レジスタ１、前処理回路２、解予測回路３、中間値計算回路４、解生成回路５、およびエラー検出回路６を有する。
【００１３】
レジスタ１は、少なくとも１つ設けられる。レジスタ１には、中間値計算回路４で生成された中間値１ａと、その中間値１ａの符号拡張により中間値１ａに付与された拡張符号１ｂが格納される。
【００１４】
前処理回路２は、演算対象となる数値をレジスタ１に格納する。例えば除算器を行う場合、前処理回路２は、被除数をレジスタ１に格納する。また演算対象の数値の平方根を演算する場合、前処理回路２は、演算対象の数値をレジスタ１に格納する。なお、除算を行う場合、除数を格納するレジスタを別途設け、前処理回路２は、別途設けたレジスタに除数を格納する。
【００１５】
解予測回路３は、レジスタ１に数値が格納されるごとに、レジスタ１に格納された数値に基づいて、演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測する。例えば、除算を行う場合、解予測回路３は、商の一部の桁の値である部分商を、上位の桁から順に予測する。また平方根演算を行う場合、解予測回路３は、平方根の一部の桁の値である部分平方根を、上位の桁から順に予測する。
【００１６】
中間値計算回路４は、解予測回路３で予測された部分解を用いた所定の演算により、中間値を示す数値を生成する。そして中間値計算回路４は、中間値に対して符号拡張により拡張符号ビットを付加した数値を、レジスタ１に格納する。
【００１７】
解生成回路５は、解予測回路３で予測された部分解を順次取得し、解を生成する。例えば、除算が行われた場合、解生成回路５は、解予測回路３から部分商を取得し、商を生成する。また、平方根演算が行われた場合、解生成回路５は、解予測回路３から部分平方根を取得し、平方根を生成する。
【００１８】
エラー検出回路６は、レジスタ１に格納された中間値１ａの符号ビットと、拡張符号１ｂのいずれかの拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力する。例えばエラー検出回路６は、レジスタ１における中間値１ａの符号ビットの位置と、拡張符号ビットの位置とに接続された排他的論理和回路６ａである。排他的論理和回路６ａは、レジスタ１から符号ビットと拡張符号ビットとの値を取得し、それらのビットの排他的論理和を出力する。排他的論理和回路６ａの出力が１となった場合、その出力信号がエラー信号となる。
【００１９】
このような構成の演算回路によれば、前処理回路２によって演算対象となる数値がレジスタ１に格納される。すると、解予測回路３により部分解が予測される。次に解予測回路３で予測された部分解に基づいて、中間値計算回路４で中間値が生成される。生成された中間値は符号拡張され、中間値計算回路４によってレジスタ１に格納される。
【００２０】
中間値がレジスタ１に格納されると、その中間値に基づいて、解予測回路３によって既に予測されている桁の下位の桁の部分解が予測される。すると、新たに予測された部分解に基づいて中間値計算回路４で中間値が生成される。生成された中間値は、符号拡張され、レジスタ１に格納される。このような部分解の予測と中間値の更新とが、所定の桁数までの部分解の予測が完了するまで繰り返し実行される。
【００２１】
解生成回路５では、解予測回路３で予測された部分解を組み合わせて解が生成される。
また、レジスタ１に中間値が格納されるごとに、エラー検出回路６でエラー検出が行われる。すなわち、解予測が正しく行われている場合、中間値の符号ビットと、符号拡張された拡張符号ビットとは同じ値である。そのため、エラー検出回路６からエラー信号は出力されない。解予測回路３が部分解の予測を誤ると、中間値計算回路４により生成される中間値も誤った値となる。誤った部分解が予測されると、それ以後、解の予測と中間値生成が繰り返されることで、中間値がオーバーフローとなる。中間値がオーバーフローすると、中間値の符号ビットに、中間値の最上位の桁の値が格納される。すると、拡張符号１ｂと、中間値の符号ビットとの値が不一致となり、エラー検出回路６からエラー信号が出力される。
【００２２】
このようにして、解予測回路３の解予測の誤りによるエラーを確実に検出することが可能となる。演算回路に組み込まれたエラー検出回路６でエラーを検出するため、演算回路が稼動していれば常時エラーの有無をチェックできる。すなわち、解予測回路３での解予測の誤りが極めて希にしか発生しない場合でも、実際に発生したときにエラー信号を出力できる。エラー信号が出されれば、解生成回路５で生成された解を使用する後処理回路において、誤った解を使用せずに済む。その結果、演算結果の信頼性が向上する。
【００２３】
また、エラー検出回路６で検出されるエラーは、中間値のオーバーフローである。従って、エラー原因の特定が容易になる。
しかも、エラー検出回路６は、例えば排他的論理和回路６ａで実現できる。すなわち、極めて少ない論理の追加で障害検出が可能となる。
【００２４】
なお、上記の説明では、解予測回路３による部分解の予測の誤りによるエラー発生の事例を説明したが、中間値のオーバーフローは、他の原因でも発生する。例えば、ＬＳＩ（Large Scale Integration）の初期不良（トランジスタセルの固定故障）や、放射線等の要因によるソフトエラーのために演算が期待通りの動作をしないこともある。このような故障も、中間値のオーバーフローが発生した時点で障害を発見できる。そこで、図１に示した構成の演算回路を製品のＬＳＩに組み込んでおけば、製品の信頼性を向上する。すなわち、ＲＡＳ（Reliability、Availability、Serviceability）と呼ばれる、信頼性、可用性、保守性が向上する。
【００２５】
ここで、図１に示した演算回路は、すべての除算シフト型演算に適用できる。除算シフト型演算としては、除算や平方根演算がある。除算や平方根演算では、解予測回路３の設計にミスが生じやすい。図１に示した演算回路を用いれば、減算シフト型の除算・平方根演算における、回路設計が難しい解予測回路の動作検証が可能となる。その結果、回路設計ミスによるバグの発生を防止できる。
【００２６】
なお、図１に示した演算回路と等価の回路を用いて論理シミュレーションを行うことで、論理シミュレーション上でも解予測の誤りを検出可能となる。
また、ソフトウェアにより減算シフト型演算を実行する場合も、エラー検出回路６と同様の処理を行うモジュールをプログラムに追加することで、中間値のオーバーフローを検出できる。
【００２７】
このような減算シフト型演算には、例えば除算や平方根演算がある。そこで、以下、除算の例を第２・第３の実施の形態で説明し、平方根演算の例を第４・第５の実施の形態で説明する。
【００２８】
［第２の実施の形態］
第２の実施の形態は、誤動作検出が可能な除算器である。
以下の説明では、まず減算シフト型演算の漸化式と一般的な演算方法を説明する。その後、中間剰余の符号ビットの比較が論理チェッカーとして機能する理由を説明する。
【００２９】
以下のように記号と言葉を定義する。
・被除数＝ｏｐ１
・除数＝ｏｐ２
・基数＝ｋ（＝２ｍ：ｍは自然数)
通常、演算前にｏｐ２の最上位桁とＯＰ１の最上位桁の位置合わせ（桁合わせ）が行われる。桁合わせでは、ＯＰ１とＯＰ２の最上位桁の位置は一致しているか、またはＯＰ１がＯＰ２より一桁小さい値とされる。このように桁合わせされたｏｐ１をＯＰ１、ｏｐ２をＯＰ２とそれぞれ大文字で書くことにする。桁合わせされた前後における被除数と除数とは、以下の関係式で表されるものとする。
ＯＰ１＝ｏｐ１×ｋa：（ａは整数）
ＯＰ２＝ｏｐ２×ｋb：（ｂは整数）
ここで、上記ＯＰ１，ＯＰ２を使って、減算シフト型除算は以下の漸化式で定義される。
ｒ（ｎ）＝ｋ×ｒ（ｎ−１）−ｑ（ｎ−１）×ＯＰ２
ｒ（０）＝ＯＰ１
・・・（１）
この式（１）より、商および中間剰余が算出される。ただし、｜ｒ（ｎ）｜＜ＯＰ２となるように整数ｑ（ｎ−１）を選ぶ。ｑ（ｎ−１）の候補は｜ｑ（ｎ−１）｜＜ｋを満たす範囲に複数存在することがあるが、そのうち１つを任意に選択すればよい。このときのｒ（ｎ）をｎ番目の中間剰余と呼び、ｑ（ｎ−１）を上からｎ桁目の部分商と呼ぶ。
【００３０】
引戻し法（復元法）とはｒ（ｎ）が常に０または正の数となるように整数ｑ（ｎ−１）を選ぶ計算法である。引離し法とはｒ（ｎ）が負の数になることも許す計算法である。
ＳＲＴ法とはｒ（ｎ）に負の数を許し、かつ｜ｒ（ｎ）｜＜ＯＰ２の判定をｒ（ｎ）の上位数ビットのみから判断する計算法である。なお、ＳＲＴ法では、実際には｜ｒ（ｎ）｜＜ＯＰ２の判定を、その元となる右辺のｒ（ｎ−１）の上位数ビットから判断される。
【００３１】
このように引戻し法であれば、ｒ（ｎ）が常に０または正の数に制限される。この場合、ｑ（ｎ−１）の候補として自動的に０または正の数が唯一に決まる。他方、引離し法やＳＲＴ法であれば、ｒ（ｎ）に負の数も許される。この場合、ｑ（ｎ−１）も負の値を取ることがあり、またその候補は複数存在することがある。
【００３２】
また、上から１〜ｎ桁目までの商をＱ（ｎ）と書くことにし、ｑ（ｎ）を用いてＱ（ｎ）を表現すると
Ｑ（ｎ）＝ｑ（０）×ｋn-1＋ｑ（１）×ｋn-2＋…＋ｑ（ｎ−２）×ｋ＋ｑ（ｎ−１）
・・・（２）
と表せる。ただし、この商は桁合わせされた被除数ＯＰ１、除数ＯＰ２のときの商である。
【００３３】
式（１）より
ｒ（ｎ）＝ｋ×ｒ（ｎ−１）？ｑ（ｎ−１）×ＯＰ２
＝ｋ×｛ｋ×ｒ（ｎ−２）？ｑ（ｎ−２）×ＯＰ２｝？ｑ（ｎ−１）×ＯＰ２
＝ｋ2×ｒ（ｎ−２）？｛ｋ×ｑ（ｎ−２）＋ｑ（ｎ−１）｝×ＯＰ２
＝ｋ3×ｒ（ｎ−３）？｛ｋ2×ｑ（ｎ−３）＋ｋ×ｑ（ｎ−２）＋ｑ（ｎ−１）｝×ＯＰ２
：
＝ｋn×ｒ（０）？｛ｋn-1×ｑ（０）＋ｋn-2×ｑ（１）＋…＋ｋ2×ｑ（ｎ−３）＋ｋ×ｑ（ｎ−２）＋ｑ（ｎ−１）｝×ＯＰ２
＝ｋn×ｒ（０）？Ｑ（ｎ）×ＯＰ２
・・・（３）
⇔ｒ（０）＝｛Ｑ（ｎ）×ＯＰ２＋ｒ（ｎ）｝／ｋn
＝｛Ｑ（ｎ）×ｋb／ｋn｝×ｏｐ２＋ｒ（ｎ）／ｋn
（ＯＰ２＝ｏｐ２×ｋbより）
・・・（４）
⇔ｏｐ１＝｛Ｑ（ｎ）×ｋb／ｋn+a｝×ｏｐ２＋ｒ（ｎ）／ｋn+a
（ｒ（０）＝ＯＰ１＝ｏｐ１×ｋaより）
・・・（５）
式（４）は、式（３）をｒ（０）について解き、ＯＰ２をｏｐ２に置き換えたものである。そのため、式（３）と式（４）とは同値（記号⇔で表される）となる。式（５）は、式（４）のｒ（０）をＯＰ１に置き換え、さらにＯＰ１をｏｐ１に置き換えたものである。そのため、式（４）と式（５）とは同値である。
【００３４】
被除数ｏｐ１、除数ｏｐ２の場合、商と剰余の関係式がｏｐ１＝商×ｏｐ２＋剰余である。このことと、式（３）、（４）、（５）により、
商＝Ｑ（ｎ）×ｋb／ｋn+a                          ・・・（６）
剰余＝ｒ（ｎ）／ｋn+a                              ・・・（７）
となる。
【００３５】
通常、固定小数除算の場合は、上記の商を示す式（６）および剰余を示す式（７）が整数であり続ける最大のｎまで式（１）の演算が繰り返される。
浮動小数除算の場合は、Ｑ（ｎ）が必要な桁数（＝有効数字＋α）に達するまで式（１）の演算を繰り返す。例えばＩＥＥＥ７５４で定義されている単精度浮動小数点数なら仮数部２３ビットの有効数字、倍精度なら仮数部５２ビットの有効数字が使用される。有効数字に必要なビット数に、暗黙の１と呼ばれる整数部１ビットと、丸めに必要な下位数ビットとを加えた合計が、必要な桁数となる。ここで「丸め」とは、数値を一定の規則に従って近似値で表現することであり、例えば有効数字以下の値の四捨五入が行われる。
【００３６】
以上が減算シフト型除算についての説明である。この演算を実行する演算回路の論理設計で注意を要するのは、式（１）の演算と、｜ｒ（ｎ）｜＜ＯＰ２となるように整数ｑ（ｎ−１）を選ぶ選び方である。
【００３７】
特に、論理ミスを起こしやすくその発見が難しいのが｜ｒ（ｎ）｜＜ＯＰ２の判定論理である。１９９０年代には、パーソナルコンピュータで使用されるＣＰＵ（Central Processing Unit）の浮動小数点除算にＳＲＴ法を用いたが、ある特定の入力値に対して演算結果を誤ることが製品の出荷後に判明し、リコールに至ってしまったという事例もある。この事例においても、｜ｒ（ｎ）｜＜ＯＰ２判定を誤ったことが原因である。なお、演算結果を誤る頻度が極めて少ないとしても、演算結果の正しさが保証されていないと科学技術計算に使用できない。そこで、誤った演算結果を後処理に渡さない回路を組み込むことが重要となる。
【００３８】
本実施の形態は、｜ｒ（ｎ）｜＜ＯＰ２の判定を間違えた場合、判定誤りを検出してエラーを出力するものである。以下、｜ｒ（ｎ）｜＜ＯＰ２の判定誤りを検出する論理について説明する。
【００３９】
まずは｜ｒ（ｎ）｜＜ＯＰ２の判定を間違えた場合、その後の演算の動きがどうなるのかを考察する。
｜ｒ（ｎ）｜＜ＯＰ２の判定を間違えると、間違った部分商ｑ（ｎ−１）が選ばれる。すると、それ以降ずっと｜ｒ（ｎ）｜≧ＯＰ２となり、中間剰余が二度と収束しなくなってしまう。その理由は以下の通りである。
｜ｒ（ｎ）｜≧ＯＰ２とすると
｜ｒ（ｎ＋１）｜＝｜ｋ×ｒ（ｎ）−ｑ（ｎ）×ＯＰ２｜
≧｜ｋ×（±ＯＰ２）−ｑ（ｎ）×ＯＰ２｜
＝｜±ｋ−ｑ（ｎ）｜×ＯＰ２
≧ＯＰ２（｜整数ｑ（ｎ）｜＜ｋより）
・・・（８）
式（８）は｜ｒ（ｎ）｜≧ＯＰ２が満たされると、常に｜ｒ（ｎ＋１）｜≧ＯＰ２が満たされることを示している。すなわち、一度判定誤りを起こすと、その後も誤り続けることが示されている。
【００４０】
一度判定誤りを起こすと、演算は上記のような中間剰余が発散した状態を続ける。多くの場合、または発散した状態による演算を繰り返すうちに、中間剰余の上位ビットがオーバーフロー（桁あふれ）を起こす。中間剰余の上位ビットがオーバーフローを起こすと、演算器の桁数範囲を越えてしまうため、誤った中間剰余（上位ビットが欠損した中間剰余）が発生する。誤った中間剰余が発生すると、それ以降誤った中間剰余と中間商を算出し続ける。このように｜ｒ（ｎ）｜＜ＯＰ２の判定誤りが発生すると、中間剰余が発散した状態を続けるか、誤った中間剰余と中間商を算出し続けるかのどちらかである。いずれにせよ商は正しい期待値とは一致しなくなる。
【００４１】
本実施の形態では、上記エラー状態のうち特に、中間剰余がオーバーフローしたことを検出することで、判定誤りの発生を検出する。
以下、論理演算が、符号拡張機能を有するディジタル回路によって構成されているものとする。符号拡張とは、符号付の数値を表現するビット列が格納領域のビット幅より短い場合に、空いたビットに適切な値を設定することによって数値としての同一性を維持する手法である。本実施の形態では、符号ビットと同じ値を上位のビットに書き込むことで符号拡張が行われるものとする。
【００４２】
演算前の桁合わせにより、式（１）の初期値としての被除数ＯＰ１＝ｒ（０）とＯＰ２の最上位桁の位置は一致しているか、またはＯＰ１＝ｒ（０）がＯＰ２より一桁小さい値となる。それ以降も論理的に間違いがなければ｜ｒ（ｎ）｜＜ＯＰ２を満たしながら演算が続く。そのため、ｒ（ｎ）の最上位桁の位置はＯＰ２の最上位桁の位置を超えることはない。よって論理的に間違いがなければＯＰ２の符号ビットの位置は、ｒ（ｎ）にとっても符号ビットの位置となる。符号付きディジタル回路では、符号拡張により、符号ビットの値はその上位に全て同じ値がコピーされる。つまり符号ビットと、符号ビットの上位のビットとを比較すれば必ず同じ値になる。もしも符号ビットと、符号ビットの上位の拡張符号ビットとの値が異なってしまったときは、オーバーフローが発生したことで符合ビットの位置までデータが溢れてきたと判断できる。
【００４３】
ここでＯＰ２の最上位桁のすぐ隣の符号ビットの位置（符号ビット列中の最も右側にある符号ビット）をｓ０、そのひとつ上位の符号ビット（拡張符号ビット）の位置をｓ１とする。このとき、ｒ（ｎ）の排他的論理和（ｓ０  ｘｏｒ  ｓ１）の演算結果を見るだけで論理障害の検出が可能になる。すなわち、問題がない時は排他的論理和（ｓ０  ｘｏｒ  ｓ１）＝０であり、エラーが発生すれば排他的論理和（ｓ０  ｘｏｒ  ｓ１）＝１となる。
【００４４】
このような判定誤り検出実現に用いられる追加論理回路は、排他的論理和回路（xorゲート）１つだけで実現することができる。
図２は、第２の実施の形態に係る除算器の例を示す図である。除算器には、前処理回路１１が設けられている。前処理回路１１は、被除数と除数との桁合わせ処理などの前処理を行う。前処理回路１１の出力信号線は、中間剰余レジスタ１２と除数レジスタ１３とに接続されている。前処理回路１１は、桁合わせ後の被除数であるＯＰ１を中間剰余レジスタ１２に格納する。また、前処理回路１１は、桁合わせ後の除数であるＯＰ２を除数レジスタ１３に格納する。
【００４５】
中間剰余レジスタ１２は、中間剰余を格納するレジスタである。例えばＩＥＥＥ７５４で定義されている倍精度浮動小数点なら、６４ビット幅のレジスタを中間剰余レジスタ１２として使用できる。中間剰余レジスタ１２の出力信号線は、商予測回路１４と加算器１６とに接続されている。また、中間剰余レジスタ１２の出力信号線は、除算器の除算結果として得られる最終剰余の後処理を行う回路（図示せず）に接続されている。
【００４６】
商予測回路１４は、中間剰余レジスタ１２に設定された中間剰余に基づいて部分商ｑ（ｎ−１）を予測する。ここで商予測回路１４は、除数ＯＰ２と中間剰余との組み合わせパターンにおいて、式（１）の演算の結果、｜ｒ（ｎ）｜＜ＯＰ２となる部分商ｑ（ｎ−１）を決定する。しかし、商予測回路１４に論理障害があり、その障害を活性化させるような除数ＯＰ２と中間剰余との特別な組み合わせパターンが発生する場合、またはトランジスタセルの固定故障や放射線等の要因によるソフトエラーが発生する場合がある。これらの場合、商予測回路１４が、｜ｒ（ｎ）｜＜ＯＰ２を満たさない部分商ｑ（ｎ−１）を予測する可能性がある。商予測回路１４の出力信号線は、加算値生成回路１５と商生成回路１７とに接続されている。
【００４７】
なお、図２では商予測回路１４と除数レジスタ１３との接続関係を省略しているが、商予測回路１４は除数レジスタ１３に格納された除数を参照できる。そして、商予測回路１４は、除数を用いて部分商を予測できる。
【００４８】
加算値生成回路１５は、中間剰余に加算する値を算出する。具体的には、加算値生成回路１５は、商予測回路１４が予測した部分商ｑ（ｎ−１）に除数レジスタ１３から取得した除数ＯＰ２を乗算する。加算値生成回路１５は乗算結果に−１を乗算する。−１を乗算することで符号が反転される。加算値生成回路１５の演算結果を出力する出力信号線は、加算器１６に接続されている。
【００４９】
加算器１６は、入力された値を加算する。具体的には、加算器１６は、中間剰余レジスタ１２に格納されている中間剰余と、加算値生成回路１５で算出された値とを加算する。加算器１６の加算結果を出力する出力信号線は、中間剰余レジスタ１２に接続されている。すなわち、加算器１６による加算結果が、中間剰余として中間剰余レジスタ１２に格納される。
【００５０】
なお、除数と部分商とが共に正であれば、加算値生成回路１５の演算結果は負の値となる。この場合、加算器１６における演算は、中間剰余から加算値生成回路１５の演算結果の絶対値を減算する演算に等しい。本実施の形態では、負の数を２の補数で表す。２の補数表現は、符号以外の値のバイナリ表現の各ビットを否定（値を反転）させ、１を加えたものである。すなわち加算値生成回路１５は、演算結果が負の数であれば、２の補数表現の演算結果を出力する。この場合、加算器１６では中間剰余に加算値生成回路１５の演算結果を加算し、最上位ビットからのキャリー（１つ上の桁へ繰り上げる数）を無視する。これにより、負の数の加算結果を得ることができる。
【００５１】
商生成回路１７は、商予測回路１４で決定された部分商に基づいて商を生成し、出力する。商生成回路１７の出力信号線は、商レジスタ１８に接続されている。すなわち、商生成回路１７で生成された商が商レジスタ１８に書き込まれる。具体的には、商生成回路１７は、商予測回路１４で部分商が予測されるごとに商レジスタ１８に格納されている商の値を読み込む。次に商生成回路１７は、商レジスタ１８から読み込んだ値を所定の桁だけ上位にシフトさせ、空いた下位の桁に商予測回路１４で決定された部分商を加算する。そして商生成回路１７は、部分商を追加した値を商レジスタ１８に書き込む。
【００５２】
商レジスタ１８は、商を記憶するレジスタである。商レジスタ１８の出力信号線は、商生成回路１７に接続されている。また商レジスタ１８の出力信号線は、最終商として後処理を行う回路（図示せず）に接続されている。
【００５３】
中間剰余レジスタ１２には、排他的論理和回路１９が接続されている。具体的には、中間剰余レジスタ１２内の符号ビットと、符号ビットの上位の１ビットとの出力信号線に、排他的論理和回路１９が接続されている。
【００５４】
図３は、中間剰余レジスタと排他的論理和回路との接続例を示す図である。図３の例では、中間剰余レジスタ１２は６４ビット幅のレジスタである。中間剰余レジスタ１２には、下位から順に、丸め用ビット列１２ａ、中間剰余ビット列１２ｂ、および拡張符号ビット列１２ｃが設けられている。
【００５５】
丸め用ビット列１２ａは、中間剰余レジスタ１２の下位の数ビットである。丸め用ビット列１２ａには、中間剰余を丸めるために使用する値が設定される。例えば、丸め用ビット列１２ａとして、中間剰余レジスタ１２の下位２ビットが使用される。
【００５６】
中間剰余ビット列１２ｂは、丸め用ビット列１２ａの上位に設けられている。中間剰余ビット列１２ｂには、初期値として被除数ＯＰ１が格納される。その後、加算器１６による演算が行われるごとに、演算結果が中間剰余として中間剰余ビット列１２ｂに格納される。例えば、中間剰余ビット列１２ｂとして、中間剰余レジスタ１２内の５３ビット用いられる。
【００５７】
中間剰余ビット列１２ｂの最上位ビットは、符号ビット１２ｄである。符号ビットには、中間剰余の符号を示す値が設定される。中間剰余が正の値であれば符号ビットに０が設定され、中間剰余が負の値であれば符号ビットに１が設定される。
【００５８】
拡張符号ビット列１２ｃは、中間剰余ビット列１２ｂの上位に設けられている。拡張符号ビット列１２ｃには、拡張符号ビットが格納される。例えば加算器１６による演算結果が正の値であれば、拡張符号ビット列１２ｃのすべてのビットに０が設定される。また加算器１６による演算結果が負の値であれば、拡張符号ビット列１２ｃのすべてのビットに１が設定される。
【００５９】
排他的論理和回路１９への入力信号線は、中間剰余ビット列１２ｂの符号ビット１２ｄと、拡張符号ビット列１２ｃの最下位のビット１２ｅとに接続されている。これにより、排他的論理和回路１９に符号ビット１２ｄと、符号ビット１２ｄの上位のビット１２ｅとの値が入力される。そして排他的論理和回路１９において、入力された２つのビットの値の排他的論理和演算が行われる。すなわち排他的論理和回路１９は、入力された２つのビットの値が同じときに０を出力する。また排他的論理和回路１９は、入力された２つのビットの値が異なるときに１を出力する。
【００６０】
図２、図３に示すような回路構成により、除算処理が行われる。除算処理が行われる場合、被除数ｏｐ１と除数ｏｐ２とが前処理回路１１に入力される。すると前処理回路１１により桁合わせが行われ、桁合わせ後の被除数ＯＰ１と除数ＯＰ２とが生成される。除数ＯＰ１は、前処理回路１１により中間剰余レジスタ１２に格納される。除数ＯＰ２は、前処理回路１１により除数レジスタ１３に格納される。
【００６１】
次に中間剰余レジスタ１２に格納された被除数ＯＰ１の最上位の桁の部分商が、商予測回路１４により予測される。予測された部分商は、加算値生成回路１５と商生成回路１７とに入力される。すると商生成回路１７により、商予測回路１４で予測された部分商を商レジスタ１８に格納される。
【００６２】
また加算値生成回路１５では、入力された部分商と除数ＯＰ２とが乗算され、さらに乗算結果の符号が反転される。加算値生成回路１５による演算結果は、加算器１６に入力される。加算器１６では、中間剰余レジスタ１２に格納されている被除数ＯＰ１に、加算器１６の演算結果が加算される。加算結果は中間剰余レジスタ１２に書き込まれる。これにより、中間剰余レジスタ１２の内容が、被除数ＯＰ１から中間剰余に更新される。
【００６３】
中間剰余レジスタ１２の値が更新されると、商予測回路１４により次の桁の部分商が予測される。予測された部分商は、加算値生成回路１５と商生成回路１７とに入力される。すると商生成回路１７により、商レジスタ１８に格納されている値の下位に、商予測回路１４で予測された部分商が追加される。そして商生成回路１７により、新たに予測された部分商を追加した値が商レジスタ１８に格納される。
【００６４】
また加算値生成回路１５では、入力された部分商と除数ＯＰ２とが乗算され、さらに乗算結果の符号が反転される。加算値生成回路１５による演算結果は、加算器１６に入力される。加算器１６では、中間剰余レジスタ１２に格納されている中間剰余に、加算値生成回路１５の演算結果が加算される。加算結果は中間剰余レジスタ１２に書き込まれる。これにより、中間剰余レジスタ１２内の中間剰余の値が更新される。
【００６５】
以後同様に、部分商の予測と、予測された部分商による演算が、必要な桁数の商が得られるまで繰り返し実行される。その結果、商レジスタ１８には、被除数ＯＰ１を除数ＯＰ２で除算したときの商が格納される。また中間剰余レジスタ１２には、被除数ＯＰ１を除数ＯＰ２で除算したときの剰余が格納される。
【００６６】
このような除算の過程において、商予測回路１４が部分商の予測を誤らなければ、拡張符号ビット列１２ｃの最下位のビット１２ｅと符号ビット１２ｄとの値は常に一致する。
図４は、部分商の判定が正常に行われた除算の例を示す図である。図４の例では、簡単のため、数字は８ビットの２進数であるものとする。また、桁合わせは済んでいるものとする。桁合わせ後の被除数ＯＰ１を「＋１１００００００」、除数ＯＰ２を「＋１００００００１」とする。この場合、ＯＰ１÷ＯＰ２＝（＋１１００００００）÷（＋１００００００１）という除算が除算器で行われる。
【００６７】
図４には、左側に除算過程が示されている。また右側に中間剰余レジスタの内容が示されている。中間剰余レジスタの内容のうち、左端の値が拡張符号ビット列の最後尾のビットの値である。そのビットの右側の値が、符号ビットの値である。中間剰余レジスタの内容のうち、右側の８つの通知が中間剰余ビット列の値である。
【００６８】
商予測回路１４では、商の上位の桁から順に１桁ずつ部分商が予測される。中間剰余が正の値の間は、符号ビットとその上位のビットとの値が共に０である。中間剰余が負の値になると、符号ビットとその上位のビットとの値が共に１となる。いずれにしても、商予測が正しく行われていれば、符号ビットとその上位のビットとの値は一致する。
【００６９】
他方、商予測回路１４に論理障害があったとき、またはトランジスタセルの固定故障や、放射線等の要因によるソフトエラーが発生したとき、除算過程において、商予測回路１４が部分商の予測を誤る場合がある。すなわち、式（１）の演算の結果｜ｒ（ｎ）｜＜ＯＰ２を満たさなくなる部分商ｑ（ｎ−１）を、商予測回路１４が予測する場合がある。その場合、中間剰余のオーバーフローが発生し、符号を設定すべき符号ビット１２ｄに中間剰余の符号以外の数値が設定されてしまう。すると、拡張符号ビット列の最下位のビットと符号ビットとの値が不一致となる。
【００７０】
図５は、部分商の判定を誤った除算の例を示す図である。図５の例では、上から４桁目の部分商の判定を誤った場合を示している。すなわち｜ｒ（ｎ）｜＜ＯＰ２という条件を満たすには部分商ｑ（ｎ−１）を１とすべきであるが、商予測回路１４が部分商を０と判定したものとする。
【００７１】
すると４桁目の部分商を用いて計算した中間剰余が、除数ＯＰ２よりも大きくなる。図５の例では、４桁目の部分商を用いて計算した中間剰余は９桁の数値となっており、中間剰余レジスタにおける中間剰余ビット列のビット数を超えている。その結果、中間剰余が発散し、オーバーフローが発生する。オーバーフローが発生した結果、算出された中間剰余の最上位の桁の値が、符号ビットに設定されている。その結果、中間剰余が正の値であるにも拘わらず、符号ビットの値が１になっている。他方、拡張符号ビット列の最下位のビットの値は、以前として０である。その結果、拡張符号ビット列の最下位のビットと符号ビットとの値が不一致となっている。
【００７２】
拡張符号ビット列の最下位のビットと符号ビットとの一致・不一致は、排他的論理和回路１９によって検出される。排他的論理和回路１９の１の出力信号は、エラー通報を示す情報である。
【００７３】
なお、中間剰余が一度発散すると、それ以降どの様な計算が行われるかは不明である。すなわち、図５の右側に示した筆算による計算通りに除算器で計算が続けられるかどうかも不明である。
【００７４】
このように、本実施の形態によれば、中間剰余レジスタ１２に排他的論理和回路１９を接続するだけで、中間剰余のオーバーフローを検出することができる。その結果、商予測回路１４が商予測を誤った場合、エラーを発生させることができる。
【００７５】
しかも排他的論理和回路１９を追加するだけでよいため、商予測の誤り検出機能の追加による回路の大規模化を、最低限におさえることができる。
［第３の実施の形態］
次に第３の実施の形態について説明する。第３の実施の形態は、ＣＳＡ（Carry Save Adder）を用いた除算器である。
【００７６】
図６は、第３の実施の形態に係る除算器の例を示す図である。除算器には、前処理回路２１が設けられている。前処理回路２１は、被除数と除数との桁合わせ処理などの前処理を行う。前処理回路２１の出力信号線は、２つの中間剰余レジスタ２２ａ，２２ｂと除数レジスタ２３とに接続されている。前処理回路２１は、桁合わせ後の被除数であるＯＰ１を、一方の中間剰余レジスタ２２ａに格納する。また、前処理回路２１は、桁合わせ後の除数であるＯＰ２を除数レジスタ２３に格納する。
【００７７】
中間剰余レジスタ２２ａ，２２ｂは、中間剰余をサムとキャリーに分けて格納するレジスタである。例えば中間剰余レジスタ２２ａにサムの値が格納され、中間剰余レジスタ２２ｂにキャリーの値が格納される。中間剰余レジスタ２２ａ，２２ｂの出力信号線は、商予測回路２４とＣＳＡ２６とに接続されている。また、中間剰余レジスタ２２ａ，２２ｂの出力信号線は、加算・オーバーフロー検出回路２９に接続されている。
【００７８】
商予測回路２４は、中間剰余レジスタ２２ａ，２２ｂにサムとキャリーとに分けて設定された中間剰余に基づいて部分商ｑ（ｎ−１）を予測する。商予測回路２４の出力信号線は、加算値生成回路２５と商生成回路２７とに接続されている。
【００７９】
なお、図６では商予測回路２４と除数レジスタ２３との接続関係を省略しているが、商予測回路２４は除数レジスタ２３に格納された除数を参照できる。そして、商予測回路２４は、除数を用いて部分商を予測できる。
【００８０】
加算値生成回路２５は、中間剰余に加算する値を算出する。具体的には、加算値生成回路２５は、商予測回路２４が予測した部分商ｑ（ｎ−１）に除数レジスタ２３から取得した除数ＯＰ２を乗算する。加算値生成回路２５の演算結果を出力する出力信号線は、ＣＳＡ２６に接続されている。
【００８１】
ＣＳＡ２６は、入力された値を加算する。ＣＳＡ２６は、入力値の加算処理を行い、部分剰余をサムとキャリーとに欠けて出力する機能を有している。ＣＳＡで得られるサムは、加算される値の桁ごとの和であり、繰り上げされる値が無視されている。繰り上げられる値は、キャリーとして出力される。具体的には、ＣＳＡ２６は、中間剰余レジスタ２２ａ，２２ｂに格納されている中間剰余を示すサムとキャリー、および加算値生成回路２５で算出された値を加算する。ＣＳＡ２６の加算結果を出力する出力信号線は、中間剰余レジスタ２２ａ，２２ｂに接続されている。ＣＳＡ２６の加算によって得られるサムは、中間剰余レジスタ２２ａに格納される。またＣＳＡ２６の加算によって得られるキャリーは、中間剰余レジスタ２２ｂに格納される。
【００８２】
商生成回路２７は、商予測回路２４で決定された部分商に基づいて商を生成し、出力する。商生成回路２７の出力信号線は、商レジスタ２８に接続されている。
商レジスタ２８は、商を記憶するレジスタである。商レジスタ２８の出力信号線は、商生成回路２７に接続されている。また商レジスタ２８の出力信号線は、最終商として後処理を行う回路（図示せず）に接続されている。
【００８３】
加算・オーバーフロー検出回路２９は、中間剰余レジスタ２２ａ，２２ｂからサムとキャリーとを取得する。そして加算・オーバーフロー検出回路２９は、サムとキャリーとを加算し、正しい剰余を生成する。除算処理の途中であれば、加算・オーバーフロー検出回路２９で算出される剰余は中間剰余となる。除算処理が終了していれば、加算・オーバーフロー検出回路２９で算出される剰余は最終剰余となる。加算・オーバーフロー検出回路２９は、算出した最終剰余を、後処理を行う回路（図示せず）に出力する。
【００８４】
また加算・オーバーフロー検出回路２９は、オーバーフロー検出処理を行う。具体的には、加算・オーバーフロー検出回路２９は、算出した剰余の桁数が符号ビットを含めた桁数を超えているか否かを判定し、超えていた場合、エラー検出信号を出力する。
【００８５】
図６に示すような回路構成により、除算処理が行われる。除算処理が行われる場合、被除数ｏｐ１と除数ｏｐ２とが前処理回路２１に入力される。すると前処理回路２１により桁合わせが行われ、桁合わせ後の被除数ＯＰ１と除数ＯＰ２とが生成される。除数ＯＰ１は、前処理回路２１により中間剰余レジスタ２２ａに格納される。除数ＯＰ２は、前処理回路２１により除数レジスタ１３に格納される。
【００８６】
次に中間剰余レジスタ２２ａに格納された被除数ＯＰ１の最上位の桁の部分商が、商予測回路２４により予測される。予測された部分商は、加算値生成回路２５と商生成回路２７とに入力される。すると商生成回路２７により、商予測回路２４で予測された部分商を商レジスタ２８に格納される。
【００８７】
また加算値生成回路２５では、入力された部分商と除数ＯＰ２とが乗算され、さらに乗算結果の符号が反転される。加算値生成回路２５による演算結果は、ＣＳＡ２６に入力される。ＣＳＡ２６では、中間剰余レジスタ２２ａに格納されている被除数ＯＰ１に、加算値生成回路２５の演算結果が加算され、サムとキャリーとが出力される。加算結果のうちのサムは中間剰余レジスタ２２ａに書き込まれる。また加算結果のうちのキャリーは中間剰余レジスタ２２ｂに書き込まれる。
【００８８】
中間剰余レジスタ２２ａ，２２ｂの値が更新されると、中間剰余レジスタ２２ａ，２２ｂの値に基づいて、商予測回路２４により次の桁の部分商が予測される。予測された部分商は、加算値生成回路２５と商生成回路２７とに入力される。すると商生成回路２７により、商レジスタ２８に格納されている値の下位に、商予測回路２４で予測された部分商が追加される。そして商生成回路２７により、新たに予測された部分商を追加した値により、商レジスタ２８の値が更新される。
【００８９】
また加算値生成回路２５では、入力された部分商と除数ＯＰ２とが乗算され、さらに乗算結果の符号が反転される。加算値生成回路２５による演算結果は、ＣＳＡ２６に入力される。ＣＳＡ２６では、中間剰余レジスタ２２ａに格納されているサム、中間剰余レジスタ２２ａに格納されているキャリー、および加算値生成回路２５の演算結果が加算される。加算結果のうちのサムは中間剰余レジスタ２２ａに書き込まれる。また加算結果のうちのキャリーは中間剰余レジスタ２２ｂに書き込まれる。
【００９０】
以後同様に、部分商の予測と、予測された部分商による演算が、必要な桁数の商が得られるまで繰り返し実行される。その結果、商レジスタ２８には、被除数ＯＰ１を除数ＯＰ２で除算したときの商が格納される。また中間剰余レジスタ２２ａ，２２ｂには、被除数ＯＰ１を除数ＯＰ２で除算したときの剰余が格納される。
【００９１】
また、中間剰余レジスタ２２ａ，２２ｂの値が更新された場合、加算・オーバーフロー検出回路２９により中間剰余が算出され、オーバーフローの発生の有無が判定される。加算・オーバーフロー検出回路２０からエラー検出信号が出力される。除算処理が終了すると、加算・オーバーフロー検出回路２９により、中間剰余レジスタ２２ａ，２２ｂの値に基づいて最終剰余が算出される。
【００９２】
このように、ＣＳＡを用いた除算器においても、中間剰余のオーバーフローを検出できる。その結果、商予測回路２４による商予測に誤りがあった際に、エラー検出信号を出力することができる。
【００９３】
［第４の実施の形態］
次に第４の実施の形態について説明する。第４の実施の形態は、平方根演算器（開平回路）における解予測の誤りを検出するものである。以下、除算の場合と同様に、まず減算シフト型演算の漸化式と一般的な演算方法を説明する。その後、中間剰余の符号ビットの比較が論理チェッカーとして機能する理由を説明する。
【００９４】
なお以下の説明では、平方根演算の対象として入力された数値と、計算途中の平方根の解の自乗との差分を、中間剰余と呼ぶこととする。また、平方根演算の対象として入力された数値と、平方根演算終了時の平方根の解の自乗との差分を最終剰余と呼ぶこととする。さらに平方根演算においても、中間剰余の符号拡張が行われる。また負の数は、２の補数で表現される。
【００９５】
平方根演算では入力される数値は１つのみである。入力された数値をｏｐ３とし、ｏｐ３の平方根を求めるものとする。この場合、桁合わせされたＯＰ３をＯＰ３と書くことにし、以下の関係式で表されるものとする。
ＯＰ３＝ｏｐ３×ｋb：ｂは整数
除算の商の場合と同様に、１〜ｎ桁目までの平方根Ｑ（ｎ）を、ｎ桁目の部分平方根ｑ（ｎ）を用いて表すと、
Ｑ（ｎ）＝ｑ（０）×ｋn-1＋ｑ（１）×ｋn-2＋…＋ｑ（ｎ−２）×ｋ＋ｑ（ｎ−１）
・・・（９）
である。ここで、Ｑ（０）＝０と定義する。
【００９６】
この式（９）を変形すると以下の関係が得られる。
Ｑ（ｎ）＝ｑ（０）×ｋn-1＋ｑ（１）×ｋn-2＋…＋ｑ（ｎ−２）×ｋ＋ｑ（ｎ−１）
＝ｋ｛ｑ（０）×ｋn-2＋ｑ（１）×ｋn-3＋…＋ｑ（ｎ−２）｝＋ｑ（ｎ−１）
＝ｋ×Ｑ（ｎ−１）＋ｑ（ｎ−１）
・・・（１０）
上記ＯＰ３、Ｑ（ｎ）を使って、減算シフト型の平方根演算は以下の漸化式で定義される。
ｒ（ｎ）＝ｋ2×ｒ（ｎ−１）−２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）−ｑ2（ｎ−１）
ｒ（０）＝ＯＰ３
・・・（１１）
ｒ（ｎ）は、ｎ番目の中間剰余である。式（１１）の証明については後述する（証明１）。
【００９７】
ただし、｜ｒ（ｎ）−１｜＜２Ｑ（ｎ）となるように整数ｑ（ｎ−１）を選ぶ。ｑ（ｎ−１）の候補は｜ｑ（ｎ−１）｜＜ｋを満たす範囲に複数存在することがあるが、そのうち１つを任意に選択すればよい。すなわち、ｑ（ｎ−１）の算出に用いられる判定不等式が｜ｒ（ｎ）−１｜＜２Ｑ（ｎ）である。判定不等式が｜ｒ（ｎ）−１｜＜２Ｑ（ｎ）であることの証明については、後述する（証明２）。
【００９８】
よって除算と同様に考えれば、中間剰余ｒ（ｎ）の最上位桁のすぐ隣の符号ビットの位置（符号ビットの最も右側）をｓ０、そのひとつ上位の符号ビットの位置をｓ１としたとき、ｒ（ｎ）の（ｓ０  ｘｏｒ  ｓ１）を見るだけで論理障害の検出が可能になる。問題がない時は（ｓ０  ｘｏｒ  ｓ１）＝０であり、エラーが発生すれば（ｓ０  ｘｏｒ  ｓ１）＝１となる。エラーが発生すれば（ｓ０  ｘｏｒ  ｓ１）＝１となることの証明については、後述する（証明３）。
【００９９】
次に、平方根演算が式（１１）で表されることを証明する（証明１）。
Ｑ2（ｎ）≒（ＯＰ３に桁合わせを行った値）＝（ｒ（０）に桁合わせを行った値）である。すると、ｒ（ｎ）は、ｒ（０）とＱ2（ｎ）とを用いて、以下のような差分の式で書くことができる。
ｒ（ｎ）＝ｋ2n×ｒ（０）−Ｑ2（ｎ）        ・・・（１２）
さらに式（１０）より、
ｒ（ｎ）＝ｋ2n×ｒ（０）−｛ｋ×Ｑ（ｎ−１）＋ｑ（ｎ−１）｝2
＝ｋ2n×ｒ（０）−｛ｋ2×Ｑ2（ｎ−１）＋２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）＋ｑ２（ｎ−１）｝
＝ｋ2×｛ｋ2（ｎ−１）×ｒ（０）−Ｑ2（ｎ−１）｝−２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）−ｑ2（ｎ−１）
＝ｋ2×ｒ（ｎ−１）−２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）−ｑ2（ｎ−１）
・・・（１３）
となる。このようにして式（１１）が導かれる（証明１終了）。
【０１００】
次にｑ（ｎ−１）算出に用いられる判定不等式が｜ｒ（ｎ）−１｜＜２Ｑ（ｎ）であることを証明する（証明２）。
｜ｒ（ｎ）−１｜＜２Ｑ（ｎ）  ⇔  −２Ｑ（ｎ）＋１＜ｒ（ｎ）＜２Ｑ（ｎ）＋１
・・・（１４）
ここでｎ≧１でｒ（ｎ−１）が式（１４）の不等式を満たしたとき、ｒ（ｎ）においても式（１４）が成立することを示す。具体的には、「ｎ＝１」のときに式（１４）が成立すること、および「ｎ＞１」のときにｒ（ｎ−１）が成立すれば必ずｒ（ｎ）が成立することを証明する。
【０１０１】
まず「ｎ＝１」のときを考える。
Ｑ（１）＝ｑ（０）＞０であり、｜ｋ×√（ＯＰ３）−ｑ（０）｜＜１となるようにｑ（０）が選ばれているはずである。これは、ｋ×√（ＯＰ３）とｑ（０）の最上位の桁が合うように桁合わせがされており、その整数部分が一致するようにｑ（０）を選んでいるからである。
【０１０２】
よって
−１＜ｋ×√（ＯＰ３）−ｑ（０）＜１
⇔−１＜ｋ×√（ｒ（０））−ｑ（０）＜１
・・・（１５）
式（１５）の連立不等式の左側より
０＜ｋ×√（ｒ（０））−ｑ（０）＋１
⇔０＜（ｋ×√（ｒ（０））＋ｑ（０）−１）（ｋ×√（ｒ（０））−ｑ（０）＋１）
⇔０＜ｋ2×ｒ（０）−（ｑ（０）−１）2
⇔０＜ｋ2×ｒ（０）−ｑ2（０）＋２ｑ（０）−１
⇔−２ｑ（０）＜ｋ2×ｒ（０）−ｑ2（０）−１
・・・（１６）
同じく式（１５）の連立不等式の右側より
ｋ×√（ｒ（０））−ｑ（０）−１＜０
⇔（ｋ×√（ｒ（０））＋ｑ（０）＋１）（ｋ×√（ｒ（０））−ｑ（０）−１）＜０
⇔ｋ2×ｒ（０）−（ｑ（０）＋１）2＜０
⇔ｋ2×ｒ（０）−ｑ2（０）−２ｑ（０）−１＜０
⇔ｋ2×ｒ（０）−ｑ2（０）−１＜２ｑ（０）
・・・（１７）
ｑ（０）＞０であることと、式（１６）、式（１７）の結果を合わせると、
｜ｋ2×ｒ（０）？ｑ2（０）？１｜＜２ｑ（０）
⇔｜ｒ（１）？１｜＜２Ｑ（１）                          ・・・（１８）
となり、ｎ＝１のときで式（１４）が成立する。
【０１０３】
次に「−２Ｑ（ｎ−１）＋１＜ｒ（ｎ−１）」が満たされれば、「−２Ｑ（ｎ）＋１＜ｒ（ｎ）」が満たされることを証明する。
ｒ（ｎ）＝ｋ2×ｒ（ｎ−１）？２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）？ｑ2（ｎ−１）
＞ｋ2×｛−２Ｑ（ｎ−１）＋１｝？２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）？ｑ2（ｎ−１）
＝−２ｋＱ（ｎ−１）×｛ｋ＋ｑ（ｎ−１）｝＋｛ｋ＋ｑ（ｎ−１）｝×｛ｋ−ｑ（ｎ−１）｝
＝｛ｋ＋ｑ（ｎ−１）｝×｛−２ｋ×Ｑ（ｎ−１）＋ｋ−ｑ（ｎ−１）｝
＝｛ｋ＋ｑ（ｎ−１）｝×［−２｛ｋ×Ｑ（ｎ−１）＋２ｑ（ｎ−１）｝＋ｋ＋ｑ（ｎ−１）］
＝｛ｋ＋ｑ（ｎ−１）｝×｛−２Ｑ（ｎ）＋ｋ＋ｑ（ｎ−１）｝
・・・（１９）
式（１９）の右辺はｒ（ｎ）の下限であるから、ここがどのような値を取ってもｒ（ｎ）はその値より大きい。よって右辺が最も大きくなるようにｑ（ｎ−１）を選ぶと、ｑ（ｎ−１）＝−（ｋ−１）となる。その理由は以下の通りである。
【０１０４】
−２Ｑ（ｎ）＋ｋ＋ｑ（ｎ−１）＜０であり、１≦ｋ＋ｑ（ｎ−１）≦２ｋ−１である。そのため、ｑ（ｎ−１）＝−（ｋ−１）で右辺｛ｋ＋ｑ（ｎ−１）｝×｛−２Ｑ（ｎ）＋ｋ＋ｑ（ｎ−１）｝は最大となる。
【０１０５】
よってｑ（ｎ−１）＝−（ｋ−１）を式（１９）の右辺に代入して以下の式となる。
ｒ（ｎ）＞−２Ｑ（ｎ）＋１                              ・・・（２０）
さらに「ｒ（ｎ−１）＜２Ｑ（ｎ−１）＋１」が満たされれば、「ｒ（ｎ）＜２Ｑ（ｎ）＋１」が満たされることを証明する。
ｒ（ｎ）＝ｋ2×ｒ（ｎ−１）？２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）？ｑ2（ｎ−１）
＜ｋ2×｛２Ｑ（ｎ−１）＋１｝？２ｋ×Ｑ（ｎ−１）×ｑ（ｎ−１）？ｑ2（ｎ−１）
＝２ｋＱ（ｎ−１）×｛ｋ−ｑ（ｎ−１）｝＋｛ｋ＋ｑ（ｎ−１）｝×｛ｋ−ｑ（ｎ−１）｝
＝｛ｋ−ｑ（ｎ−１）｝×｛２ｋ×Ｑ（ｎ−１）＋ｋ＋ｑ（ｎ−１）｝
＝｛ｋ−ｑ（ｎ−１）｝×［２｛ｋ×Ｑ（ｎ−１）＋２ｑ（ｎ−１）｝＋ｋ−ｑ（ｎ−１）］
＝｛ｋ−ｑ（ｎ−１）｝×｛２Ｑ（ｎ）＋ｋ−ｑ（ｎ−１）｝
・・・（２１）
ここで式（２１）の右辺が最も小さくなるようにｑ（ｎ−１）を選ぶと、ｑ（ｎ−１）＝ｋ−１となる。よって
ｒ（ｎ）＜２Ｑ（ｎ）＋１                                  ・・・（２２）
が得られる。式（２０）と式（２２）との連立不等式は、｜ｒ（ｎ）−１｜＜２Ｑ（ｎ）と同値である。従って、「ｎ＞１」の場合に、ｒ（ｎ−１）が式（１４）の不等式を満たしたとき、ｒ（ｎ）においても式（１４）が満たされる。
【０１０６】
以上より、「ｎ≧１」のすべてのｎの場合に、式（１４）の不等式が満たされる（証明２終了）。
次に、エラーが発生すれば（ｓ０  ｘｏｒ  ｓ１）＝１となることについて証明する（証明３）。
【０１０７】
式（１１）で定義される平方根演算の方法は、Ｑ（ｎ）、ｒ（ｎ）が整数で表せるように各数式を定義している。ただし、その副作用として最上位桁の位置が演算回数に比例して上に移動してしまう。実際のハードで実現する場合には、最上位の位置が固定されるように以下の漸化式に置き換えて行うのが普通である。
ｒ’（ｎ）＝ｒ（ｎ）／ｋn
Ｑ’（ｎ）＝Ｑ（ｎ）／ｋn
・・・（２３）
とし、式（１１）の両辺をｋnで割る。
ｒ’（ｎ）＝ｋ×ｒ’（ｎ−１）−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）
ｒ（０）＝ＯＰ３
・・・（２４）
すると、整数ｑ（ｎ−１）選択に用いられる判定式は｜ｒ’（ｎ）−１／ｋn｜＜２Ｑ’（ｎ）となる。この判定式を満たさないｑ（ｎ−１）が選択されると、繰り返し部分平方根の予測を行ううちに、式（２４）におけるｒ’（ｎ）の演算結果がオーバーフローする。すなわち、ｒ’（ｎ）の演算結果の桁数が、ｒ’（ｎ）の格納領域の桁数を超える。すると、ｒ’（ｎ）の最上位桁のすぐ隣の符号ビットｓ０と、ひとつ上位の符号ビットｓ１との値が不一致となる。その結果、ｒ（ｎ）の（ｓ０  ｘｏｒ  ｓ１）を見るだけで論理障害の検出が可能になる（証明３終了）。
【０１０８】
このような判定誤り検出実現に用いられる追加論理回路は、排他的論理和回路（xorゲート）１つだけで実現することができる。
図７は、第４の実施の形態に係る平方根演算器の例を示す図である。平方根演算器には、前処理回路３１が設けられている。前処理回路３１は、平方根演算対象となる数値の桁合わせ処理などの前処理を行う。前処理回路３１の出力信号線は、中間剰余レジスタ３２に接続されている。前処理回路３１は、桁合わせ後の数値であるＯＰ３を中間剰余レジスタ３２に格納する。
【０１０９】
中間剰余レジスタ３２は、中間剰余を格納するレジスタである。例えばＩＥＥＥ７５４で定義されている倍精度浮動小数点なら、６４ビット幅のレジスタを中間剰余レジスタ３２として使用できる。中間剰余レジスタ３２の出力信号線は、平方根予測回路３３と加算器３５とに接続されている。また、中間剰余レジスタ３２の出力信号線は、除算器の除算結果として得られる最終剰余の後処理を行う回路（図示せず）に接続されている。
【０１１０】
平方根予測回路３３は、中間剰余レジスタ３２に設定された中間剰余に基づいて部分平方根ｑ（ｎ−１）を予測する。ここで平方根予測回路３３は、式（２４）の演算の結果、｜ｒ’（ｎ）−１／ｋn｜＜２Ｑ’（ｎ）となる部分平方根ｑ（ｎ−１）を決定する。しかし、平方根予測回路３３に論理障害があり、その障害を活性化させるような平方根Ｑ’（ｎ−１）と中間剰余との特別な組み合わせパターンが発生する場合、またはトランジスタセルの固定故障や放射線等の要因によるソフトエラーが発生する場合がある。これらの場合、平方根予測回路３３が、｜ｒ’（ｎ）−１／ｋn｜＜２Ｑ’（ｎ）を満たさない部分平方根ｑ（ｎ−１）を予測する可能性がある。平方根予測回路３３の出力信号線は、加算値生成回路３４と平方根生成回路３６とに接続されている。
【０１１１】
加算値生成回路３４は、中間剰余に加算する値を算出する。具体的には、加算値生成回路３４は、「−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）」という演算を行う。この演算により、現在の中間剰余の値から、新たに予測された部分平方根を解の平方根に追加したときの中間剰余を得るのに用いられる、現在の中間剰余への加算値が算出される。現在の中間剰余の値が、新たに予測された部分平方根を解の平方根に追加したときの中間剰余の値より大きければ、加算値生成回路３４の演算結果は負の数となる。負の数は２の補数で表現される。加算値生成回路３４の演算結果を出力する出力信号線は、加算器３５に接続されている。
【０１１２】
加算器３５は、入力された値を加算する。具体的には、加算器３５は、中間剰余レジスタ３２に格納されている中間剰余と、加算値生成回路３４で算出された値とを加算する。加算器３５の加算結果を出力する出力信号線は、中間剰余レジスタ３２に接続されている。すなわち、加算器３５による加算結果が、中間剰余として中間剰余レジスタ３２に格納される。なお加算器３５は、第１の実施の形態に示した加算器１６と同様に、２の補数表現の負の数を加算することで、数値の減算を行うことができる。
【０１１３】
平方根生成回路３６は、平方根予測回路３３で決定された部分平方根に基づいて平方根を生成し、出力する。平方根生成回路３６の出力信号線は、平方根レジスタ３７に接続されている。すなわち、平方根生成回路３６で生成された平方根が平方根レジスタ３７に書き込まれる。具体的には、平方根生成回路３６は、平方根予測回路３３で部分平方根が予測されるごとに平方根レジスタ３７に格納されている平方根の値を読み込む。次に平方根生成回路３６は、平方根レジスタ３７から読み込んだ値を所定の桁だけ上位にシフトさせ、空いた下位の桁に平方根予測回路３３で決定された部分平方根を加算する。そして平方根生成回路３６は、部分平方根を追加した値を平方根レジスタ３７に書き込む。
【０１１４】
平方根レジスタ３７は、平方根を記憶するレジスタである。平方根レジスタ３７の出力信号線は、平方根生成回路３６と加算値生成回路３４とに接続されている。また平方根レジスタ３７の出力信号線は、最終商として後処理を行う回路（図示せず）に接続されている。
【０１１５】
中間剰余レジスタ３２には、排他的論理和回路３８が接続されている。具体的には、中間剰余レジスタ３２内の符号ビットと、符号ビットの上位の１ビットとの出力信号線に、排他的論理和回路３８が接続されている。中間剰余レジスタ３２と排他的論理和回路３８との接続関係は、図３に示した中間剰余レジスタ１２と排他的論理和回路１９との接続関係と同様である。排他的論理和回路３８において、入力された２つのビットの値の排他的論理和演算が行われる。すなわち排他的論理和回路３８は、入力された２つのビットの値が同じときに０を出力する。また排他的論理和回路３８は、入力された２つのビットの値が異なるときに１を出力する。
【０１１６】
図７に示すような回路構成により、平方根演算処理が行われる。平方根演算処理が行われる場合、演算対象の数値ＯＰ３が前処理回路３１に入力される。すると前処理回路３１により桁合わせが行われ、桁合わせ後の数値ＯＰ３が生成される。数値ＯＰ３は、前処理回路３１により中間剰余レジスタ３２に格納される。
【０１１７】
次に中間剰余レジスタ３２に格納された数値ＯＰ３の最上位の桁の部分平方根が、平方根予測回路３３により予測される。予測された部分平方根は、加算値生成回路３４と平方根生成回路３６とに入力される。すると平方根生成回路３６により、平方根予測回路３３で予測された部分平方根を平方根レジスタ３７に格納される。
【０１１８】
また加算値生成回路３４では、「−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）」の演算が行われる。加算値生成回路３４による演算結果は、加算器３５に入力される。加算器３５では、中間剰余レジスタ３２に格納されている数値ＯＰ３に、加算器３５の演算結果が加算される。加算結果は中間剰余レジスタ３２に書き込まれる。これにより、中間剰余レジスタ３２の内容が、数値ＯＰ３から中間剰余に更新される。
【０１１９】
中間剰余レジスタ３２の値が更新されると、平方根予測回路３３により次の桁の部分平方根が予測される。予測された部分平方根は、加算値生成回路３４と平方根生成回路３６とに入力される。すると平方根生成回路３６により、平方根レジスタ３７に格納されている値の下位に、平方根予測回路３３で予測された部分平方根が追加される。そして平方根生成回路３６により、新たに予測された部分平方根を追加した値が、平方根レジスタ３７に格納される。
【０１２０】
また加算値生成回路３４では、「−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）」の演算が行われる。加算値生成回路３４による演算結果は、加算器３５に入力される。加算器３５では、中間剰余レジスタ３２に格納されている中間剰余に、加算値生成回路３４の演算結果が加算される。加算結果は中間剰余レジスタ３２に書き込まれる。これにより、中間剰余レジスタ３２内の中間剰余の値が更新される。
【０１２１】
以後同様に、部分平方根の予測と、予測された部分平方根による演算が、必要な桁数の平方根が得られるまで繰り返し実行される。その結果、平方根レジスタ３７には、入力された数値ＯＰ３の平方根が格納される。また中間剰余レジスタ３２には、平方根演算後の剰余が格納される。
【０１２２】
このような平方根演算の過程において、平方根予測回路３３が部分平方根の予測を誤らなければ、中間剰余の符号ビットと拡張符号ビット列の最下位のビットとの値は常に一致する。
【０１２３】
図８は、部分平方根の判定が正常に行われた平方根演算の例を示す図である。図８の例では、簡単のため、演算対象の数字は８ビットの２進数であるものとする。また、桁合わせは済んでいるものとする。桁合わせ後の数値ＯＰ３を「＋１１１１１１１１」とする。この場合、ＯＰ３の平方根が、平方根演算器で行われる。
【０１２４】
図８には、左側に平方根演算過程が示されている。また右側に中間剰余レジスタの内容が示されている。中間剰余レジスタの内容のうち、左端の値が拡張符号ビット列の最後尾のビットの値である。そのビットの右側の値が、符号ビットの値である。中間剰余レジスタの内容のうち、右側の９つの通知が中間剰余ビット列の値である。
【０１２５】
平方根予測回路３３では、平方根の上位の桁から順に１桁ずつ部分平方根が予測される。中間剰余が正の値の間は、符号ビットとその上位のビットとの値が共に０である。中間剰余が負の値になると、符号ビットとその上位のビットとの値が共に１となる。いずれにしても、平方根予測が正しく行われていれば、符号ビットとその上位のビットとの値は一致する。
【０１２６】
他方、平方根予測回路３３に論理障害があったとき、またはトランジスタセルの固定故障や、放射線等の要因によるソフトエラーが発生したとき、平方根演算過程において、平方根予測回路３３が部分平方根の予測を誤る場合がある。すなわち、式（２４）の演算の結果｜ｒ’（ｎ）−１／ｋn｜＜２Ｑ’（ｎ）を満たさなくなる部分平方根ｑ（ｎ−１）を、平方根予測回路３３が予測する場合がある。その場合、中間剰余のオーバーフローが発生し、符号を設定すべき符号ビットに中間剰余の符号以外の数値が設定されてしまう。すると、拡張符号ビット列の最下位のビットと符号ビットとの値が不一致となる。
【０１２７】
図９は、部分平方根の判定を誤った平方根演算の例を示す図である。図９の例では、上から４桁目の部分平方根の判定を誤った場合を示している。すなわち｜ｒ’（ｎ）−１／ｋn｜＜２Ｑ’（ｎ）という条件を満たすには部分平方根ｑ（ｎ−１）を１とすべきであるが、平方根予測回路３３が部分平方根を０と判定したものとする。
【０１２８】
すると４桁目の部分平方根を用いて計算した中間剰余が、１０桁の数値となり、中間剰余レジスタにおける中間剰余ビット列のビット数を超えている。その結果、オーバーフローが発生する。オーバーフローが発生した結果、算出された中間剰余の最上位の桁の値が、符号ビットに設定されている。その結果、中間剰余が正の値であるにも拘わらず、符号ビットの値が１になっている。他方、拡張符号ビット列の最下位のビットの値は、以前として０である。その結果、拡張符号ビット列の最下位のビットと符号ビットとの値が不一致となっている。
【０１２９】
拡張符号ビット列の最下位のビットと符号ビットとの一致・不一致は、排他的論理和回路３８によって検出される。排他的論理和回路３８の１の出力信号は、エラー通報を示す情報である。
【０１３０】
なお、中間剰余が一度発散すると、それ以降どの様な計算が行われるかは不明である。すなわち、図９の右側に示した筆算による計算通りに平方根演算器で計算が続けられるかどうかも不明である。
【０１３１】
このように、本実施の形態によれば、中間剰余レジスタ３２に排他的論理和回路３８を接続するだけで、中間剰余のオーバーフローを検出することができる。その結果、平方根予測回路３３が平方根予測を誤った場合、エラーを発生させることができる。
【０１３２】
しかも排他的論理和回路３８を追加するだけでよいため、平方根予測の誤り検出機能の追加による回路の大規模化を、最低限におさえることができる。
［第５の実施の形態］
次に第５の実施の形態について説明する。第５の実施の形態は、ＣＳＡを用いた平方根演算器である。
【０１３３】
図１０は、第５の実施の形態に係る平方根演算器の例を示す図である。平方根演算器には、前処理回路４１が設けられている。前処理回路４１は、入力された数値の桁合わせ処理などの前処理を行う。前処理回路４１の出力信号線は、２つの中間剰余レジスタ４２ａ，４２ｂに接続されている。前処理回路４１は、桁合わせ後の数値ＯＰ３を、一方の中間剰余レジスタ４２ａに格納する。
【０１３４】
中間剰余レジスタ４２ａ，４２ｂは、中間剰余をサムとキャリーに分けて格納するレジスタである。例えば中間剰余レジスタ４２ａにサムの値が格納され、中間剰余レジスタ４２ｂにキャリーの値が格納される。中間剰余レジスタ４２ａ，４２ｂの出力信号線は、平方根予測回路４３とＣＳＡ４５とに接続されている。また、中間剰余レジスタ４２ａ，４２ｂの出力信号線は、加算・オーバーフロー検出回路４８に接続されている。
【０１３５】
平方根予測回路４３は、中間剰余レジスタ４２ａ，４２ｂにサムとキャリーとに分けて設定された中間剰余に基づいて部分平方根ｑ（ｎ−１）を予測する。平方根予測回路４３の出力信号線は、加算値生成回路４４と平方根生成回路４６とに接続されている。
【０１３６】
加算値生成回路４４は、中間剰余に加算する値を算出する。具体的には、加算値生成回路４４は、「−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）」の演算を行う。加算値生成回路４４の演算結果を出力する出力信号線は、ＣＳＡ４５に接続されている。
【０１３７】
ＣＳＡ４５は、入力された値を加算する。ＣＳＡ４５は、入力値の加算処理を行い、部分剰余をサムとキャリーとに欠けて出力する機能を有している。ＣＳＡで得られるサムは、加算される値の桁ごとの和であり、繰り上げされる値が無視されている。繰り上げられる値は、キャリーとして出力される。具体的には、ＣＳＡ４５は、中間剰余レジスタ４２ａ，４２ｂに格納されている中間剰余を示すサムとキャリー、および加算値生成回路４４で算出された値を加算する。ＣＳＡ４５の加算結果を出力する出力信号線は、中間剰余レジスタ４２ａ，４２ｂに接続されている。ＣＳＡ４５の加算によって得られるサムは、中間剰余レジスタ４２ａに格納される。またＣＳＡ４５の加算によって得られるキャリーは、中間剰余レジスタ４２ｂに格納される。
【０１３８】
平方根生成回路４６は、平方根予測回路４３で決定された部分平方根に基づいて平方根を生成し、出力する。平方根生成回路４６の出力信号線は、平方根レジスタ４７に接続されている。
【０１３９】
平方根レジスタ４７は、平方根を記憶するレジスタである。平方根レジスタ４７の出力信号線は、平方根生成回路４６と加算値生成回路４４とに接続されている。また平方根レジスタ４７の出力信号線は、最終平方根として後処理を行う回路（図示せず）に接続されている。
【０１４０】
加算・オーバーフロー検出回路４８は、中間剰余レジスタ４２ａ，４２ｂからサムとキャリーとを取得する。そして加算・オーバーフロー検出回路４８は、サムとキャリーとを加算し、正しい剰余を生成する。平方根演算処理の途中であれば、加算・オーバーフロー検出回路４８で算出される剰余は中間剰余となる。平方根演算処理が終了していれば、加算・オーバーフロー検出回路４８で算出される剰余は最終剰余となる。加算・オーバーフロー検出回路４８は、算出した最終剰余を、後処理を行う回路（図示せず）に出力する。
【０１４１】
また加算・オーバーフロー検出回路４８は、オーバーフロー検出処理を行う。具体的には、加算・オーバーフロー検出回路４８は、算出した剰余の桁数が符号ビットを含めた桁数を超えているか否かを判定し、超えていた場合、エラー検出信号を出力する。
【０１４２】
図１０に示すような回路構成により、平方根演算処理が行われる。平方根演算処理が行われる場合、数値ｏｐ３が前処理回路４１に入力される。すると前処理回路４１により桁合わせが行われ、桁合わせ後の数値ＯＰ３が生成される。数値ＯＰ３は、前処理回路４１により中間剰余レジスタ４２ａに格納される。
【０１４３】
次に中間剰余レジスタ４２ａに格納された数値ＯＰ３の最上位の桁の部分平方根が、平方根予測回路４３により予測される。予測された部分平方根は、加算値生成回路４４と平方根生成回路４６とに入力される。すると平方根生成回路４６により、平方根予測回路４３で予測された部分平方根を平方根レジスタ４７に格納される。
【０１４４】
また加算値生成回路４４では、「−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）」の演算が行われる。加算値生成回路４４による演算結果は、ＣＳＡ４５に入力される。ＣＳＡ４５では、中間剰余レジスタ４２ａに格納されている数値ＯＰ３に、加算値生成回路４４の演算結果が加算され、サムとキャリーとが出力される。加算結果のうちのサムは中間剰余レジスタ４２ａに書き込まれる。また加算結果のうちのキャリーは中間剰余レジスタ４２ｂに書き込まれる。
【０１４５】
中間剰余レジスタ４２ａ，４２ｂの値が更新されると、中間剰余レジスタ４２ａ，４２ｂの値に基づいて、平方根予測回路４３により次の桁の部分平方根が予測される。予測された部分平方根は、加算値生成回路４４と平方根生成回路４６とに入力される。すると平方根生成回路４６により、平方根レジスタ４７に格納されている値の下位に、平方根予測回路４３で予測された部分平方根が追加される。そして平方根生成回路４６により、新たに予測された部分平方根を追加した値により、平方根レジスタ４７の値が更新される。
【０１４６】
また加算値生成回路４４では、「−２×Ｑ’（ｎ−１）×ｑ（ｎ−１）−（１／ｋn）×ｑ2（ｎ−１）」の演算が行われる。加算値生成回路４４による演算結果は、ＣＳＡ４５に入力される。ＣＳＡ４５では、中間剰余レジスタ４２ａに格納されているサム、中間剰余レジスタ４２ａに格納されているキャリー、および加算値生成回路４４の演算結果が加算される。加算結果のうちのサムは中間剰余レジスタ４２ａに書き込まれる。また加算結果のうちのキャリーは中間剰余レジスタ４２ｂに書き込まれる。
【０１４７】
以後同様に、部分平方根の予測と、予測された部分平方根による演算が、必要な桁数の平方根が得られるまで繰り返し実行される。その結果、平方根レジスタ４７には、数値ＯＰ３で平方根演算したときの平方根が格納される。また中間剰余レジスタ４２ａ，４２ｂには、ＯＰ３の平方根を演算したときの剰余が格納される。
【０１４８】
また、中間剰余レジスタ４２ａ，４２ｂの値が更新された場合、加算・オーバーフロー検出回路４８により中間剰余が算出され、オーバーフローの発生の有無が判定される。加算・オーバーフロー検出回路２０からエラー検出信号が出力される。平方根演算処理が終了すると、加算・オーバーフロー検出回路４８により、中間剰余レジスタ４２ａ，４２ｂの値に基づいて最終剰余が算出される。
【０１４９】
このように、ＣＳＡを用いた平方根演算器においても、中間剰余のオーバーフローを検出できる。その結果、平方根予測回路４３による平方根予測に誤りがあった際に、エラー検出信号を出力することができる。
【０１５０】
［第６の実施の形態］
次に第６の実施の形態について説明する。第６の実施の形態は、第２の実施の形態で示した除算器、および第４の実施の形態で示した平方根演算器を搭載した演算処理装置である。演算処理装置としては、例えばＣＰＵやＦＰＵ（Floating point number Processing Unit）がある。
【０１５１】
図１１は、演算処理装置の例を示す図である。図１１に示すように演算処理装置５０には、除算器５１、平方根演算器５２、レジスタファイル５３およびキャッシュメモリ５４が含まれている。除算器５１の内部構成は、図２に示した除算器と同様である。平方根演算器５２の内部構成は、図７に示した平方根演算器と同様である。また、演算処理装置５０は、除算器５１または平方根演算器５２からエラー信号が出力された場合、エラー処理を行うように構成されている。
【０１５２】
ここで、レジスタファイル５３およびキャッシュメモリ５４は、除算器５１や平方根演算器５２に対して、演算対象となる数値を供給するとともに、除算器５１や平方根演算器５２の演算結果を格納する記憶装置である。すなわち除算器５１および平方根演算器５２内の前処理回路は、レジスタファイル５３またはキャッシュメモリ５４から演算対象となる数値を読み出す。
【０１５３】
このように、演算処理装置５０に、エラー検出機能を有する除算器５１や平方根演算器５２を搭載することで、演算処理装置５０の動作中に部分商や部分平方根の予測誤りが発生しても、確実にエラーを検出することができる。その結果、演算処理装置５０の信頼性が向上する。
【０１５４】
除算器５１や平方根演算器５２におけるエラー検出回路は、主として排他的論理和回路である。そのため演算処理装置５０が、例えばＬＳＩと呼ばれる、高密度配線を有する集積回路であれば、エラー検出回路を追加してもＬＳＩのチップのサイズが肥大化することはない。ＬＳＩのサイズが肥大化すると、一枚のシリコンウエハから取れるチップの数が減り、ＬＳＩの１つ当たりの製造単価が高くなってしまう。本実施の形態ではチップサイズを肥大化させずにエラー検出回路を組み込めるため、製造コストを増加させずにエラー回路の組み込みが可能である。
【０１５５】
なお、図１１に示した除算器５１として、図６に示した除算器を実装することもできる。また、図１１に示した平方根演算器５２として、図１０に示した平方根演算器を実装することもできる。
【０１５６】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【０１５７】
以上説明した実施の形態の主な技術的特徴は、以下の付記の通りである。
（付記１）  レジスタと、
演算対象となる数値を前記レジスタに格納する前処理回路と、
前記レジスタに数値が格納されるごとに、前記レジスタに格納された数値に基づいて、前記演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測する解予測回路と、
前記解予測回路で予測された前記部分解を用いた所定の演算により、中間値を示す数値を生成し、前記中間値に対して符号拡張により拡張符号ビットを付加した数値を前記レジスタに格納する中間値計算回路と、
前記解予測回路で予測された前記部分解を順次取得し、前記解を生成する解生成回路と、
前記レジスタに格納された前記中間値の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力するエラー検出回路と、
を有することを特徴とする演算回路。
【０１５８】
（付記２）  前記エラー検出回路は、前記レジスタにおける前記中間値の前記符号ビットの位置と、前記拡張符号ビットの位置とに接続された排他的論理和回路であることを特徴とする付記１記載の演算回路。
【０１５９】
（付記３）  除算における除数を格納する除数レジスタを更に有し、
前記前処理回路は、除算における被除数を前記レジスタに格納し、除算における前記除数を前記除数レジスタに格納し、
前記解予測回路は、前記被除数を前記除数で除算した商の前記部分解を予測し、
前記中間値計算回路は、前記レジスタに格納された数値から、前記解予測回路で予測された前記部分解と前記除数との乗算結果を減算して中間剰余を生成し、前記中間剰余を前記中間値とすることを特徴とする付記１または２記載の演算回路。
【０１６０】
（付記４）  前記中間値計算回路は、
前記解予測回路で予測された前記部分解と前記除数とを乗算し、乗算結果の符号を反転して加算値を生成する加算値生成回路と、
前記加算値生成回路で生成された前記加算値を、前記レジスタ内の数値に加算する加算器と、
を有することを特徴とする付記３記載の演算回路。
【０１６１】
（付記５）  前記前処理回路は、平方根演算における演算対象の数値を前記レジスタに格納し、
前記解予測回路は、前記演算対象の数値の平方根の前記部分解を予測することを特徴とする付記１または２記載の演算回路。
【０１６２】
（付記６）  前記中間値計算回路は、
前記解予測回路で予測された前記部分解を平方根演算の解に含めた場合の解の自乗と前記演算対象の数値との差分を得るのに用いられる、前記レジスタに格納されている数値への加算値を算出する加算値生成回路と、
前記加算値生成回路で生成された前記加算値を、前記レジスタ内の数値に加算する加算器と、
を有することを特徴とする付記５記載の演算回路。
【０１６３】
（付記７）  前記レジスタは、第１のレジスタと第２のレジスタとの２つであり、
前記解予測回路は、前記第１のレジスタと前記第２のレジスタとに格納された数値に基づいて前記部分解を予測し、
前記中間値計算回路は、前記所定の演算の最終段階で行われる加算における繰り上げを除外した各桁の和を前記第１のレジスタに格納し、最終段階で行われる加算の各桁の繰り上げを示す値を前記第２のレジスタに格納し、
前記エラー検出回路は、前記第１のレジスタと前記第２のレジスタとに格納された数値を加算し、加算結果の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力することを特徴とする付記１記載の演算回路。
【０１６４】
（付記８）  前記排他的論理和回路は、前記レジスタにおける前記中間値の前記符号ビットの位置と、前記符号ビットの１ビット上位の位置とに接続されていることを特徴とする付記２記載の演算回路。
【０１６５】
（付記９）  演算対象となる数値を格納する記憶装置と、
レジスタと、
前記演算対象となる数値を、前記記憶装置から読み出し、前記レジスタに格納する前処理回路と、
前記レジスタに数値が格納されるごとに、前記レジスタに格納された数値に基づいて、前記演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測する解予測回路と、
前記解予測回路で予測された前記部分解を用いた所定の演算により、中間値を示す数値を生成し、前記中間値に対して符号拡張により拡張符号ビットを付加した数値を前記レジスタに格納する中間値計算回路と、
前記解予測回路で予測された前記部分解を順次取得し、前記解を生成する解生成回路と、
前記レジスタに格納された前記中間値の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力するエラー検出回路と、
を有することを特徴とする演算処理装置。
【０１６６】
（付記１０）  前記エラー検出回路は、前記レジスタにおける前記中間値の前記符号ビットの位置と、前記拡張符号ビットの位置とに接続された排他的論理和回路であることを特徴とする付記９記載の演算処理装置。
【０１６７】
（付記１１）  除算における除数を格納する除数レジスタを更に有し、
前記前処理回路は、除算における被除数を前記レジスタに格納し、除算における前記除数を前記除数レジスタに格納し、
前記解予測回路は、前記被除数を前記除数で除算した商の前記部分解を予測し、
前記中間値計算回路は、前記レジスタに格納された数値から、前記解予測回路で予測された前記部分解と前記除数との乗算結果を減算して中間剰余を生成し、前記中間剰余を前記中間値とすることを特徴とする付記９または１０記載の演算処理装置。
【０１６８】
（付記１２）  前記前処理回路は、平方根演算における演算対象の数値を前記レジスタに格納し、
前記解予測回路は、前記演算対象の数値の平方根の前記部分解を予測することを特徴とする付記９または１０記載の演算処理装置。
【０１６９】
（付記１３）  演算回路の演算処理方法において、
前記演算回路が有する前処理回路が、演算対象となる数値をレジスタに格納するステップと、
前記演算回路が有する解予測回路が、前記レジスタに数値が格納されるごとに、前記レジスタに格納された数値に基づいて、前記演算対象となる数値の解の一部の桁の値である部分解を、上位の桁から順に予測するステップと、
前記演算回路が有する中間値計算回路が、前記解予測回路で予測された前記部分解を用いた所定の演算により、中間値を示す数値を生成し、前記中間値に対して符号拡張により拡張符号ビットを付加した数値を前記レジスタに格納するステップと、
前記演算回路が有する解生成回路が、前記解予測回路で予測された前記部分解を順次取得し、前記解を生成するステップと、
前記演算回路が有するエラー検出回路が、前記レジスタに格納された前記中間値の符号ビットと、前記拡張符号ビットとの値を比較し、不一致の場合にエラー信号を出力するステップと、
を有することを特徴とする演算処理方法。
【符号の説明】
【０１７０】
１  レジスタ
１ａ  中間値
１ｂ  拡張符号
２  前処理回路
３  解予測回路
４  中間値計算回路
５  解生成回路
６  エラー検出回路
６ａ  排他的論理和回路
【図１】
0005407589.tif 000002
【図２】
0005407589.tif 000003
【図３】
0005407589.tif 000004
【図４】
0005407589.tif 000005
【図５】
0005407589.tif 000006
【図６】
0005407589.tif 000007
【図７】
0005407589.tif 000008
【図８】
0005407589.tif 000009
【図９】
0005407589.tif 000010
【図１０】
0005407589.tif 000011
【図１１】
0005407589.tif 000012