(57)【要約】  ２つの長整数［long integer］を乗算する加算器回路は、長整数を構成する一連のワードを合計して中間結果を生成する加算器のネットワークを配備する。加数［addends］の数はビット位置の関数として変化し、加算器のネットワークは想定される加数の最大数に従ってネットワーク内の加算器のレベル数を削減するように設計されている。戦略的に配置された複数の追加の加算器は、ネットワーク内に位置付けられてレベルの数をさらに削減してもよい。ネットワークの和出力とキャリー出力［sum and carry outputs］を加算し、最上位ビットをネットワークの後続の計算出力に利用できるように保持する出力段が提供されてもよい。ネットワークは、ネットワークによる後続の計算が前の計算が完了する前に開始でき、前の計算の出力が最上位レベル（入力）と最下位レベル（出力）との間の中間レベルでネットワークにフィードバックされるように構成されてもよい。
2007500388.tif 000002
【特許請求の範囲】
【請求項１】
マルチビット・ワードから複数の加数の和を求める加算器回路であって、
それぞれ第１の数の和出力と第２の数のキャリー出力を備えるｎ個の入力を伴うキャリー・セーブ加算器回路のネットワークと、
各列が前記和の中のあらかじめ指定されたビット位置に対応する複数の列に編成され、複数レベルに編成される加算器回路と、
前記複数のワードから選択されたワードの対応するビット位置から複数の加数を受け取る第１のレベルと、
それぞれが（i）前記複数のワードから選択された他のワードの対応するビット位置、（ii）同じ列の上位レベルの加算器回路からの和出力、および（iii）下位のビット位置に対応する列の上位レベルの加算器回路からのキャリー出力の１つまたは複数から加数を受け取る下位のレベルを備えており、
前記各列のｎ個の入力を伴う加算器の数は前記ビット位置により変わる加算器回路。
【請求項２】
前記各列内のｎ個の入力を伴う加算器の数は、前記列に必要な加数の数に特に適応する請求項１に記載の回路。
【請求項３】
前記第１のレベルの各ビット位置における前記ｎ個の入力を伴う加算器の数は、前記加数の数をｎで割った整数部を超えない請求項１に記載の回路。
【請求項４】
前記下位レベルの各ビット位置における前記ｎ個の入力を伴う加算器の数は、
（ａ）上位レベルの同じ列にある前記ｎ個の入力を伴う加算器の前記和出力の数と（ｂ）上位レベルの同じ列からの前記接続されていない入力の数と（ｃ）上位レベルの下位ビット位置に対応する列からの前記キャリー出力の数を合計し、前記合計をｎで割った整数部を超えない請求項１または請求項４に記載の回路。
【請求項５】
前記接続されていない入力の数は、前記すぐ上のレベルの数である請求項４に記載の回路。
【請求項６】
前記和出力の数は、前記すぐ上のレベルの数である請求項４に記載の回路。
【請求項７】
前記キャリー出力の数は、前記すぐ上のレベルの数である請求項４に記載の回路。
【請求項８】
ｎは３であり、前記第１の和出力の数は２であり、前記第２のキャリー出力の数は２である請求項１に記載の回路。
【請求項９】
前記ビット位置あたりの加数の数はビット位置の関数として変化するように、前記複数のマルチビット・ワードの各１つを前記ｎ個の入力を伴う加算器のネットワークに送出する手段をさらに含む請求項１に記載の回路。
【請求項１０】
前記ネットワーク内の選択された位置に配置された１つまたは複数の（ｎ−１）個の入力を伴う加算器をさらに含む請求項１または請求項４に記載の回路。
【請求項１１】
前記選択された位置は、前記複数の加数を合計するのに必要な前記レベルの数を削減するように決定される請求項１０に記載の回路。
【請求項１２】
前記ｎ個の入力を伴う加算器は３つの入力を伴う加算器であり、前記（ｎ−１）個の入力を伴う加算器は２つの入力を伴う加算器であり、各選択された位置は特定されたビット位置と前記出力の数が２より大きいレベルによって決定され、前記選択された位置は前記特定された位置より上のレベルで前記同じビット位置である請求項１１に記載の回路。
【請求項１３】
複数の加数を受け取る入力と、
複数の加数を合計して上位部分と第１および第２の下位部分とを備える出力を生成する第１の合計手段と、
前記入力で前記第１の上位部分を下位の位置に接続して後続の計算に備える第１のフィードバック・ラインと、
前記第１および第２の下位部分を合計して第１のワード出力を提供する第２の合計手段と、前記第２の合計手段からのキャリー・ビットを保持し、前記キャリー・ビットを後続の計算時に前記第２の合計手段への入力として提供するフィードバック・レジスタを含む出力段とを備える加算器回路。
【請求項１４】
前記上位部分は後続の計算にフィードバックされた和項とキャリー項を備える請求項１３に記載の加算器回路。
【請求項１５】
前記キャリー・ビットは前記第１の合計手段による前記第１および第２の下位部分の後続の計算の終わりに使用される請求項１３に記載の加算器回路。
【請求項１６】
マルチビット・ワードから複数の加数を合計する加算器回路であって、
前記第１の合計手段は、それぞれが複数の入力と、複数の和出力と、複数のキャリー出力を備えるキャリー・セーブ加算器回路のネットワークを備えており、
前記加算器回路は複数の列に編成されており、各列は前記和の中のあらかじめ指定されたビット位置に対応し、複数のレベルに編成されており、
前記第１のレベルは前記複数のワードから選択されたワードの対応するビット位置から複数の加数を受け取るために接続されており、
前記下位レベルは（i）前記複数のワードから選択された他のワードの対応するビット位置、（ii）前記同じ列の上位レベルの加算器回路からの和出力、および（iii）下位のビット位置に対応する列の上位レベルの加算器回路からのキャリー出力の１つまたは複数から加数を受け取るために接続されており、
前記第１のフィードバック・ラインは前記最下位レベルの加算器回路の第１の複数の上位ビット出力を、前記第１の上位部分と同様に、前記下位の位置の前記第１のレベルの加算器回路の対応する数の下位ビット入力に接続する請求項１３に記載の加算器回路。
【請求項１７】
前記上位部分は上位のキャリー項出力と上位の和項出力とを備えており、前記第１の下位部分は下位のキャリー項出力を備えており、前記第２の下位部分は下位の和項出力を備えている請求項１３または請求項１５に記載の加算器回路。
【請求項１８】
マルチビット・ワードから複数の加数を合計するパイプライン型加算器回路であって、
キャリー・セーブ加算器回路のネットワークを備えており、前記加算器回路は複数の列に編成され、各列は前記和の中のあらかじめ指定されたビット位置に対応し、複数レベルに編成され、前記第１のレベルは前記複数のワードから選択されたワードの対応するビット位置から複数の加数を受け取るために接続されており、前記下位レベルは（i）前記複数のワードから選択された他のワードの対応するビット位置、（ii）前記同じ列の上位レベルの加算器回路からの和出力、および（iii）下位のビット位置に対応する列の上位レベルの加算器回路からのキャリー出力の１つまたは複数から加数を受け取るために接続される第１の合計手段と、
最下位レベルの加算器回路の第１の複数の上位ビット出力を加算器回路の後続の計算に使用する中間レベルの対応する数の下位ビット入力に接続し、前記中間レベルは前記第１のレベルの加算器回路と前記最下位レベルの加算器回路との間にある第１のフィードバック・ラインとを備えるパイプライン型の加算器回路。
【請求項１９】
それぞれ前記最下位レベルの加算器回路の第２と第３の複数の下位ビット出力を備える第１および第２の下位部分を合計して第１のワード出力を提供する第２の合計手段と、前記第２の合計手段からのキャリー・ビットを保持し、前記キャリー・ビットを後続の計算時に前記第２の合計手段への入力として提供するフィードバック・レジスタを含む出力段をさらに含む請求項１８に記載のパイプライン型の加算器回路。
【請求項２０】
実質的に、添付の図５から図１１に関連して請求項１から１９に記載した装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、２つの長整数の乗算と、第３の長整数をモジュロ（modulo―法とする―）する第３の長整数の加算とを行なう方法および装置に関する。こうした乗算は、たとえば、スマート・カードで使用されるものなどの暗号化プロセッサにおける暗号化アルゴリズムの実施中に繰り返し実行される必要がある。
【背景技術】
【０００２】
電子デバイスにおける暗号化アルゴリズムの利用を拡大することは、長整数の剰余乗算［modular multiplications］を迅速かつ効果的に実行することの必要性を定着させてきている。たとえば、スマート・カードや他の多くの電子デバイスはＲＳＡやその他の楕円曲線や超楕円の計算に基づく複数の暗号化プロトコルを使用している。こうしたプロトコルは、すべて基本的な要件として「Ｒ＝Ｘ・Ｙ＋Ｚ  ｍｏｄ  Ｎ」の形式の長整数の剰余乗算を行なう機能を備えている（ただし、Ｚの加算は常に必要なわけではない）。
【０００３】
概して、ＲＳＡなどのプロトコルでは、長整数ＸとＹが１０２４ビットまたは２０４８ビットの整数であり、暗号化または復号化の演算を完了するためには、何百回、あるいは何千回もの乗算演算を実行する必要がある。したがって、こうした演算を実行する暗号化デバイスは、長整数の乗算を迅速に実行するのが望ましい。
【０００４】
こうした長整数の乗算を実行するという態様は、長整数を複数のワードに分割し、最終結果を得るために累積される一連の中間結果を生成する反復処理の中で連続的にワードをかけ合わせる操作である。この技術の特徴は、乗算過程の各段階でさまざまな長さの非常に多くの加数を合計する必要があることである。したがって、指定された任意のビット位置ごとに加数の数が大幅に変わる可能性がある。従来、こうした合計の演算は、ウォーレス・ツリー［Wallace tree］を使用して実施されているが、望まれるよりやや多くのハードウェアを利用し、やや長い遅延が発生する場合が少なくない。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
効果的な長整数の乗算演算をできるだけ迅速に実行する方法および装置を提供することは、本発明の目的である。
【０００６】
非常に多くの加数の和を求める（特に加数のビット数は和のビット位置の関数として変化する場合）より効率的な方法および装置を提供することは、本発明の目的である。
【０００７】
１つの編成において、２つの長整数の乗算を行う加算器回路は、長整数を構成する一連のワードを合計して中間結果を生成する加算器のネットワークを配備する。加数の数はビット位置の関数として変化し、加算器のネットワークは想定される加数の最大数に従ってネットワーク内の加算器のレベル数を削減するように設計されている。１つの目的は、ビット位置の関数として変化する複数の加算器を含むようにネットワークを適応させることである。
【０００８】
別の編成では、中間結果を表すネットワークの和出力とキャリー出力とを加算する出力段が提供されてもよい。１つの目的は、最上位（キャリー）ビットをネットワークの後続の計算出力に利用できるように保持することによって、この出力段からネットワークにキャリー・ビットを返すときの遅延を防止することである。
【０００９】
別の編成において、１つの目的は、ネットワークが前の計算を完了する前に新しい加数セットによる後続の計算を開始できるようにすることである。加算器のネットワークは、前の計算の出力が最上位レベル（入力）と最下位レベル（出力）との中間のレベルでネットワークにフィードバックされるように構成されてもよい。
【課題を解決するための手段】
【００１０】
１つの態様により、本発明はマルチビット・ワードから複数の加数を合計する加算器回路であって、
それぞれ第１の数の和出力と第２の数のキャリー出力を備えるｎ個の入力を伴うキャリー・セーブ加算器回路のネットワークと、
各列が前記和の中のあらかじめ指定されたビット位置に対応する複数の列に編成され、複数レベルに編成された加算器回路と、
前記複数のワードから選択されたワードの対応するビット位置から複数の加数を受け取る第１のレベルと、
それぞれが（i）前記複数のワードから選択された他のワードの対応するビット位置、（ii）前記同じ列の上位レベルの加算器回路からの和出力、および（iii）下位のビット位置に対応する列の上位レベルの加算器回路からのキャリー出力の１つまたは複数から加数を受け取る下位のレベルを備えており、
各列内の前記ｎ個の入力を伴う加算器の数はビット位置によって変わる加算器回路を提供する。
【００１１】
別の態様により、本発明は
複数の加数を受け取る入力と、
複数の加数を合計して上位部分と第１および第２の下位部分を備える出力を生成する第１の合計手段と、
前記入力で前記第１の上位部分を後続の計算に使用する前記入力の下位の位置に接続する第１のフィードバック・ラインと、
前記第１および第２の下位部分を合計して第１のワード出力を提供する第２の合計手段と、前記第２の合計手段からのキャリー・ビットを保持し、前記キャリー・ビットを後続の計算時に前記第２の合計手段への入力として提供するフィードバック・レジスタを含む出力段とを備える加算器回路を提供する。
【００１２】
別の態様により、本発明はマルチビット・ワードから複数の加数を合計するパイプライン型の加算器回路であって、
キャリー・セーブ加算器回路のネットワークを備えており、前記加算器回路は複数の列に編成され、各列は和の中のあらかじめ指定されたビット位置に対応し、複数レベルに編成され、第１のレベルは複数のワードから選択されたワードの対応するビット位置から複数の加数を受け取るために接続されており、下位のレベルは（i）前記複数のワードから選択された他のワードの対応するビット位置、（ii）同じ列の上位レベルの加算器回路からの和出力、および、（iii）下位のビット位置に対応する列の上位レベルの加算器回路からのキャリー出力の１つまたは複数から加数を受け取るために接続される第１の合計手段と、
最下位レベルの加算器回路の第１の複数の上位ビット出力を加算器回路の後続の計算に使用する中間レベルの対応する数の下位ビット入力に接続し、前記中間レベルは前記第１のレベルの加算器回路と最下位レベルの加算器回路との間にある、第１のフィードバック・ラインとを備える加算器回路を提供する。
【００１３】
ここで、例として添付の図面に関連づけながら本発明の実施態様について記述する。
【発明を実施するための最良の形態】
【００１４】
積「Ｘ・Ｙ＋Ｚ  ｍｏｄ  Ｎ」を計算するために（ただし、Ｘ、ＹおよびＺは、たとえば１０２４または２０４８のビット長のオーダーの長整数型変数）、長整数型変数Ｘ、ＹおよびＺは、たとえば３２ビットまたは６４ビット長のより小さな「ワード」に分割される。
【００１５】
まず次に示すように、ＸとＺは一般的にそれぞれ長さｋのｎ個のワードに分割される。
Ｘ＝ｘｎ−１Ｂｘｎ−１＋ｘｎ−２Ｂｘｎ−２＋…＋ｘ０および
Ｚ＝ｚｎ−１Ｂｘｎ−１＋ｚｎ−２Ｂｘｎ−２＋…＋ｚ０
【００１６】
ただし、ＢＸ＝２ｋである。１つの例では、ｋ＝３２であり、別の例ではｋ＝６４である。このように、ＸとＺは、それぞれｋビット長の複数のワードに分割される。
【００１７】
次に、結果Ｒは次のように計算できる。
【数１】
2007500388.tif 000003
【００１８】
したがって、Ｒｊ＝（ｘｎ−ｊ−１Ｙ＋ｚｎ−ｊ−１＋Ｒｊ−１Ｂｘ）  ｍｏｄ  Ｎとなる。
【００１９】
まず、ｘｎ−１にＹ全体をかけ、ｚｎ−１を加え、Ｎを法とする還元を計算する。この結果はＲ０である。
【００２０】
次に、ｘｎ−２にＹ全体をかけ、その結果にｚｎ−２とＲ０．Ｂｘを加え、Ｎを法とする還元を計算する。この結果はＲ１である。
【００２１】
次に、ｘｎ−３にＹ全体をかけ、その結果にｚｎ−３とＲ１．Ｂｘを加え、Ｎを法とする還元を計算する。この結果はＲ２である。
【００２２】
Ｘを構成するすべてのワードを使用して、最後のワードであるｘ０を処理するまでこの手順を繰り返し、最終的な結果、Ｒ＝Ｒｎ−１を得る。
【００２３】
しかし、１０２４ビット長のＹという乗数は、実際的な観点からは好ましくない。したがって、Ｙ、さらにＲｊもたとえば３２ビット長または１６ビット長のより小さな「ワード」に分割する。
【００２４】
よって、基本的な乗算であるＲｊ＝（ｘｎ−ｊ−１Ｙ＋ｚｎ−ｊ−１＋Ｒｊ−１Ｂｘ）  ｍｏｄ  Ｎも分割される。
【００２５】
ＹとＲ１をｍビット長のｐ個のワードに分割し、たとえばＢｙ＝２ｍとする。
Ｙ＝ｙｐ−１Ｂｙｐ−１＋ｙｐ−２Ｂｙｐ−２＋…＋ｙ０
Ｒｊ＝ｒｊ，ｎ−１Ｂｙｐ−１＋ｒｊ，ｐ−２Ｂｙｐ−２＋…＋ｒｊ，０
【００２６】
簡単にするために、まずＸとＹの長さが同じであり、ＸとＹのワードのサイズが同じ、つまりｐ＝ｎおよびｍ＝ｋと仮定する。後で、そうでない場合に変更を必要とする部分を示す。
【００２７】
このように、ＸおよびＹはそれぞれ長さｋビットのｎ個のワードに分割される。これで次の式が得られる。
【数２】
2007500388.tif 000004
【００２８】
Ｒｊを計算するには、次の演算を実行する。
まず、ｘｎ−ｊ−１にｙ０をかけ、ｒｊ−１，−１＝ｚｎ−ｊ−１を加え、その結果を２つの等しい部分、すなわち下位部分ｒｊ，０（ｍビット）と上位部分ｃｊ，０（ｋビット）に分割し、Ｂ．ｃｊ，０＋ｒｊ，０＝ｘｎ−ｊ−１．ｙ０＋ｒｊ−１，−１．ｒｊ，０が結果の一部として保存される。
【００２９】
次に、ｘｎ−ｊ−１にｙ１をかけ、直前のキャリー・ワード（ｃａｒｒｙ  ｗｏｒｄ）ｃｊ，０を加える。さらに、ｚ０＝ｒｊ−ｉ，０も加える。この結果は２つの等しい部分、すなわち下位部分ｒｊ，１、と上位部分ｃｊ，１に再度分割され、Ｂ．ｃｊ，１＋ｒｊ，１＝ｘｎ−ｊ−１．ｙ１＋ｃｊ，０＋ｒｊ−１，０ｒｊ，１が結果の一部として保存される。
【００３０】
次に、Ｘｎ−ｊ−１にｙ２をかけ、これに直前のキャリー・ワードｃｊ，１を加える。さらに、ｚ１＝ｒｊ−１，１も加える。この結果は２つの等しい部分、すなわち下位部分ｒｊ，２と上位部分ｃｊ，２に再度分割され、Ｂ．ｃｊ，２＋ｒｊ，２＝ｘｎ−ｊ−１．ｙ２＋ｃｊ，１＋ｒｊ−１，１．ｒｊ，２が結果の一部として保存される。
【００３１】
この手順は、ｙｎ−１による最後の乗算（すなわちｘｎ−ｊ−１にｙｎ−１をかける）を実行し、直前のキャリー・ワードｃｊ，ｎ−２を加えるまで繰り返される。さらに、ｚｎ−２＝ｒｊ−１，ｎ−２も加える。この結果はそれぞれｋビット長とｍビット長の２つの部分、すなわち下位部分ｒｊ，ｎ−１、上位部分ｃｊ，ｎ−１に再度分割され、Ｂｙ．ｃｊ，ｎ−１＋ｒｊ，ｎ−１＝ｘｎ−ｊ−１．ｙｎ−１＋ｃｊ，ｎ−２＋ｒｊ−１，ｎ−２．ｒｊ，ｎ−１が結果の一部として保存される。
【００３２】
最後のステップは、ｃｊ，ｎ−１とｚｎ−１の加算であり、ｒｊ，ｎ＝ｃｊ，ｎ−１＋ｒｊ−１，ｎ−１．ｒｊ，ｎが結果の一部として保存される。
【００３３】
これでＲｊは完了して、変数Ｙより大きく、Ｒｊは変数ＹからＸの１つのワード長によって導かれたものである。Ｒｊのサイズは好ましくはＮを法とする還元で１つのワードだけ縮小され、縮小された結果はその後後続のＲｊ＋１を計算するときにＲｊとして使用される。
【００３４】
上記の計算は、Ｘのワードの長さ（ｋ）がＹのワードの長さ（ｍ）と等しい場合、すなわちＢｘ＝Ｂｙのときの一般的な手順を説明している。
【００３５】
ＸのワードはＹワードのと長さが異なってもよい。たとえば、ｋ／ｍ＞１の場合、ｋ＝６４およびｍ＝１６であり、したがってＢｘ＝Ｂｙ４の場合は次のようになる。
１．  ｚの加算は、最初のｋ／ｍ（この例では４）の乗算の間に行われ、Ｒｊの加算はその後で開始される。
２．  キャリー・ワードｃｊ，ｉは、結果ｒｊ，ｉ（長さｍビット）のｋ／ｍ（＝４）倍（長さ４ｍビット）である。
３．  最後のステップは、キャリー・ワードとＲｊの残りの部分（いずれも４ｍビット幅）の加算で構成される。この加算は、ｋ／ｍステップでｙ＝０を選択することにより同じ乗数により行われる可能性があり、ここでは、各ステップでｍビットのワードが加算される。
【００３６】
したがって、基本的な演算で、すべてのインデックスを省略すると次のようになる。
Ｂ・ｃ＋ｒ＝ｘ・ｙ＋ｃ＋ｚ
【００３７】
最初の演算の間は、ｃ＝０であり、ｚはＺを構成するｋ／ｍ個のワードにｒのすべてのワードが続いたもので構成される。最後のｋ／ｍ演算の間は、ｙ＝０であり、ｘは各Ｒｊに関する一連の演算全体に対して一定に保持される。
【００３８】
ｘとｙの乗算を実行するのと同じ乗算器は、Ｎを法とする還元に使用できる。Ｘを構成するワード、すなわちｘによる一連の乗算をすべて実行すると、結果Ｒｊは１つのｋビット・ワードだけ拡張される。次にＲｊは、次のＲｊを計算する前に元の長さに戻すため、Ｎを法とする還元によってｋビットだけ縮小される必要がある。
【００３９】
法とする還元には（たとえば、クイスクォータ［Quisquater］、バレット［Barret］、モンゴメリ［Montgomery］など）いくつかのアルゴリズムがあるが、これらはすべて次の形式の乗算を使用する。
Ｒｊ＝Ｘｒｅｄ・Ｎ＋Ｒｊ
【００４０】
ただし、Ｘｒｅｄ（サイズはｋビット）はモジュロＮにかけて結果に加えられる。あるいは、Ｎの代わりに２の補数Ｎ’を使用してＸｒｅｄから減算する。この方法は、係数Ｘｒｅｄが計算される方法が異なる。モンゴメリ［Montgomery］の還元の場合は、その結果はＢｘでも割る必要がある。すなわち、すべてが０になる最初のワードが除外される。
【００４１】
同じ基本演算を次の縮小にも使用できる。
Ｂ・ｃ＋ｒ＝ｘ・ｙ＋ｃ＋ｚ
【００４２】
ただし、Ｂ＝Ｂｙ、ｒ＝ｒｊ，ｉ、ｘ＝Ｘｒｅｄ、ｙ＝Ｎｉ、およびｚ＝ｒｊ，ｉ
上記の乗算演算は、実現可能である多くの乗算器で実行できる。しかし、アレイ乗算器［array multiplier］は、こうした乗算器を実施する慣例的な方法である。図１に例を示す。
【００４３】
例示的なアレイ乗算器１０は６４×１６ビットの乗算器であるが、他のビット構成を使用することもできる。アレイ乗算器１０は、式Ｒｊの各項をＢ．ｃ＋ｒ＝ｘ．ｙ＋ｃ＋ｚの形で計算する。ｘとｃは６４ビット幅であり、ｙ、ｚ、およびｒは１６ビット幅である。ｃは入力と出力の両方として、実際には２つの項、ＣｃおよびＣｓで構成される。
【００４４】
アレイ乗算器の基本要素１２を図１に示す。それには、入力ｘおよびｙを受け取っている乗算器１３、および積の項ｘ・ｙ、キャリーと和入力ｃｊおよびｓｊを受け取り、キャリーと和出力ｃ０およびｓ０を生成する加算器１４が含まれている。
【００４５】
アレイ乗算器１０は１７の「レイヤ」または「レベル」、「ａｄｄ１」、「ａｄｄ２」…「ａｄｄ１７」から構成される。最初の１６のレイヤａｄｄ１…ａｄｄ１６は、乗算と加算を実行する。最後のレイヤであるａｄｄ１７と各レイヤの一番右側の要素は、加算のみを行う。出力は１６ビットｒ（１５：０）、６３ビットのキャリー項［carry term］Ｃｃ’（７９：１６）、６３ビットの和項［sum term］Ｃｓ’（７９：１６）である。キャリー項Ｃｃ’と和項Ｃｓ’の和は、次の計算のキャリー項である。
Ｂ・ｃ＋ｒ＝ｘ．ｙ＋ｃ＋ｚ
【００４６】
実際に、この項が計算されることはない。代わりに、次の計算が行われる。
Ｂ・（ｃ’＋ｓ’）＋ｒ＝ｘ．ｙ＋ｃ’＋ｓ’＋ｚ
【００４７】
アレイ乗算器１０の基本要素１２は、ビット計算（ｃ０，ｓ０）＝ｙ＊ｘ＋ｃｊ＋ｓｊを行う。最初のレイヤを除く各レイヤで、一番右側の加算器によってｚの加算が行われる。１７番目のレイヤは、ｒ（１５）の加算に必要な加算器のみで構成されている。このアレイ乗算器の実施を使用する問題点は動作速度が低下することであり、これはロジックのレイヤ１７で遅延が累積する結果である。
【００４８】
したがって、パイプライン型乗算器を使用すると、処理のさまざまな段階が重複でき、計算時間を短縮できるので有利である。図２を参照すると、乗算処理中に必要なさまざまな加数の概略が示されている。６４×１６ビットの乗算の場合には、このプロセスで、（i）  １６個の積項Ｐ０、Ｐ１，…，Ｐ１５、ただしＰｊＸ（６３：０）＊Ｙ（ｊ）、（ii）１６ビットＺ項Ｚ（１５：０）、（iii）６３ビット・キャリー項Ｃｃ（６２：０）、および（iv）６３ビット和項Ｃｓ（６２：０）の加算が必要である。
【００４９】
結果のＲｊ（１５：０）は出力であり、中間項Ｃｃ’（７８：１６）、Ｃｓ’（７８：１６）は次の項Ｒｊ＋１の計算で使用される。
【００５０】
図３は、ビット位置ごとの加数の数を示している。ビット位置０からビット位置１５まで、加数の数は、さらに多くのＰ項が含まれるので、４から１９まで直線的に増加する。その後ビット１６で、ｚビットがなくなるため、１つ減少する。キャリー項と和項ＣｃとＣｓが脱落している場合に、加数の数はビット６２まで一定の１８のままである。したがって、加数の数はビット位置６３で２つ減って１６になる。最後に、ビット位置６３からビット位置７８まで、より高い各Ｐ項が続いて脱落するので、加数の数は１６から１まで直線的に減少する。
【００５１】
ウォーレス・ツリーは、最適化されたレベル数を使用して、多数の加数のための加算演算の性能に対するキャリー・セーブ加算器の配列を構成する従来の方法である。図４は、こうしたウォーレス・ツリー４０の断片を示している。
【００５２】
各加算器は３つの入力を加算し、キャリーと和の２つの出力を提供する。ウォーレス・ツリーは、ビット位置ごとの加数の数は一定であると仮定しており、図４は、図３で示した必要な加算を実施するのに適したツリー４０の構成を示している。この場合、加数はビット位置１５での最大１９個に達するので、ツリーはビット位置ごとに１９個の加数で構成されている。
【００５３】
この図で「レイヤ１」として示されている第１のレベルでは、たとえば、ビット位置ｊで示されているように各ビット位置に対して６つのキャリー・セーブ加算器４１がある。これら６つのキャリー・セーブ加算器は、合計１８個の入力４２、６つの和出力４３および６つのキャリー出力４４を提供する。さらに、１つの追加入力４５があり、これはレベル３（「レイヤ３」）に追加される。これは、必要な合計１９個の入力を提供する。
【００５４】
６つの和の出力４３は、キャリー・セーブ加算器４６によって次のレベル２で加算される。
【００５５】
６つのキャリー出力４４は、ツリーの次のレベル２に追加されるが、ｊ＋１と示されている左側の次のビット位置のキャリー・セーブ加算器５６に追加される。前のビット位置ｊ−１に対する最初のレベルのキャリー・セーブ加算器６１もビット位置ｊに対するレベル２の加算器４６に提供される６つのキャリー出力６４を提供する。従来のウォーレス・ツリーは、キャリー入力（たとえば、４３、４４）の数がキャリー出力の数に等しいと仮定しており、レベル１の各ビット位置に対する入力の数が等しい場合は常にこのことが言える。
【００５６】
このようなウォーレス・ツリーは、下の表に従って指定された加数の数について最小のレベルの数を提供する。
【表１】
2007500388.tif 000005
【００５７】
これは、限定されないが、特に上で説明した式Ｒ＝Ｘ＊Ｙ＋Ｚ  ｍｏｄ  Ｎで必要な計算に対して、特に、加数の数が計算によって変化する場合は、与えられた加数の数に対して必要な加算器の数を削減できることが、認識されている。
【００５８】
図５は、本発明による例示的な「アダプティブ・ツリー［adaptive tree］」すなわちネットワーク７０の基本的な構造の部分または断片を説明しており、各ビット番号の位置ｊ＋１、ｊ、およびｊ−１は、ツリーの列に対応する各ビット位置である。図５の断片では、各ビット位置（列）における加数の数は１８である。この基本的な構造はすべてのビット位置で使用されるが、各レベルおよび各ビット位置でのキャリー・セーブ加算器の数は、それぞれのビット位置で必要な加数の数に従って、個々に決定される。図８は、アダプティブ・ツリー７０の別のセクション、特に、それぞれ４〜１２個の加数が必要なビット位置０〜８（図３を参照）を示している。アダプティブ・ツリーは、このように個々の入力ビット位置に対する入力ビット数が変化するところで、必要な加算器の数を最小化または削減するように構成される加算器のツリー構造から構成されている。
【００５９】
アダプティブ・ツリーまたはネットワークの構造の決定は、次の規則に従って確立されている。
【００６０】
最初のレベルでは、与えられたビット位置のキャリー・セーブ加算器７１の数は、入力の加数の数を３で割り、端数を切り捨てた最も近い整数に設定される。たとえば、１６個の入力に対しては、５つの加算器が必要である。図５で示したように、位置ｊにおける１８個の入力に対しては、６つの加算器７１が必要である。
【００６１】
後続の各レベルで、与えられたビット位置に対する加算器の数は次の式に従って決定される。
（レベルｎにおけるビット位置ｊの加算器の数）＝
｛（ビット位置ｊにおけるレベルｎ−１からの和出力の数）＋
（ビット位置ｊにおけるレベルｎ−１の接続されていない入力の数）＋（ビット位置ｊ−１におけるレベルｎ−１のキャリーの数）｝
を３で割り、端数を切り捨てた最も近い整数である。
【００６２】
したがって、特に図５によると、ツリー７０の中間位置では、レベル１でのビット位置ｊに対して１８個の入力が必要であり、加算器７１の数は６である。レベル２では、上記の式にしたがって加算器７２の数はＩＮＴ｛（６＋０＋６）／３｝＝４となる。レベル３では、加算器７３の数はＩＮＴ｛（４＋０＋４）／３｝＝２となる。レベル４では、加算器７４の数はＩＮＴ｛（２＋２＋２）／３｝＝２となる。レベル５では、加算器７５の数はＩＮＴ｛（２＋０＋２）／３｝＝１となる。最後に、レベル６では、加算器７６の数はＩＮＴ｛（１＋１＋１）／３｝＝１となる。加数が１８個の場合、ビット位置ｊ＋１、ｊおよびｊ−１のそれぞれに対して、レベル３の各ビット位置で１つのキャリー・セーブ加算器を節約できることに留意されたい。
【００６３】
特に図８を参照すると、入力ビットの数が増加しているため、右からのキャリーの数がウォーレス・ツリーの場合よりも小さいので、ツリー７０の１つの端でさらに節約することができる。たとえば、ビット位置７では１１個の加数が存在する。従来のウォーレス・ツリーは５つのレベルを提示するはずである。実際、この位置では、４つのレベルで、それぞれ３、２、２、１個の加算器を備える必要がある。
【００６４】
場合によっては、ネットワーク内の戦略的な位置に２つの入力を伴うキャリー・セーブ加算器を１つ加えることによって、レベルの数は時にはさらに削減できる。まず、上で定義した戦略にしたがってネットワーク７０を形成するために、３つの入力を伴うキャリー・セーブ加算器のみを使用してこの設計が実施される。２つの入力を伴うキャリー・セーブ加算器を挿入する戦略的な位置を特定するには、各レベル（’Ｌｎ ’）とビット位置（’Ｂｊ ’）、そのビット位置ＢｊとレベルＬｎへの入力の数が最小の数、たとえば２か所を超える場所を特定する必要がある。そうした場所で、２つの入力を伴うキャリー・セーブ加算器をその場所の上のレベル（すなわち、Ｌｎ−１またはＬｎ−２など）で、２つの接続されていない加数があるレベルで挿入する。これは、１つの入力を次の上位のビット位置Ｂｊ＋１に移動するのが効果的である。このことにより今度は、次のビット位置に対して許されている出力の数を超える重大な超過が発生する可能性があるので、この手順はすべてのビット位置に対する入力の数が許されている数を超えなくなるまで、複数回繰り返されなければならない。
【００６５】
たとえば、特に図９を参照すると、高位ビットの入力の数が減少しており、結果として必要なレイヤの数を超える可能性がある。ビット位置ごとの入力の最大数は３なので、１つのレベルの加算器で十分である。図９では、ビット位置５８の加算器１００に対する３つの入力があり、ビット位置５７の加算器（図示せず）から１つのキャリー出力１０１がある。ビット位置５９および６０のそれぞれの加算器１０２、１０３にはそれぞれ２つの入力があり、ビット位置６１に対して１つの入力がある。ビット位置５９について、レベル１からは、ビット位置５８からのキャリー出力１つと接続されていないワード入力２つの３つ（２つが望ましい）の出力がある。ビット位置５８から５９までのキャリー１０１と、同様にビット５９から６０までのキャリーにより、３つのレベル（レイヤ１、レイヤ２、レイヤ３のラベルが付いている）が必要である。これで、２つの追加レイヤが得られる。
【００６６】
図１０を参照すると、さらに２つの入力、２つの出力を伴う加算器１１０、１１１（３つの入力、２つの出力を伴うキャリー・セーブ加算器、「ＣＳＡ３」と対比して「ＣＳＡ２」とラベル付けされている）を使用することによって、この状況を軽減できる。このような加算器は入力の数を合計では削減しないが、このビット位置での入力を１つだけ削減する。ＣＳＡ２加算器１１０は次の上位ビット位置６０に対する入力の数を２から３に増加するので、問題はビット位置５９からビット位置６０に移動する。しかし、レベル１、ビット位置６０の入力数を３から２に削減したＣＳＡ２加算器１１１も挿入されている。この結果により、ビット位置６１の入力の数が１から２に増加することは問題がない。
【００６７】
原理上、２つの入力加算器で特定のビット位置の加数の対を上位レベルで戦略的に処理することによりレベルの数をさらに減らすことができると認識されている。換言すると、１つまたは複数の隣接する上位の位置にある２つの入力を伴う加算器によって和の容量が局所的に増大することで、結果として下位レベルで必要な和の容量が削減されることがあり、追加の３つの入力を伴う加算器を使用しなくても、最終的にはレベルの数を削減できる。
【００６８】
この解決策［solution―ソリューション―］は、左隣の加数の数を増大するので、結果として入力が多くなりすぎる可能性がある。その場合、ビット位置６１が示すように、ビット位置が十分少ない数の入力を持つまで、複数の２つの入力を伴う加算器がレベルに挿入される必要があることもある。
【００６９】
一般的な意味で、追加の２つの入力を伴うキャリー・セーブ加算器を挿入する手順は、次に示す手順として定義してもよい。第１に、所定の数のレベルについて、第１の場所の出力の数が２より大きく（たとえば、２でなく３）、上位レベルに２つの接続されていない加数があり、ネットワーク上でビット位置ＢｉとレベルＬｎをとる第１の場所を検出する。第２に、この第１の位置に関して、同じビット位置Ｂｊであるが、第１の場所より上位のレベル（たとえば、Ｌｎ−１、Ｌｎ−２など）であり、その場所に２つの接続されていない加数がある第２の場所に２つの入力を伴うキャリー・セーブ加算器を挿入する。
【００７０】
この手順は、場合によってはすべてのビット位置で入力の数が許されている数を超えなくなるまで複数回繰り返される必要がある。
【００７１】
図６を参照すると、アダプティブ・ツリーはパイプライン化されていない加算器構成８０で使用されてもよい。この編成ではアダプティブ・ツリーは図２のすべての加数を加算するため、最大６つのレベル８１、８２…８６がある。加算器は１６のすべての積Ｐ０…Ｐ１５、Ｚ、フィードバック・キャリー項Ｃｃ（６２：０）および和項Ｃｓ（６２：０）を、６つのレベルのアダプティブ・ツリーを使用して合計する。ツリーの出力８７はレジスタに入り、最終的なキャリー項の上位部分Ｃｃ’（７８：１６）出力と最終的な和項の上位部分Ｃｓ’（７８：１６）出力はフィードバック・ライン９１にフィードバックされ、次の計算の入力としてビット位置（６２：０）にシフトされる。キャリー項の下位部分Ｃｃ’（１５：０）と和項の下位部分Ｃｓ’（１５：０）は追加の全加算器８８で合計され、レジスタ８９に保存される。これは、式、Ｂ・（ｃ’＋ｓ’）＋ｒ＝ｘ・ｙ＋（ｃ’＋ｓ’）＋ｚの項「ｒ」に相当する。
【００７２】
キャリー項と和項の下位部分Ｃｃ’（１５：０）とＣｓ’（１５：０）を後で加算すると、それ自体が図６でｃ”１６として識別されている１ビットのさらなるキャリー項を生成する。この１ビットのキャリー項は、フィードバック・ライン９０により示されるように、全加算器８８によってフィードバックされ、次の合計に追加される。
【００７３】
したがって、一般的な意味で、追加の全加算器８８とレジスタ８９は、和項とキャリー項を加算して最終結果の最初のワード出力を提供し、出力段で加算するために、メイン加算器アレイがさらに上位の和項とキャリー項を生成する後続の計算段の入力として使用される、キャリー・ビットｃ”１６を保持する出力段の例を示している。
【００７４】
代替として、キャリー項ｃ”１６は、Ｃｃ’（１６）およびＣｓ’（１６）と同じ重みがあるので、８１に示すアダプティブ・ツリーのレベル１、ビット０にｃ”１６をフィードバックすることもできる。この技術の欠点は、アダプティブ・ツリーが後続の計算を開始する前に、全加算器８８のｃ”１６出力を待たなければならないことである。したがって、全加算器８８を使用してｃ”１６項を加算することが好ましい。
【００７５】
それぞれの新しい乗算の開始時に、キャリー・ビットｃ”１６はＣｃ’とＣｓ’と同様にクリアされる。
【００７６】
図７に示す別の編成において、アダプティブ・ツリー１８０は、複数のレベル１８１…１８７を備えるパイプライン型の構成が指定されることもできる。この場合、一般的にキャリー項Ｃｃ’（７８：１６）の上位部分と和項の上位部分Ｃｓ’（７８：１６）を最初のレベル１８１ではなく、前述のレベル（すなわち、「中間」のレベル１８５）にフィードバックする必要がある。したがって、図７に示す特定の編成では、最後のレベル１８７から最後のキャリー項の上位部分Ｃｃ’（７８：１６）と最後の和項の上位部分Ｃｓ’（７８：１６）の出力は、次の計算が開始される前にレベル１にフィードバックされるのを待たずに、図示するようにこれらの項はレベル５で加算できる。この編成はレベルの数が１つ増大して７となるが、遅延は図６の編成における６レベルの遅延から、図７の編成における４レベルの遅延に削減される。
【００７７】
この構成では、一般的な意味でフィードバック・ライン１９１は、加算器回路の上位ビット出力を、対応する数の中間レベルの加算器回路の下位ビット入力に接続する。最初の４つのレベル１８１〜１８４からの合計の結果を一次的に保持するために、場合によっては中間レベルのレジスタ１９１を提供する必要がある。
【００７８】
これで、ハードウェアのコストが大幅に増加する代わりに、演算の速度が１．５倍に向上する。指定された例では、追加のレベルを処理するために、２７５個のレジスタを追加する必要がある。
【００７９】
アダプティブ・ツリーのもう１つの利点は、パイプライン型のバージョンに関して発生する。図７において、下位ビット値の多くの加算器（ここでは最大４つのレベルが必要）は最初の４つのレイヤに配置されており、そのことによってレジスタの数を減少している。一方、ウォーレス・ツリーではこのような加算器を下位のレイヤにおく必要がある。したがって、ウォーレス・ツリーは下位のビット値に関して上位レベルの入力の数を削減しないので、レベル４を上回るレジスタが必要である。
【００８０】
図７の編成には、図６の編成の出力段８８…９０に関連して説明したように、出力段１８８…１９０を含めてもよい。
【００８１】
他の実施形態は、意図的に添付の請求項の範囲内にある。
【図面の簡単な説明】
【００８２】
【図１】乗算演算Ｂ・ｃ＋ｒ＝ｘ・ｙ＋ｃ＋ｚ（ただし、ｘとｃは６４ビット幅であり、ｙ、ｚ、ｒは１６ビット幅である）を実行するのに適したアレイ乗算器を示す図である。
【図２】Ｒｊ＝ｘｎ−ｊ−１ｙ０＋ｚｎ−ｊ−１＋（Ｘｎ−ｊ−１ｙ１＋ｒｊ−１，０）Ｂｙ＋（Ｘｎ−ｊ−１ｙ２＋ｒｊ−１，１）Ｂｙ２＋ … ＋（Ｘｎ−ｊ−１ｙｎ−１＋ｒｊ−１，ｎ−２）Ｂｙｎ−１＋ｒｊ−１，ｎ−１）Ｂｙｎ （ただし、個々のワードの積ｘ・ｙはＰｉで表され、複数の積、たとえば、Ｐ０  …Ｐ１５に分割される。和項はＺで表される）の計算を実行するパイプライン型乗算器で加算されたワードのビット配列を示す図である。
【図３】図２に示すワードの和のビット位置あたりの加数の数を示すグラフである。
【図４】図２に示すパイプライン処理によるワードの和を実施するのに適した従来のウォーレス・ツリー構造の断片を示す図である。
【図５】図２に示すパイプライン処理によるワードの和を実施するのに適したアダプティブ・ツリー構造の断片を示す図である。
【図６】図２に示すワードの和を実施するのに適した非パイプライン型の加算器の概略を示すブロック図である。
【図７】図６に示す加算器の構造に基づくパイプライン型の加算器の概略を示すブロック図である。
【図８】図２に示すパイプライン化されたワードの和を実施するのに適した図５に示すアダプティブ・ツリー構造の別の断片を示す図である。
【図９】図５によるアダプティブ・ツリー構造の一部を示す図である。
【図１０】図９に示すアダプティブ・ツリー構造に挿入する２つの入力を伴う複数のキャリー・セーブ加算器の挿入を示す図である。
【図１】
2007500388.tif 000006
【図２】
2007500388.tif 000007
【図３】
2007500388.tif 000008
【図４】
2007500388.tif 000009
【図５】
2007500388.tif 000010
【図６】
2007500388.tif 000011
【図７】
2007500388.tif 000012
【図８】
2007500388.tif 000013
【図９】
2007500388.tif 000014
【図１０】
2007500388.tif 000015
【国際調査報告】
2007500388.tif 000016
2007500388.tif 000017
2007500388.tif 000018
2007500388.tif 000019
2007500388.tif 000020
2007500388.tif 000021