(57)【要約】【課題】剰余演算、乗算剰余演算等を高速に実行する。【解決手段】演算装置１は、モンゴメリ法によって積和演算を行う。ブース符号化部２０は、複数ビットからなる乗数Ｙを２ビット毎に分割し、分割した２ビットが取る０、１、２、３のいずれかの値に対応して−２、−１、０、１、２のいずれかにブース符号化する。部分積生成部４００は、ブース符号化した乗数Ｙと被乗数Ｘとを乗算することによって、−２Ｘ、−Ｘ、０、Ｘ、２Ｘのいずれかの値をもつ複数の部分積列を複数生成する。部分積加算部４５０は、複数の部分積列の符号ビットをパディングして符号ビットのビット位置を揃え、所定の条件にしたがって所定の定数ビットを設定することにより符号拡張し、定数値を予め算出し、複数の部分積列を加算した加算結果に定数値を付加し、乗数Ｙと被乗数Ｘとの乗算結果として出力する。【選択図】        図１
2004227248.tif 000002
【特許請求の範囲】
【請求項１】
正の値を持つ複数ビットの被乗数Ｘと正の値を持つ複数ビットの乗数Ｙとの演算を行う演算装置であって、
複数ビットの乗数Ｙを正負のある複数の部分に分割する分割部と、
被乗数Ｘに対して上記分割部が分割した乗数Ｙの各部を各々乗算し、乗算した乗算結果の正負を示した符号ビットと乗算した乗算結果の絶対値とを含む部分積列を複数生成する部分積生成部と、
上記部分積生成部が生成した複数の部分積列に含まれる複数の符号ビットの値を加算し、加算した結果を定数値としてメモリに記憶し、上記部分積生成部が生成した複数の部分積列の絶対値を加算器によって加算し、加算した結果に上記メモリに記憶した符号ビットを付加する部分積加算部とを備える演算装置。
【請求項２】
上記部分積加算部は、
上記部分積生成部が生成した複数の部分積列に含まれる複数の符号ビットのビット位置を所定数の部分積列毎に揃え、さらに、一定の演算式に基づいて所定のビット位置に所定の定数ビットを複数設定し、設定した複数の所定の定数ビットから定数値を算出し、算出した定数値をメモリに記憶する請求項１に記載された演算装置。
【請求項３】
複数ビットの被乗数Ｘと複数ビットの乗数Ｙとの演算を行う演算装置であって、
複数ビットの乗数Ｙを複数の部分に分割する分割部と、
被乗数Ｘに対して上記分割部が分割した乗数Ｙの各部を各々乗算して、部分積列を複数生成する部分積生成部と、
上記部分積生成部が生成した複数の部分積列を加算器によって加算する部分積加算部と、
上記部分積加算部が加算した加算結果を保持するレジスタと、
上記レジスタが保持した加算結果の所定の部分を複数の入力ビットとして入力し、入力した複数の入力ビットを加算器により加算することによって入力ビットを圧縮して加算結果として出力する圧縮部とを備えた演算装置。
【請求項４】
上記演算装置は、さらに、
上記部分積加算部が行う加算処理の結果、発生した桁上りを保持する補正レジスタを備え、
上記部分積加算部は、
上記レジスタが保持した加算結果の一部をフィードバックビットとして入力し、入力したフィードバックビットを上記部分積生成部が生成した複数の部分積列とともに加算器によって加算し、加算した結果を上記補正レジスタに保持されている桁上りに基づいて補正する請求項３に記載された演算装置。
【請求項５】
上記部分積生成部と上記部分積加算部とが１クロック毎に行う処理に費やす処理時間と上記圧縮部が１クロック毎に行う処理に費やす処理時間とを連動させる請求項３に記載された演算装置。
【請求項６】
上記部分積加算部は、部分積列を３列単位で加算するワレスツリー（ＷＡＬＬＡＣＥ  ＴＲＥＥ）または部分積列を４列単位で加算するコンプレッサー（４−２ＣＯＭＰＲＥＳＳＯＲ）のいずれかの加算器によって複数の部分積列を加算する請求項１または請求項３のいずれかに記載された演算装置。
【請求項７】
複数ビットの被乗数Ｘと複数ビットの乗数Ｙとの演算を行う演算装置であって、
複数ビットの乗数Ｙを複数の部分に分割する分割部と、
被乗数Ｘに対して上記分割部が分割した乗数Ｙの各部を各々乗算して、部分積列をビット列として複数生成する部分積生成部と、
上記部分積生成部が生成した複数の部分積列の各ビット列を上位ビット列と下位ビット列とに分割し、分割した複数の上位ビット列と複数の下位ビット列とを複数段に配置された複数の加算器によって各々に分けて加算する部分積加算部と、
上記部分積加算部が複数の下位ビット列を加算した結果、発生した桁上りを保持する桁上りレジスタと、
上記桁上りレジスタが保持した桁上りを上記部分積加算部が加算した複数の上位ビット列の加算結果に加算する桁上り加算部とを備えた演算装置。
【請求項８】
上記部分積加算部は、さらに、
複数段に配置された複数の加算器が加算した加算結果を格納するレジスタを各段の加算器毎に備え、
上記各段の加算器と各段の加算器毎に備えられたレジスタとによって上記分割した複数の上位ビット列の加算処理と複数の下位ビット列の加算処理とを別々にパイプライン処理する請求項７に記載された演算装置。
【請求項９】
上記演算装置は、さらに、
演算に必要な中間値ｔを算出する中間値算出部を備える請求項７に記載された演算装置。
【請求項１０】
上記中間値算出部は、上記部分積加算部によって下位のビット列が加算された結果出力される出力値ｎ’に基づいて中間値ｔを算出する請求項９に記載された演算装置。
【請求項１１】
上記中間値算出部は、上記部分積加算部に配置されたｆ段目（ｆ＞０、ｆは整数）の加算器によって下位のビット列が加算された結果、出力されるビット列の一部を上記出力値ｎ’の一部として入力し、入力した出力値ｎ’の一部に基づいて中間値ｔの一部を算出する請求項９に記載された演算装置。
【請求項１２】
上記中間値算出部は、上記部分積加算部によって下位のビット列が加算された結果、出力された出力値ｎ’を複数クロックに一度の割合で取得し、取得した出力値ｎ’に基づいて中間値ｔを算出する請求項９に記載された演算装置。
【請求項１３】
上記分割部は、
複数ビットの乗数Ｙを２ビット毎に分割し、分割した乗数Ｙの各２ビットが持つ０と１と２と３とのいずれかの値を−２と−１と０と１と２とのいずれかの変換値に変換し、
上記部分積生成部は、被乗数Ｘと上記分割部によって変換された乗数Ｙの各変換値とを乗算することによって複数の部分積列を生成する請求項１または請求項３または請求項７のいずれかに記載された演算装置。
【請求項１４】
上記演算装置は、モンゴメリ法に従って被乗数Ｘと乗数Ｙとの積和演算を行う請求項１または請求項３または請求項７のいずれかに記載された演算装置。
【請求項１５】
正の値を持つ複数ビットの被乗数Ｘと正の値を持つ複数ビットの乗数Ｙとの演算を行う演算方法であって、
複数ビットの乗数Ｙを正負のある複数の部分に分割し、
被乗数Ｘに対して上記分割した乗数Ｙの各部を各々乗算し、乗算した乗算結果の正負を示した符号ビットと乗算した乗算結果の絶対値とを含む部分積列を複数生成し、
上記生成した複数の部分積列に含まれる複数の符号ビットの値を加算し、加算した結果を定数値としてメモリに記憶し、上記部分積生成部が生成した複数の部分積列の絶対値を加算器によって加算し、加算した結果に上記メモリに記憶した符号ビットを付加する演算方法。
【請求項１６】
複数ビットの被乗数Ｘと複数ビットの乗数Ｙとの演算を行う演算方法であって、
複数ビットの乗数Ｙを複数の部分に分割し、
被乗数Ｘに対して上記分割した乗数Ｙの各部を各々乗算して、部分積列を複数生成し、
上記生成した複数の部分積列を加算器によって加算し、
上記加算した加算結果をレジスタに保持し、
上記レジスタに保持された加算結果の所定の部分を複数の入力ビットとして入力し、入力した複数の入力ビットを加算器により加算することによって入力ビットを圧縮して加算結果として出力する演算方法。
【請求項１７】
複数ビットの被乗数Ｘと複数ビットの乗数Ｙとの演算を行う演算方法であって、
複数ビットの乗数Ｙを複数の部分に分割し、
被乗数Ｘに対して上記分割した乗数Ｙの各部を各々乗算して部分積列をビット列として複数生成し、
上記生成した複数の部分積列の各ビット列を上位ビット列と下位ビット列とに分割し、分割した複数の上位ビット列と複数の下位ビット列とを複数段に配置された複数の加算器によって各々に分けて加算し、
上記複数の下位ビット列を加算した結果、発生した桁上りを桁上りレジスタに保持し、
上記桁上りレジスタに保持された桁上りを上記加算した複数の上位ビット列の加算結果に加算する演算方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、積和演算を実行する演算装置及びその方法に関するものである。
【０００２】
【従来の技術】
一般に用いられるモンゴメリ法による多倍長演算装置は、ｒビットからなる被乗数Ｘ及び乗数Ｙを入力し、Ｚ＝Ｘ×Ｙ＋Ａ＋Ｂ型積和演算を処理する。処理の結果出力される出力値Ｚは２ｒビットとなるが、２ｒビットのうち下位半分のｒビットを出力し、上位半分のｒビットを多倍長演算装置にフィードバックすることによって、モンゴメリ法による多倍長演算装置を実現している。
一般に、剰余演算系で必要とされる除算処理は、ハードウエア実装において回路規模が大きく、遅延も大きい。
しかしながら、Ｐ．Ｌ．Ｍｏｎｔｇｏｍｅｒｙにより提案されたモンゴメリ法によるアルゴリズムは、除算処理をビットシフトで置き換えることができるため、演算処理の高速化及び演算装置の小型化が実現可能である（例えば、非特許文献１参照）。
【０００３】
【非特許文献１】
佐藤証、高野光司“高速モンゴメリ演算回路”、ＰＰ２３７−ＰＰ２４１、ＳＣＩＳ２００１  （電子情報通信学会により２００１年１月２３日〜２６日に開催）
【０００４】
【発明が解決しようとする課題】
このようにモンゴメリ法によるアルゴリズムは積和演算の連続処理からなっている。
また、モンゴメリ法を用いた演算で必要な中間値ｔを求める途中式ｔ：＝Ｐ［０］×ｎ’（ｍｏｄ２ｒ）の入力値Ｐ［０］は前のループにおける出力値Ｐ［０］である上、前式によって出力される中間値ｔは次の積和演算の入力となっている。
このため、このアルゴリズムを高速に処理し、かつ、コンパクトな回路規模を持つハードウエアでモンゴメリ法による積和演算を行う演算装置を実装するためには、上記アルゴリズムの処理の負荷を考慮した回路によって構成される演算装置が必要であった。
【０００５】
ここで、演算装置の回路面積の大半は積和演算を処理するアルゴリズムによって決まる。
したがって、回路面積が増加することによるコストの増加を抑止するため、回路面積の制限が厳しい場合においては、積和演算処理を高速化する策として、製品に上記アルゴリズムを実行する演算装置を複数個実装することは困難であり、演算装置を１つのみ実装するのが望ましかった。
【０００６】
さらに、ハードウエアの一般的な高速化手法としてパイプライン化があるが、積和演算装置をパイプライン化した場合、レイテンシ（入力データに対し出力データが出力されるまでの遅延時間）が発生する。このため、モンゴメリ法に見られるような、積和演算装置の出力データを次の入力データに用いる場合は待ち時間が発生する。よってパイプライン化を施しても待ち時間が発生しない、もしくはできるだけ少なくなるような機構が必要であった。
【０００７】
この発明の演算装置は、剰余演算、乗算剰余演算等を高速に実行することを目的とする。
【０００８】
【課題を解決するための手段】
個の発明に係る演算装置は、正の値を持つ複数ビットの被乗数Ｘと正の値を持つ複数ビットの乗数Ｙとの演算を行う演算装置であって、
複数ビットの乗数Ｙを正負のある複数の部分に分割する分割部と、
被乗数Ｘに対して上記分割部が分割した乗数Ｙの各部を各々乗算し、乗算した乗算結果の正負を示した符号ビットと乗算した乗算結果の絶対値とを含む部分積列を複数生成する部分積生成部と、
上記部分積生成部が生成した複数の部分積列に含まれる複数の符号ビットの値を加算し、加算した結果を定数値としてメモリに記憶し、上記部分積生成部が生成した複数の部分積列の絶対値を加算器によって加算し、加算した結果に上記メモリに記憶した符号ビットを付加する部分積加算部とを備える。
【０００９】
【発明の実施の形態】
まず、Ｐ．Ｌ．Ｍｏｎｔｇｏｍｅｒｙにより提案されたモンゴメリ法を実行するためのアルゴリズムについて説明する。
モンゴメリ定数Ｒを除数ｎと互いに素で、除数ｎより大きく剰余計算が容易な整数（例えば２ｋ）とする。ｎを除数とするモンゴメリ定数Ｒの乗法に関する逆数をＲ−１とする。また、ｎ’を０＜ｎ’＜Ｒ、かつ、Ｒ・Ｒ−１−ｎ・ｎ’＝１を満たす整数とする。
このとき、０≦Ｐ＜ｎ・Ｒである整数Ｐ（＝Ｘ・Ｙ・Ｒ−１ｍｏｄｎ）はモンゴメリ法により以下に述べる手順で容易に計算可能である。
（１）入力  被乗数Ｘ、乗数Ｙ、除数ｎ
（２）前計算  ｎ’＝−ｎ−１（ｍｏｄＲ）
（３）モンゴメリ乗算
ｓｔｅｐ１：  Ｐ：＝（Ｘ・Ｙ・ｍｏｄＲ）・ｎ’・ｍｏｄＲ
ｓｔｅｐ２：  Ｐ：＝（Ｘ・Ｙ＋Ｐ・ｎ）／Ｒ
ｓｔｅｐ３：  ｉｆ  Ｐ≧ｎ  ｄｏ  Ｐ：＝Ｐ−ｎ
ｓｔｅｐ４：  ｒｅｔｕｒｎ  Ｐ
（４）出力  Ｐ≡Ｘ・Ｙ・Ｒ−１・ｍｏｄｎ
【００１０】
モンゴメリ乗算は、剰余乗算を加算、乗算、シフト演算の繰り返しによって、除算を行わずに実行することのできるアルゴリズムであり、公開鍵暗号系で多用する剰余乗算を、高速に処理する方法の１つである。すなわち、モンゴメリ乗算は、剰余系演算で必要な除算処理をビットシフト等に置き換え、単調な積和演算の繰り返しで剰余乗算を処理できるため、ハードウエアへの実装に適している。公開鍵暗号系では、上記除数ｎ、被乗数Ｘ、乗数Ｙ等のパラメータが非常に大きいビット長となるため、各入力ビットをｍ個のビットブロックに分割後、モンゴメリ法による各計算を行うのが一般的である。例として上記除数ｎ、被乗数Ｘ、乗数Ｙに対する各々の全体の入力ビット長ｋをｒビットにｍ分割したモンゴメリ法の計算手順を以下に示す。
（１）入力データ
入力ビット数ｋビットを持つ入力データ（被乗数Ｘ、乗数Ｙ、除数ｎ）を各々ｒビットにｍ分割すると入力データは、次のように表される。
入力：被乗数Ｘ（Ｘ［ｍ−１］，Ｘ［ｍ−２］，…，Ｘ［１］，Ｘ［０］）  ｋ＝ｍ・ｒ（ｂｉｔ）
乗数Ｙ（Ｙ［ｍ−１］，Ｙ［ｍ−２］，…，Ｙ［１］，Ｙ［０］）  ｋ＝ｍ・ｒ（ｂｉｔ）
除数ｎ（ｎ［ｍ−１］，ｎ［ｍ−２］，…，ｎ［１］，ｎ［０］）  ｋ＝ｍ・ｒ（ｂｉｔ）
０≦Ｘ，Ｙ＜ｎ，Ｒ＝（２ｒ）ｍ，ｇｃｄ（ｎ，Ｒ）＝１
（２）前計算
ｎ’について次の前処理を行う。
ｎ’＝−ｎ−１（ｍｏｄ２ｒ）
（３）モンゴメリ乗算
１．Ｐ←０
２．ｊ＝０からｊ＝ｍ−１まで次の計算を行う。
２．１  Ｐ［ｊ］←Ｐ［ｊ］＋Ｘ・Ｙ［ｊ］
２．２  ｔ＝Ｐ［０］・ｎ’ｍｏｄ２ｒ
２．３  Ｐ［ｊ−１］←（Ｐ［ｊ］＋ｔ・ｎ［ｊ］）／２ｒ
（４）出力データ
Ｐ≧ｎの場合には（Ｐ−ｎ）を出力する。それ以外の場合（Ｐ＜ｎ）にはＰを出力する。
【００１１】
上記モンゴメリ乗算を実行するためのプログラムを以下に示す。
2004227248.tif 000003
なお、上記プログラム中「｜」はビット連結を表し、例えば、Ａ＝１１００，Ｂ＝００１１の場合には、Ａ｜Ｂ＝１１００００１１となる。
【００１２】
上記モンゴメリ法のアルゴリズムにおいてハードウエア設計上問題となるのは２．２から２．３の計算である。なぜなら、乗算結果Ｐが次の積和演算の処理のための入力値となるためである。すなわち、上記アルゴリズムでは乗算と加算からなる積和演算の連続処理が実行されており、ステップ８で実行される式から算出される中間値ｔ（ｔ：＝Ｐ［０］×ｎ’（ｍｏｄ  ２ｒ））の入力値Ｐ［０］は前のループにおける出力値Ｐ［０］である。また、中間値ｔはステップ１０で実行される積和演算ｃａｒｒｙ｜Ｐ［ｊ］：＝ｔ×ｎ［ｊ］＋Ｐ［ｊ−１］＋ｃａｒｒｙの入力値の一つとなっている。このため、演算装置をパイプライン化した場合、通常、処理効率を著しく低下させる待ち時間が発生してしまう。
以下のすべての実施の形態では、上記モンゴメリ法のアルゴリズムの問題点を考慮して、モンゴメリ乗算の高速処理を実現し、かつ、装置全体の面積を最小限に抑えた演算装置について説明する。
【００１３】
実施の形態１．
以下、実施の形態１について説明する。
図１は、本実施の形態に係る演算装置１の全体構成図である。
演算装置１は、正の値を持つ複数ビットの被乗数Ｘと正の値を持つ複数ビットの乗数Ｙとの演算を行う装置であり、演算の一例としてモンゴメリ法による積和演算を行う。
演算装置１は、セレクタ１０と、セレクタ１１と、ブース符号化を行うブース符号化部２０と、セレクタ１１とブース符号化部２０から出力されたビット列を保持する第１のレジスタ３０と、積和演算を行う積和演算部４０と、積和演算部４０から出力されたビット列を保持する第２のレジスタ５０と、第２のレジスタ５０に保持された所定の部分のビット列（ｒビット×２）と１クロック前に演算した演算結果Ｐｉとを加算するによって入力ビットを圧縮して加算結果として出力する圧縮部６０とから構成される。
【００１４】
ブース符号化部２０は、複数ビットの乗数Ｙを正負のある複数の部分に分割する分割部の一例である。すなわち、ブース符号化部２０は、複数ビットからなる乗数Ｙを２ビット毎に分割し、分割した乗数Ｙの各２ビットが持つ０と１と２と３とのいずれかの値を−２と−１と０と１と２とのいずれかの変換値に変換（ブース符号化）する部である。
積和演算部４０は、部分積生成部４００と部分積加算部４５０と補正レジスタ４７０とから構成される。
部分積生成部４００は、被乗数Ｘに対して分割部（ブース符号化部２０）が分割（ブース符号化）した乗数Ｙの各部を各々乗算し、乗算した乗算結果の正負を示した符号ビットと乗算した乗算結果の絶対値とを含む部分積列を複数生成する部である。
部分積加算部４５０は、部分積生成部４００が生成した複数の部分積列に含まれる複数の符号ビットの値を加算し、加算した結果を定数値としてメモリ４５１に記憶し、部分積生成部４００が生成した複数の部分積列の絶対値を加算器によって加算し、加算した結果にメモリ４５１に記憶した符号ビットを付加し、２ｒビットのビット列を２本出力する部である。
補正レジスタ４７０は、部分積加算部４５０が行う加算処理の結果、桁上りが発生した場合に発生した桁上りを保持するレジスタである。
【００１５】
第２のレジスタ５０は、Ａ（１）レジスタ５００とＡ（２）レジスタ５５０と、Ｂ（１）レジスタ５１０とＢ（２）レジスタ５６０とから構成される。
Ａ（１）レジスタ５００とＡ（２）レジスタ５５０とは、部分積加算部４５０から出力された２ｒビットのビット列の１本目を格納するレジスタであり、Ａ（１）レジスタ５００には上位ｒビットが格納され、Ａ（２）レジスタ５５０には下位ｒビットが格納されている。
Ｂ（１）レジスタ５１０とＢ（２）レジスタ５６０とは、部分積加算部４５０から出力された２ｒビットのビット列の２本目を格納するレジスタであり、Ｂ（１）レジスタ５１０には上位ｒビットが格納され、Ｂ（２）レジスタ５６０には下位ｒビットが格納されている。
圧縮部６０は、全加算器６００と２値加算器６５０と桁上りレジスタ６１０と桁上りレジスタ６６０とから構成される。
全加算器６００は、Ａ（２）レジスタ５５０に格納されたｒビットのビット列とＢ（２）レジスタ５６０に格納されたｒビットのビット列と１クロック前に演算装置１によって演算された演算結果Ｐｉを入力し、入力した３値を加算した結果、２値に圧縮して出力する処理をビット列のビット数分繰り返す加算器である。加算によって発生した桁上りは桁上りレジスタ６１０に保持され、全加算器６００による次の加算処理時に保持された桁上りも一緒に加算される。
２値加算器６５０は、全加算器６００から出力された２値を加算した結果、２値に圧縮して出力する処理を入力されるビット列のビット数分繰り返す加算器である。加算によって発生した桁上りは桁上りレジスタ６６０に保持され、２値加算器６５０による次の加算処理時に保持された桁上りも一緒に加算される。２値加算器６５０から出力された一定ビット数のビット列Ｐはモンゴメリ乗算結果である。
セレクタ１０は、乗数Ｙと除数ｎと計算値ｎ’（＝−ｎ−１（ｍｏｄ２ｒ））とを入力し、積和演算部４０で行う処理内容に合わせて１つのデータを選択する。同様にセレクタ１１は、被乗数Ｘと演算装置１によって出力された前回のループにおける出力値Ｐ０と中間値ｔとを入力し、積和演算部４０で行う処理内容に合わせて１つのデータを選択する。
【００１６】
次に、図１に示す演算装置１の全体の動作について説明する。
まず、ブース符号化部２０は、セレクタ１０によって選択されたｒビットの乗数Ｙをブース符号化する。
第１のレジスタ３０は、セレクタ１１によって選択されたｒビットの被乗数Ｘとブース符号化された乗数Ｙとを格納する。
次に、積和演算部４０が乗数Ｙと被乗数Ｘとの積和演算を行う。すなわち、積和演算部４０の部分積生成部４００は、第１のレジスタ３０に格納された乗数Ｙと被乗数Ｘとからｒ＋１個の部分積を生成する。
次に、部分積加算部４５０は、部分積生成部４００によって生成されたｒ＋１個の部分積にフィードバックしたキャリー１、キャリー２（Ｃａｒｒｙ１、Ｃａｒｒｙ２）を加算する。ここで、キャリー１、キャリー２は、部分積加算部４５０から前回のループで出力された上位２ｒビットを直接フィードバックした値である。すなわち、キャリー１、キャリー２としてフィードバックされるデータは、Ａ（１）レジスタ５００、Ｂ（１）レジスタ５１０に格納されたビット列となる。ただし、部分積加算部４５０が行う最初の加算では、フィードバックしたキャリー１、キャリー２の代わりにセレクタ１１に入力され、セレクタ１１によって選択されたＰ０（演算装置１によって出力された前回の出力値）と部分積とが加算される。
積和演算部４０で積和演算に使用される上記モンゴメリ乗算を実行するためのアルゴリズムに記載した中間値ｔ（ｔ：＝Ｐ［０］×ｎ’（ｍｏｄ２ｒ））は、セレクタ１１に入力され、セレクタ１１によって選択され、積和演算に使用されるタイミングに合わせて第１のレジスタ３０から積和演算部４０に入力される。
このように、部分積生成部４００によって乗算され、部分積加算部４５０によって加算された結果、部分積加算部４５０から出力されたビット列は２本の２ｒビット列（Ａ（１）レジスタ５００とＡ（２）レジスタ５５０とに格納された２ｒビットのビット列＋Ｂ（１）レジスタ５１０とＢ（２）レジスタ５６０とに格納された２ｒビットのビット列）にまで圧縮され、第２のレジスタ５０に格納される。
第２のレジスタ５０に格納された２本の２ｒビット列のうち、Ａ（１）レジスタ５００とＢ（１）レジスタ５１０とに格納された上位２ｒビットのデータは部分積生成部４００にキャリー１、キャリー２として再びフィードバックされ、Ａ（２）レジスタ５５０とＢ（２）レジスタ５６０とに格納された下位の２ｒビットとＰｉは圧縮部６０に入力される。圧縮部６０の全加算器６００は入力された上記３値を加算して２値に変換し、桁上りが生じた場合には、桁上りレジスタ６１０に桁上りを格納する。圧縮部６０の２値加算器６５０は、全加算器６００から出力された２値を加算して１値に変換し、桁上りが生じた場合には、桁上りレジスタ６６０に桁上りを格納する。このような動作によって入力ビット列を１本のｒビット列にまで圧縮し、モンゴメリ乗算結果Ｐとして出力する。
【００１７】
次に、演算装置１の各部の機能と動作について、詳細に説明する。
＜ブース符号化部２０によるブース符号化＞
ブース符号化部２０は、乗数Ｙを２ビットずつに分割し、分割した乗数Ｙの各部を２進数表現（０，１，２，３のいずれかの値）から集合｛−２、−１、０、１、２｝の４進拡張ＳＤ（ｓｉｇｎｅｄ−ｄｉｇｉｔ）表現に変換する。この変換をブース符号化という。ブース符号化は、逐次型乗算器等の累算回数を減らし、高速な処理を可能とするために行われる。
一般に、ｎビットの乗数Ｙ対し乗算を行う場合、次式のような加算の繰り返しを行う。
2004227248.tif 000004
上記「Ｘ×Ｙ［０］」、「Ｘ×Ｙ［１］」、・・・、「Ｘ×Ｙ［ｎ−１］」で示される各々の積を以下、部分積列という。
ここで、Ｙの２ビット（Ｙ［ｉ］，Ｙ［ｉ＋１］）を同時に計算すれば、部分積は「Ｘ×（Ｙ［０］＋Ｙ［１］）」、・・・、「Ｘ×（Ｙ［ｎ−２］＋Ｙ［ｎ−１］）」となるため、部分積の数（累算加算数）がｎ／２となる。したがって、部分積をｎ／２回加算することによって乗算結果Ｐを算出することができる。この場合、Ｙの２ビットが取りうる値は０、１、２、３のいずれかであるため、各部分積の取りうる値は、０、Ｘ、２Ｘ、３Ｘのいずれかとなる。
ハードウエア上、２Ｘはビットを１ビットシフトすることで生成できるが、３Ｘは前もって計算してレジスタ等に保存しておくか、毎回（Ｘ＋２Ｘ）を実行することによって生成する必要がある。
これを回避するために、ブース符号化部２０では、Ｙにあるレコード的な処理（ブース符号化）を施す。このことにより、部分積の加算時に３Ｘを用いずに計算を行うことができる。原理としては、３Ｘ＝−Ｘ＋４Ｘであることを用いて、３Ｘを計算する必要がある場合には、−Ｘを生成し、後から−Ｘに４Ｘを加算することによって３Ｘの計算を実現している。
【００１８】
このような原理を利用するために、ブース符号化部２０は、乗数Ｙをブース符号化する。
ブース符号化部２０が行う乗数Ｙのブース符号化を図２に示す。
基数４のブース符号化は、３Ｘを用意せずに累算加算数をおよそ半分にすることができる。図２は乗数のＹ２ｉ＋１、Ｙ２ｉ、Ｙ２ｉ−１をＹｉ／２＝−２Ｙ２ｉ＋１＋Ｙ２ｉ＋Ｙ２ｉ−１に代入することによってブース符号化されたＹｉ／２を示す。図２に示すように、Ｙｉ／２が取りうる値は、−２、−１、０、１、２のいずれかであるため、各部分積列の取りうる値は、−２Ｘ、−Ｘ、０、Ｘ、２Ｘのいずれかとなる。
このように、部分積列は負の値（−２Ｘ、−Ｘ）を取る場合が生じるので、後述する部分積加算部４５０で行う部分積列の加算では、負の部分積列に対応するために符号ビットが必要となる。
本実施の形態に係る発明では、部分積加算部４５０が部分積列に含まれる部分積列の正負を示す符号ビットの加算を高速に処理することが可能であるが、処理方法については後述する。
【００１９】
＜部分積生成部４００による部分積生成＞
図３に部分積生成部４００によって乗数Ｙと被乗数Ｘとから生成された部分積の一例を示す。
乗数Ｙ（Ｙ５、Ｙ４、Ｙ３、Ｙ２、Ｙ１、Ｙ０）はブース符号化部２０によってブース符号化されてＹ（Ｙ５４、Ｙ３２、Ｙ１０）となっている。Ｙ５４、Ｙ３２、Ｙ１０は−２、−１、０、１、２のいずれかの値を持つ。
生成された部分積は「Ｘ０×Ｙ１０」、「Ｘ１×Ｙ１０」、「Ｘ２×Ｙ１０」、「Ｘ３×Ｙ１０」、・・・・、「Ｘ５×Ｙ５４」となり、部分積の数はブース符号化する前ｒ２個の半分ｒ２／２個となっている。例えば、「Ｘ０×Ｙ１０」、「Ｘ１×Ｙ１０」、「Ｘ２×Ｙ１０」、「Ｘ３×Ｙ１０」、「Ｘ４×Ｙ１０」、「Ｘ５×Ｙ１０」の６つの部分積から構成される一列目の部分積列はＸ×Ｙ１０と等価である。乗数Ｘは正の数であるため、一列目の部分積列の正負はＹ１０の正負により定まる。２列目、３列目の部分積列も同様である。
【００２０】
＜部分積加算部４５０による部分積列に含まれる符号ビットの処理＞
次に、複数の部分積列の絶対値の高速加算処理のため、部分積加算部４５０によって実行される符号ビットの処理について説明する。
部分積加算部４５０は、部分積列を３列単位で加算して２列のビット列を出力するワレスツリー（ＷＡＬＬＡＣＥ  ＴＲＥＥ）や部分積列を４列単位で加算して２列のビット列を出力するコンプレッサー（４−２ＣＯＭＰＲＥＳＳＯＲ）などにより実現することができる。
このように、部分積加算部４５０が部分積列を３列または４列単位に加算して２列のビット列を出力する処理を行うことは、処理スピード上好ましい。しかし、部分積加算部４５０は上記以外にも部分積列をｎ列単位に加算してｋ列のビット列を出力するカウンタ（ｎ−ｋＣＯＵＮＴＥＲ（ｎ＞ｋ））によって実現可能である。
以下に説明する部分積加算部４５０は、部分積列を３列単位で加算して２列のビット列を出力するＷＡＬＬＡＣＥ  ＴＲＥＥの実装を想定している。
【００２１】
図４は、部分積加算部４５０が、符号ビットを含む複数の部分積列の加算のための前処理として行う符号ビットの処理方法を示している。
一般に、Ｐ＝Ｘ×Ｙ＋Ａ＋Ｂの積和演算では、入力値Ｙ、Ｘ、Ａ、Ｂの各々がｒビットである場合、最終結果Ｐが２ｒビット以下の正数であることが保証されている。これは、入力値Ｙ、Ｘ、Ａ、Ｂの各々の最高桁数が（２ｒ−１）であるため、これをＰに代入して、Ｐ＝（２ｒ−１）×（２ｒ−１）＋（２ｒ−１）＋（２ｒ−１）＝２２ｒ−１となるためである。よって、積和演算部４０の部分積加算部４５０から出力された２ｒビットを持つ２本のビット列のうち、各々のビット列の上位ｒビットが、図１に示すＡ（１）レジスタ５００とＢ（１）レジスタ５１０に保持され、下位ｒビットが、Ａ（２）レジスタ５５０とＢ（２）レジスタ５６０に保持される。
また、乗数Ｙをブース符号化することにより部分積生成部４００が生成した部分積列が負の値（−Ｘ、−２Ｘ）をとる場合があるため、部分積加算部４５０の出力が負の数になる場合がある。したがって、部分積加算部４５０による複数の部分積列の加算途中において、部分積加算部４５０から出力される出力値Ｐが一時的に負数になる場合賀生ずる。したがって、部分積加算部４５０から出力される出力値Ｐの絶対値を格納する上記Ａ（１）レジスタ５００、Ｂ（１）レジスタ５１０、Ａ（２）レジスタ５５０、Ｂ（２）レジスタ５６０とともに出力値の正負を示す符合ビットを格納するレジスタが必要になる。
よって、出力値Ｐの最高桁数が２ｒビットであることを考慮して、付加する符号ビットの最終位置は２ｒ＋１ビットとし、２ｒ＋１ビット目の符号ビットの値は、図１に示す補正レジスタ４７０に格納する。
本実施の形態の演算装置１では、補正レジスタ４７０に格納された符号ビットを用いてＡ（１）レジスタ５００とＢ（１）レジスタ５１０から部分積加算部４５０にフィードバックされるキャリー１、キャリー２の補正を行う。この補正については後述する。
【００２２】
部分積加算部４５０がＷＡＬＬＡＣＥ  ＴＲＥＥによって実現される場合、部分積列Ａ、部分積列Ｂ、部分積列Ｃは図４（ａ）に示すように、ビット位置が同じ各部分積列の３値を加算して２値を出力する。このように、部分積加算部４５０は、入力された部分積列の３値を加算して２値を出力するとともに、桁上りを所定の記憶領域に保存する複数の加算器（桁上げ保存型の全加算器）によって加算処理を行う。
図４（ａ）に示すように部分積列Ａ、部分積列Ｂ、部分積列Ｃの各部分積列には各々の部分積列の符号を示す符号ビットＡｋ−１、Ｂｋ、Ｃｋ＋１が必要である。また、各列の最下位ビットを合わせるために０の値を持つＢ０、Ｃ０、Ｃ１が付加されている。
【００２３】
部分積列Ａ、部分積列Ｂ、部分積列Ｃの加算において、部分積加算部４５０は、以下の処理を行う。
まず、部分積加算部４５０は、部分積生成部４００が生成した複数の部分積列に含まれる複数の符号ビットのビット位置を所定数の部分積列毎に揃える。すなわち、図４（ｂ）に示すように部分積列Ａ、部分積列Ｂ、部分積列Ｃの各部分積列のビット長を合わせるために符号ビットをパディングする。つまり、部分積加算部４５０は、部分積列Ｃのビット長に部分積列Ａと部分積列Ｂに含まれる符号ビットの位置を合わせるために、部分積列Ａでは符号ビットＡｋ−１をｋビット目及びｋ＋１ビット目にパディングし、同様に、部分積列ＢではＢｋの符号ビットをｋ＋１ビット目にパディングする（符号パディング）。
符号ビットのビット位置を揃える所定数の部分積列とは、ＷＡＬＬＡＣＥ  ＴＲＥＥであれば、３列の部分積列であり、４−２ＣＯＭＰＲＥＳＳＯＲであれば４列の部分積列である。
上記符号ビットのパディングは、−２ｌ＋２ｌ−１＋・・・・＋１＝−２ｌ＋１＋２ｌ＋２ｌ−１＋・・・・＋１であることを利用している。部分積加算部４５０の上記符号パディングはこの式を以下のように変形することによって可能となる。
（−２ｋ−１Ａｋ−１＋２ｋ−２Ａｋ−２＋・・・＋Ａ０）＋（−２ｋＢｋ＋２ｋ−１Ｂｋ−１＋・・・＋Ｂ０）＋（−２ｋ＋１Ｃｋ＋１＋２ｋＣｋ＋・・・＋Ｃ０）
＝（−２ｋ＋１Ａｋ−１＋２ｋＡｋ−１＋２ｋ−１Ａｋ−１＋２ｋ−２Ａｋ−２＋・・・＋Ａ０）＋（−２ｋ＋１Ｂｋ＋２ｋＢｋ＋２ｋ−１Ｂｋ−１＋２ｋ−２Ｂｋ−２＋・・・＋Ｂ０）＋（−２ｋ＋１Ｃｋ＋１＋２ｋＣｋ＋２ｋ−１Ｃｋ−１＋２ｋ−２Ｃｋ−２＋・・・＋Ｃ０）・・・（２）
【００２４】
次に、部分積加算部４５０は図４（ｂ）に示すパディングされた部分積列毎に図４（ｃ）に示すような符号拡張を行う。
この符号拡張を担保する式を次に説明する。
上記（２）
＝−２ｋ＋１（Ａｋ−１＋Ｂｋ＋Ｃｋ＋１）＋２ｋ（Ａｋ−１＋Ｂｋ＋Ｃｋ）＋２ｋ−１（Ａｋ−１＋Ｂｋ−１＋Ｃｋ−１）＋２ｋ−２（Ａｋ−２＋Ｂｋ−２＋＋Ｃｋ−２）＋・・・（Ａ０＋Ｂ０＋Ｃ０）
＝２ｋ＋１（−Ａｋ−１−Ｂｋ−Ｃｋ＋１）＋２ｋ（Ａｋ−１＋Ｂｋ＋Ｃｋ）＋２ｋ−１（Ａｋ−１＋Ｂｋ−１＋Ｃｋ−１）＋２ｋ−２（Ａｋ−２＋Ｂｋ−２＋＋Ｃｋ−２）＋・・・＋（Ａ０＋Ｂ０＋Ｃ０）・・・（３）
ここで、Ａの反転を［Ａ］で表すと、−Ａｋ−１＝［Ａｋ−１］−１であるため、上記（３）は、次のように変形できる。
上記（３）
＝２ｋ＋１（［Ａｋ−１］＋［Ｂｋ］＋［Ｃｋ＋１］−１−１−１）＋２ｋ（Ａｋ−１＋Ｂｋ＋Ｃｋ）＋２ｋ−１（Ａｋ−１＋Ｂｋ−１＋Ｃｋ−１）＋２ｋ−２（Ａｋ−２＋Ｂｋ−２＋Ｃｋ−２）＋・・・＋（Ａ０＋Ｂ０＋Ｃ０）
＝２ｋ＋１（［Ａｋ−１］＋［Ｂｋ］＋［Ｃｋ＋１］−１−１−１−１＋１）＋２ｋ（Ａｋ−１＋Ｂｋ＋Ｃｋ）＋２ｋ−１（Ａｋ−１＋Ｂｋ−１＋Ｃｋ−１）＋２ｋ−２（Ａｋ−２＋Ｂｋ−２＋Ｃｋ−２）＋・・・＋（Ａ０＋Ｂ０＋Ｃ０）
＝２ｋ＋３＋２ｋ＋１（［Ａｋ−１］＋［Ｂｋ］＋［Ｃｋ＋１］＋１）＋２ｋ（Ａｋ−１＋Ｂｋ＋Ｃｋ）＋２ｋ−１（Ａｋ−１＋Ｂｋ−１＋Ｃｋ−１）＋２ｋ−２（Ａｋ−２＋Ｂｋ−２＋Ｃｋ−２）＋・・・＋（Ａ０＋Ｂ０＋Ｃ０）・・・（４）
上記（４）に基づいて、図４（ｃ）に示すように、部分積列Ａ、部分積列Ｂ、部分積列Ｃのいずれかの列の「Ｋ＋３ビット目に１、Ｋ＋２ビット目に０を設定し、Ｋ＋１ビット目のＡｋ−１とＢｋとＣｋ＋１とを反転させる（以下、反転したＡｋ−１、Ｂｋ、Ｃｋ＋１を［Ａｋ−１］、［Ｂｋ］、［Ｃｋ＋１］と示す）とともにＫ＋１ビット目に１を加算する」という符号拡張を行うことが可能となる。
続いて、部分積列Ａ、部分積列Ｂ、部分積列Ｃのいずれかの列の（Ｋ＋４）ビット目〜（２ｒ＋１）ビット目のすべてのビットに１を立てることによって符号拡張する。２ｒ＋１ビット目は、前述したように符号ビットの最終位置である。
【００２５】
上記符号パディングと符号拡張の処理後に行う部分積加算部４５０の動作を説明する。
図５は、部分積加算部４５０の動作を示すフローチャートである。
前述したように、部分積加算部４５０は符号のパディング（Ｓ１００）と符号拡張）とを行う。次に、部分積加算部４５０は、符号拡張された複数の部分積列に含まれる複数の所定の定数ビットを加算する。すなわち、部分積加算部４５０は、部分積生成部４００が生成した複数の部分積列に含まれる複数の所定の定数ビットの値を加算して、定数値を予め算出し（Ｓ１２０）、算出した定数値をメモリ４５１に記憶し（Ｓ１３０）しておく。
それから、部分積加算部４５０は、部分積生成部４００によって生成された複数の部分積列の絶対値を加算器によって加算し（Ｓ１４０）、加算した結果にメモリ４５１に記憶した定数値を付加する（Ｓ１５０）。
【００２６】
図６〜図９は、部分積加算部４５０の一例として１６ビットデータを処理するＷＡＬＬＡＣＥ  ＴＲＥＥを用いた場合の部分積列を構成するビット列の変化を示す。
図６は、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）に入力される複数の部分積列を示す。部分積列Ａ〜部分積列Ｉの９列に示された白丸は部分積生成部４００で生成された部分積である。黒丸は部分積列の正負を示す符号ビットである。
図７は、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）に内在する加算器（桁上り保存型の全加算器）を用いて加算処理するために、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）が部分積列Ａ〜部分積列Ｃ、部分積列Ｄ〜部分積列Ｆ、部分積列Ｇ〜部分積列Ｉの３列単位に加算処理を行うことを示している。
図８は、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）が上記３列ごとにビット長を合わせるために符号ビットをパディングした後の複数の部分積列のビット列を示している。
図９は、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）が、符号ビットの最終位置である２ｒ＋１＝２×１６（ビット）＋１＝３３ビット目まで部分積列Ａ及び部分積列Ｄの符号拡張を行った後の複数の部分積列のビット列データを示している。破線内は複数の定数ビットから構成される。破線内の複数の定数ビットは、前述したように一定の演算式に基づいて所定のビット位置に所定の定数ビットを複数設定する（符号拡張）ことによって生じたビットである。
図１０は、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）が、符号拡張において設定した複数の所定の定数ビットを加算して定数値を算出した状態を示す。すなわち、図９の破線内にある複数の定数ビットを加算し、その加算結果を定数値として最終列に示している。最終列に示された定数値は部分積加算部４５０によってメモリ４５１に格納される。
さらに、後述する補正処理のために必要な符号ビットである３３ビット目も計算しておく。最終列の定数値は部分積列の初列である部分積列Ａ以降の各部分積列に入れ込みながら処理することができる。
図１１では、部分積加算部４５０（ＷＡＬＬＡＣＥ  ＴＲＥＥ）が、部分積列の絶対値を３列単位に全加算器によって加算して２値を出力する動作を繰り返すことによってデータを少しずつ圧縮していく動作を表している。この動作により最終的には３２ビットのビット列が２本になるまで入力された入力ビットを圧縮する。
【００２７】
以上のように、本実施の形態では、正の値を持つ複数ビットの被乗数Ｘと正の値を持つ複数ビットの乗数Ｙとの演算を行う演算装置１であって、複数ビットの乗数Ｙを正負のある複数の部分に分割する分割部（ブース符号化部２０）と、被乗数Ｘに対して上記分割部（ブース符号化部２０）が分割した乗数Ｙの各部を各々乗算し、乗算した乗算結果の正負を示した符号ビットと乗算した乗算結果の絶対値とを含む部分積列を複数生成する部分積生成部４００と、上記部分積生成部４００が生成した複数の部分積列に含まれる複数の符号ビットの値を加算し、加算した結果を定数値としてメモリ４５１に記憶し、上記部分積生成部４００が生成した複数の部分積列の絶対値を加算器によって加算し、加算した結果に上記メモリ４５１に記憶した符号ビットを付加する部分積加算部４５０とを備える演算装置１について説明した。
【００２８】
また、ビットの符号拡張によるビット列の最適化を行ったＷＡＬＬＡＣＥ  ＴＲＥＥや４−２ＣＯＭＰＲＥＳＳＯＲを用いて構成した積和演算部４０を持ち、モンゴメリ法を実行する多倍長演算装置（演算装置１）について説明した。すなわち、上記部分積加算部４５０は、上記部分積生成部４００が生成した複数の部分積列に含まれる複数の符号ビットのビット位置を所定数の部分積列毎に揃え、さらに、一定の演算式に基づいて所定のビット位置に所定の定数ビットを複数設定し、設定した複数の所定の定数ビットから定数値を算出し、算出した定数値をメモリ４５１に記憶する演算装置１について説明した。
【００２９】
また、ＷＡＬＬＡＣＥ  ＴＲＥＥや４−２  ＣＯＭＰＲＥＳＳＯＲ等を用いた部分積加算部４５０を含む積和演算部４０と、その後に必ず必要な高速２値加算器等によって構成される圧縮部６０の間に第２のレジスタ５０を入れて、第２のレジスタ５０から出力される出力ビットのうち下位半数ビットを２値加算器６５０等によって構成される圧縮部６０に入力し、上位半数ビットをＷＡＬＬＡＣＥＴＲＥＥや４−２  ＣＯＭＰＲＥＳＳＯＲ等を用いた部分積加算部４５０を含む積和演算部４０への入力としてフィードバックさせた構成をもつモンゴメリ法による多倍長演算装置（演算装置１）について説明した。すなわち、複数ビットの被乗数Ｘと複数ビットの乗数Ｙとの演算を行う演算装置１であって、複数ビットの乗数Ｙを複数の部分に分割する分割部（ブース符号化部２０）と、被乗数Ｘに対して上記分割部（ブース符号化部２０）が分割した乗数Ｙの各部を各々乗算して、部分積列を複数生成する部分積生成部４００と、上記部分積生成部４００が生成した複数の部分積列を加算器によって加算する部分積加算部４５０と、上記部分積加算部４５０が加算した加算結果を保持するレジスタ（第２のレジスタ５０）と、上記レジスタ（第２のレジスタ５０）が保持した加算結果の所定の部分（下位ｒビット×２）を複数の入力ビットとして入力し、入力した複数の入力ビットを加算器により加算することによって入力ビットを圧縮して加算結果Ｐとして出力する圧縮部６０とを備えた演算装置１について説明した。
【００３０】
上述したように本実施の形態の演算装置１では、ブース符号化部２０が乗数Ｙをブース符号化することによって、部分積生成部４００で生成される部分積列がブース符号化しない場合の半分となる。
また、部分積加算部４５０が符号拡張後の定数項をあらかじめ計算することを可能にするために、入力されたビット列の最適化が図られている。これによって、複数の部分積列を所定の単位に区切った各初列の符号パディングに必要な面積以外はほとんど面積を増加せずにビットデータの符号拡張を行うことができる。このように、本実施の形態の演算装置１においては、モンゴメリ乗算に使用する部分積が半分で、かつ、データを符号拡張することによってデータを最適化しているため、従来と比較して高速な処理が可能となり、かつ、前記高速処理に伴う面積増も最小限に抑止可能な回路を構成することができる。
【００３１】
＜補正レジスタ４７０による補正＞
本実施の形態の演算装置１では、部分積加算部４５０から出力された加算結果は、Ａ（１）レジスタ５００とＢ（１）レジスタ５１０に格納された上位２ｒビットのデータを直接、部分積加算部４５０にフィードバックしている。このため、Ａ（１）レジスタ５００とＢ（１）レジスタ５１０にそれぞれ格納された上位ｒビットのデータを加算した後に部分積加算部４５０にフィードバックする場合と比べ、Ａ（１）レジスタ５００とＢ（１）レジスタ５１０にそれぞれ格納された上位ｒビットのデータを加算した後に部分積加算部４５０にフィードバックした場合にはｒ＋１ビット目の繰り上がりのデータは切り捨てられた状態で部分積加算部４５０にフィードバックされるのに対し、本実施の形態の場合にはＡ（１）レジスタ５００とＢ（１）レジスタ５１０にそれぞれ格納された上位ｒビットのデータを加算せずに、直接、部分積加算部４５０にフィードバックしているため、部分積加算部４５０による加算の結果には、上記ｒ＋１ビット目の繰り上がり、すなわち、切り捨てられるべき桁上りの値が含まれている場合が生じる。
【００３２】
これを補正するために部分積加算部４５０は、２ｒビットの部分積列とフィードバックされたキャリー１とキャリー２とを加算するとともに加算結果の正負を示す符号ビットとして２ｒ＋１ビット目を計算し、２ｒ＋１ビット目の値（桁上り）は補正レジスタ４７０に格納する。
補正レジスタ４７０に格納された２ｒ＋１ビット目の値は、部分積加算部４５０による上記加算の結果、桁上りがない場合は０になる。すなわち、切り捨て項（２値加算の桁上り）がキャリー１とキャリー２との加算結果に含まれる場合には２ｒ＋１ビット目は１になり、切り捨て項（２値加算の桁上り）がキャリー１とキャリー２との加算結果に含まれない場合には２ｒ＋１ビット目は０になる。
よって、補正レジスタ４７０に格納された桁上りによって部分積加算部４５０から出力される加算結果を補正することができる。したがって、補正レジスタ４７０に１が格納されている場合（桁上りあり）には、部分積加算部４５０による加算結果から１を減算して出力し、補正レジスタ４７０に０が格納されている場合（桁上りなし）には、部分積加算部４５０による加算結果を補正せずに出力する。
このように、部分積加算部４５０から出力される出力結果を補正することによって、従来、キャリー１とキャリー２とを２値加算した後に、部分積加算部４５０にフィードバックしていたのを、キャリー１とキャリー２の２値加算をせずに、直接、部分積加算部４５０にフィードバックし、部分積加算部４５０によって、直接、部分積列にキャリー１とキャリー２とを加算しても正確な演算結果を得ることができる。
よって、従来の２値加算器では、ｒビットのモンゴメリ演算結果Ｐを出力するための２値加算とともにｒビットのキャリー１とキャリー２との２値加算とを行っていたため、２ｒビットのビット列を処理する全加算器が必要であったが、本実施の形態の演算装置１では、キャリー１とキャリー２との２値加算は不要であり、ｒビットのビット列を処理する全加算器６００があれば演算が可能となる。
【００３３】
以上、積和演算部４０の出力が必ず正数になることを利用してＷＡＬＬＡＣＥＴＲＥＥや４−２ＣＯＭＰＲＥＳＳＯＲ等を用いた部分積加算部４５０において加算結果に補正処理を行う構成を持つモンゴメリ法による多倍長演算装置（演算装置１）について説明した。すなわち、部分積加算部４５０が行う加算処理の結果、発生した桁上りを保持する補正レジスタ４７０を備え、部分積加算部４５０は、上記レジスタ（第２のレジスタ５０）が保持した加算結果の一部（上記ｒビット×２）をフィードバックビットとして入力し、入力したフィードバックビットを部分積生成部４００が生成した複数の部分積列とともに加算器によって加算し、加算した結果を補正レジスタ４７０に保持されている桁上りに基づいて補正する演算装置１について説明した。
【００３４】
このように、本実施の形態の演算装置１の全加算器６００は従来の半分のビット長の処理を実行すればよいため、演算装置１は従来より小さい回路面積で構成できる。また、本実施の形態の演算装置１では、キャリー１とキャリー２とを加算せずにフィードバックすることが可能であるため、回路全体の遅延が従来のおよそ半分で済む。よって、従来のモンゴメリ演算装置に比べ高速な処理が可能となる。
【００３５】
＜積和演算部４０と圧縮部６０の処理の遅延＞
以上のようの構成された演算装置１では、積和演算部４０（部分積生成部４００と部分積加算部４５０）が１クロックごとに行う処理に費やす処理時間と圧縮部６０が１クロック毎に行う処理に費やす処理時間とがほぼ同時間で処理可能である。このように、積和演算部４０と圧縮部６０の処理の理論遅延がほぼ同等のため、演算装置１は部分積生成部４００と上記部分積加算部４５０とが１クロック毎に行う処理に費やす処理時間と圧縮部６０が１クロック毎に行う処理に費やす処理時間とを連動させることができる。したがって、積和演算部４０（部分積生成部４００と部分積加算部４５０）と圧縮部６０との処理時間の差による待ち時間が生じないため、積和演算部４０（部分積生成部４００と部分積加算部４５０）と圧縮部６０との間に第２のレジスタ５０を入れることで演算装置１は従来の約２倍の処理速度を得ることができる。
【００３６】
実施の形態２．
以下、実施の形態２について説明する。
実施の形態１は、レジスタの少ない環境において効果的な実装となっているが、ある特定のデバイス（ＦＰＧＡ等）においては論理回路部分（ロジック）と記憶部分（レジスタ）が１：１で使用できる場合がある。
図１２は、このような場合に効果を発揮する、本実施の形態のシステム構成図である。
本実施の形態では、部分積加算部４５０の内部に並列に配置した複数の２値加算器を複数列設ける。複数列に設けられた複数の２値加算器は、入力ビット列を加算して半数ビットからなるビット列として出力する加算処理をトーナメント方式に行うことで部分積生成部４００が生成した部分積を加算している。ただし、２値加算器によらず、４値加算器や８値加算器によってトーナメント方式に加算することもできる。
図１２に示すように、本実施の形態の演算装置１の部分積加算部４５０は、２値加算をトーナメント式に行い、２値加算毎にその出力をレジスタに格納する。例えば、上位レジスタ（０）５１から出力された任意のｎビットのデータは、２値加算器６１から２値加算器６２までｎ／２個の加算器によって加算され、ｎ／２個のデータに圧縮される。ｎ／２個のデータは上位レジスタ（１）５２に格納された後、２値加算器６３から２値加算器６４までｎ／４個の加算器によって加算され、ｎ／４個のデータに圧縮される。この動作を繰り返すことにより、所定のビット数にまで入力された部分積列が圧縮される。
【００３７】
このように、部分積加算部４５０は、複数の部分積列の加算処理を複数の２値加算でトーナメント方式に行い、その２値加算の出力をレジスタに格納して毎回、パイプライン化するが、部分積加算部４５０が部分積列の２値加算を行う際には、上位側と下位側を半数ビットに分けて各々パイプラインに処理する。
下位側の半数ビットを加算した結果生じた桁上りは桁上りレジスタ６２０に格納され、下位側から上位側へ桁上りを加算する処理は、上位側のパイプライン列数を１列増加して（２値加算器（桁上り加算部）６９＋上位レジスタ（ｆ＋１）４７）、桁上りレジスタ６２０に格納された桁上りと上位レジスタ（ｆ）５４に格納された上位側の加算結果とを２値加算器（桁上り加算部）６９によって加算することによって実行され、加算結果は上位レジスタ（ｆ＋１）４７に格納される。
【００３８】
２値加算器７０は、上位レジスタ（ｆ＋１）４７に格納されたビット列の上位ビットと、１クロック前のモンゴメリ乗算結果Ｐ１であるＰ１とを２値加算し、上位レジスタ（ｆ＋２）４９に格納するとともに、桁上りを桁上りレジスタ６３０に格納する。上位レジスタ（ｆ＋２）４９に格納されたデータは任意のタイミングにおいてモンゴメリ乗算結果Ｐ１として出力される。
また、２値加算器７１は、上位レジスタ（ｆ＋１）４７に格納されたビット列の下位ビットと、１クロック前の桁上りレジスタ６４０に格納されたビット列であるＰ３又は１クロック前の下位レジスタ（ｆ＋１）４８に格納されたデータであるＰ２とを２値加算し、下位レジスタ（ｆ＋１）４８に格納するとともに、桁上がりを桁上りレジスタ６４０に格納する。下位レジスタ（ｆ＋１）４８に格納されたＰ２及び桁上りレジスタ６４０に格納されたＰ３は任意のタイミングに出力される。
【００３９】
以上、複数ビットの被乗数Ｘと複数ビットの乗数Ｙとの演算を行う演算装置１であって、複数ビットの乗数Ｙを複数の部分に分割する分割部（ブース符号化部２０）と、被乗数Ｘに対して上記分割部（ブース符号化部２０）が分割した乗数Ｙの各部を各々乗算して、部分積列をビット列として複数生成する部分積生成部４００と、上記部分積生成部４００が生成した複数の部分積列の各ビット列を上位ビット列と下位ビット列とに分割し、分割した複数の上位ビット列と複数の下位ビット列とを複数段に配置された複数の加算器によって各々に分けて加算する部分積加算部４５０と、上記部分積加算部４５０が複数の下位ビット列を加算した結果、発生した桁上りを保持する桁上りレジスタ６２０と、上記桁上りレジスタ６２０が保持した桁上りを上記部分積加算部４５０が加算した複数の上位ビット列の加算結果に加算する２値加算器（桁上り加算部）６９とを備えた演算装置１について説明した。
【００４０】
また、上記部分積加算部４５０は、複数段に配置された複数の加算器が加算した加算結果を格納するレジスタ（上位レジスタ（０）５１〜上位レジスタ（ｆ）５４、下位レジスタ（０）５５〜下位レジスタ（ｆ）５８）を各段の加算器（２値加算器６１〜２値加算器６８）毎に備え、上記各段の加算器（２値加算器）と各段の加算器（２値加算器）毎に備えられたレジスタとによって上記分割した複数の上位ビット列の加算処理と複数の下位ビット列の加算処理とを別々にパイプライン処理する演算装置１について説明した。
【００４１】
このように、本実施の形態の演算装置１の部分積加算部４５０は、２値加算器による加算をパイプライン化している。
ここで、モンゴメリ乗算のアルゴリズムを演算する演算装置１をパイプライン化した場合には通常、処理効率を著しく低下させる待ち時間が発生してしまう。これは、前述したようにモンゴメリ乗算のアルゴリズムが、ステップ８で実行される式から算出さる中間値ｔ（ｔ：＝Ｐ［０］×ｎ’（ｍｏｄ  ２ｒ））の入力値Ｐ［０］は前のループにおける出力Ｐ［０］であり、中間値ｔはステップ１０で実行される積和演算ｃａｒｒｙ｜Ｐ［ｊ］：＝ｔ×ｎ［ｊ］＋Ｐ［ｊ−１］＋ｃａｒｒｙの入力値の一つとなっているからである。
したがって、待ち期間の発生を抑止しながらモンゴメリ乗算に必要な中間値ｔを計算するために、本実施の形態の演算装置１では、部分積加算部４５０と別の回路である中間値算出部８０を設け、ここで中間値ｔの演算を行うことにより、パイプライン化した部分積加算部４５０を用いて中間値ｔを計算することにより待ち時間が発生することを避けている。
中間値算出部８０は部分積加算部４５０の処理単位に依存して、回路構成を変更することができ、逐次乗算器やマルチサイクルパスを用いた乗算器、もしくは、部分積加算器４５０の代わりに２値加算を用いているため、中間値ｔを計算するために必要なデータが下位ビットから順次決定されることを利用してオンザフライ（ｏｎ  ｔｈｅ  ｆｌｙ）に乗算を行うことができる。
【００４２】
図１２に示す逐次型乗算の場合、下位レジスタ（ｆ）５８から出力された出力結果Ｐ１とｎ’とが中間値算出部８０に入力され、中間値算出部８０によって中間値ｔが部分積加算部４５０とは別回路で算出される。
逐次型乗算の場合、部分積加算部４５０によって下位のビット列が加算された結果出力される出力値ｎ’を中間値算出部８０に入力し、入力した出力値ｎ’に基づいて中間値ｔを算出する。
オンザフライの場合、下位レジスタ（ｆ）５８から出力された出力結果Ｐ１が中間値算出部８０に入力されるとともに、下位レジスタ（１）５６に格納された出力値ｎ’の最下位から０ビット目及び１ビット目（２１ビット数）を図１２の点線で示すように直接、中間値算出部８０に入力し、同様に、下位レジスタ（２）５７に格納された出力値ｎ’の最下位から２ビット目〜５ビット目（２２ビット）を図１２の点線で示すように直接、中間値算出部８０に入力する、という動作を繰り返すことによって、出力値ｎ’を部分的に中間値算出部８０に入力し、入力した出力値ｎ’の一部に対応する部分の中間値ｔを入力される度に算出することを繰り返すことによって、最終的に出力値ｎ’のすべてに対応する中間値ｔを算出する方法である。すなわち、中間値算出部８０は、部分積加算部４５０に配置されたｆ段目（ｆ＞０、ｆは整数）のレジスタに格納されたビット列の一部を出力値ｎ’の一部として入力し、入力した出力値ｎ’の一部に基づいて中間値ｔの一部を算出する。
【００４３】
図１３は、本実施の形態の他のシステム構成図として、マルチサイクルパスによって中間値ｔを算出する場合を示す。
マルチサイクルパスの場合、中間値算出部８０は、部分積加算部４５０によって下位のビット列が加算された結果、出力された出力値ｎ’を複数クロックに一度の割合で取得し、取得した出力値ｎ’に基づいて中間値ｔを算出する。
この演算装置１の中間値算出部８０に入力されるデータは、演算装置１に入力される乗数Ｙと被乗数Ｘを入力し、さらに、あらかじめ計算したｎ’（＝−ｎ−１（ｍｏｄＲ））を入力する。中間値算出部８０は、下位のビットが決定するまで待ち、それからマルチサイクルパスを用いて、例えば３クロック（２値加算を３回処理）に１回の割合でｎ’及び出力結果Ｐを入力する。ただし、マルチサイクルパスでは、上記入力データの入力を必ずしも３クロックに１回の割合に限ることはなく、複数回（予め定められた回数）に１回の割合で上記入力データを入力すればよい。
【００４４】
以上、本実施の形態の演算装置１では、オンザフライ方式で演算するのではなく、下位のビットが決定するまで待ち、それから逐次型乗算方式に中間値算出部８０を用いてモンゴメリ法で必要な中間値ｔを演算する回路である中間値算出部８０を持つ多倍長演算装置（演算装置１）について説明した。
【００４５】
さらに、本実施の形態の演算装置１では、オンザフライ方式や逐次型乗算方式で演算するのではなく、下位半分のビットが決定するまで待ち、それからマルチサイクルパスを用いてモンゴメリ法で必要な中間値ｔを演算する回路である中間値算出部８０を持つ多倍長演算装置（演算装置１）について説明した。
【００４６】
このように、本実施の形態の演算装置１は、部分積加算部４５０が処理する２値加算でパイプライン化が図られているため、ｎ’は下位ビットから順番に、パイプラインを１列経るごとに２ｎビット（ｎ＝１，２，３・・・）ずつ決定される。これを利用してモンゴメリ法で必要な中間値ｔをパイプライン化している部分積加算部４５０とは別の回路である中間値算出部８０でオンザフライ方式に並列に演算する回路を持つモンゴメリ法による多倍長演算装置（演算装置１）について説明した。
【００４７】
上記逐次型乗算方式によって中間値ｔを算出する場合には、オンザフライ方式やマルチサイクルパス方式と比較して、回路面積を小さくできるという利点がある。ただし、入力値が大きい場合にはパイプライン列数が増加するために、オンザフライ方式やマルチサイクルパス方式と比較して、中間値ｔの算出までに時間がかかる。よって、入力値が大きい場合にはオンザフライ方式やマルチサイクルパス方式を用いて中間値ｔを算出するほうが望ましい。
【００４８】
以上、すべての実施の形態で開示した発明は、ＡＳＩＣ（ＡＰＰＬＩＣＡＴＩＯＮ  ＳＰＥＣＩＦＩＣ  ＩＮＴＥＧＲＡＴＥＤ  ＣＩＲＣＵＩＴ）やＦＰＧＡ（ＦＩＬＥＤ  ＰＲＯＧＲＡＭＭＡＢＬＥ  ＧＡＴＥ  ＡＲＲＡＹ）等の回路によって実装が可能である。
特に、実施の形態１に係る演算装置１は、チップ単価が低額なＡＳＩＣによって実装することによって積和演算の高速処理が可能になる。
また、実施の形態２に係る演算装置１は、設計の初期コストが安価であり、また、回路の変更に対して柔軟に対応できるとともに２値加算が高速に処理できるＦＰＧＡによって実装することによって、より高速なモンゴメリ乗算が可能となる。
また、すべての実施の形態で開示した発明は、公開鍵暗号系のアルゴリズムで多用されている、剰余演算、乗算剰余演算等を実行する上で適している。特に、Ｐ．Ｌ．Ｍｏｎｔｇｏｍｅｒｙが提案したアルゴリズムであるモンゴメリ法（Ｐ．Ｌ．Ｍｏｎｔｇｏｍｅｒｙ、“Ｍｏｄｕｌａｒ  Ｍｕｌｔｉｐｌｉｃａｔｉｏｎ  ｗｉｔｈｏｕｔ  Ｔｒｉａｌ  Ｄｉｖｉｓｉｏｎ”、Ｍａｔｈｅｍａｔｉｃｓ  ｏｆ  Ｃｏｍｐｕｔａｔｉｏｎ、Ｖｏｌ．４４、Ｎｏ．１７０、ｐｐ．５１９−５２１、Ａｐｒｉｌ、１９８５）をハードウエアで高速に実行できる。
【００４９】
【発明の効果】
この発明の演算装置によれば、剰余演算、乗算剰余演算等を高速に実行することができる。
【図面の簡単な説明】
【図１】実施の形態１に係る演算装置１の全体構成図。
【図２】ブース符号化部２０が行う乗数Ｙのブース符号化を示す図。
【図３】部分積生成部４００が生成する部分積の一例を示す図。
【図４】部分積加算部４５０が行うデータの最適化方法を示す図。
【図５】部分積加算部４５０が動作を示す図。
【図６】部分積加算部４５０に入力されるデータを示す図。
【図７】部分積加算部４５０３列ずつに処理を行うことを示す図。
【図８】部分積加算部４５０が行う符号ビットのパディングを示す図。
【図９】部分積加算部４５０が行う符号拡張を示す図。
【図１０】部分積加算部４５０による定数項の計算と符号拡張終了後の部分積を示す図。
【図１１】部分積加算部４５０が行う圧縮動作を示す図。
【図１２】実施の形態２に係る演算装置１の全体構成図。
【図１３】実施の形態２に係る演算装置１の他の全体構成図。
【符号の説明】
１  演算装置、１０  セレクタ、１１  セレクタ、２０  ブース符号化部、３０  第１のレジスタ、４０  積和演算部、４７  上位レジスタ（ｆ＋１）、４８下位レジスタ（ｆ＋１）、４９  上位レジスタ（ｆ＋２）、５０  第２のレジスタ、５１  上位レジスタ（０）、５２  上位レジスタ（１）、５３  上位レジスタ（２）、５４  上位レジスタ（ｆ）、５５  下位レジスタ（０）、５６  下位レジスタ（１）、５７  下位レジスタ（２）、５８  下位レジスタ（ｆ）、６０  圧縮部、６１，６２，６３，６４，６５，６６，６７，６８，７０，７１  ２値加算器、６９  ２値加算器（桁上り加算部）、８０  中間値算出部、４００部分積生成部、４５０  部分積加算部、４５１  メモリ、４７０  補正レジスタ、５００  Ａ（１）レジスタ、５１０  Ｂ（１）レジスタ、５５０  Ａ（２）レジスタ、５６０  Ｂ（２）レジスタ、６００  全加算器、６１０，６２０，６３０，６４０  桁上りレジスタ、６５０  ２値加算器、６６０  桁上りレジスタ。
【図１】
2004227248.tif 000005
【図２】
2004227248.tif 000006
【図３】
2004227248.tif 000007
【図４】
2004227248.tif 000008
【図５】
2004227248.tif 000009
【図６】
2004227248.tif 000010
【図７】
2004227248.tif 000011
【図８】
2004227248.tif 000012
【図９】
2004227248.tif 000013
【図１０】
2004227248.tif 000014
【図１１】
2004227248.tif 000015
【図１２】
2004227248.tif 000016
【図１３】
2004227248.tif 000017