(57)【要約】      （修正有）【課題】メモリに対するデータの読み書きを行うためのアドレス生成を高速に行うことができ、処理効率の向上を図る。【解決手段】ＡＬＵモジュール３５０に設けられた複数のメモリ３３０，３４０，３６０にそれぞれ対応して複数設けられ、前記接続構成の切り替えごとにメモリ１１０から読み出すデータ、あるいは書き込むデータのアドレスを生成するアドレス生成器３００，３１０，３２０を備える。このアドレス生成器によれば、メモリへのアドレス生成に当たり、専用のハードウェアをメモリのポート対応として実装し、その動作設定を各種のパラメータ、設定値を用いて行うので、高速なアドレス生成を行うことができる。【選択図】  図４
2006018412.tif 000002
【特許請求の範囲】
【請求項１】
複数のＡＬＵ（Ａｒｉｔｈｍｅｔｉｃ  ａｎｄ  Ｌｏｇｉｃ  Ｕｎｉｔ）を有するＡＬＵモジュールを複数接続する接続構成を切り替えながら所定の演算処理を実行するプロセッサに設けられるアドレス生成器において、
前記ＡＬＵモジュールに設けられた複数のメモリにそれぞれ対応して複数設けられ、前記接続構成の切り替えごとに前記メモリから読み出すデータ、あるいは書き込むデータのアドレスを生成するアドレス生成手段を備えたことを特徴とするアドレス生成器。
【請求項２】
前記アドレス生成手段は、アドレスカウンタを有し、
前記アドレスカウンタは、前記接続構成の切り替えを制御するシーケンサからの外部入力に基づいて、アドレスの初期値と、増加あるいは減少させるアドレスのインクリメント値と、アドレス生成の回数と、アドレス生成のモードと、を設定することを特徴とする請求項１に記載のアドレス生成器。
【請求項３】
前記アドレスカウンタは、前記シーケンサによる起動要求後は、自律的に更新したアドレスを生成し、出力するデータの有効性を示すトークンビットを当該データに付与する自律更新モードと、
前記シーケンサからの起動要求後に、データの有効性を示すトークンビットの入力ごとにアドレスの更新を行い、入力された当該トークンビットの入力に基づいて、出力するデータの有効性を示すトークンビットを当該データに付与するトークン更新モードと、
のうちいずれか一つのモードを選択可能なことを特徴とする請求項２に記載のアドレス生成器。
【請求項４】
前記アドレスカウンタは、加算される前記所定のインクリメント値を設定する増分設定手段をそれぞれ備えることを特徴とする請求項２に記載のアドレス生成器。
【請求項５】
前記アドレスカウンタは、前記ＡＬＵモジュールによって演算されたアドレスを設定可能なことを特徴とする請求項２に記載のアドレス生成器。
【請求項６】
前記アドレスの初期値の設定を前記シーケンサから受け付けるか否かを設定するロード受付設定手段を備えたことを特徴とする請求項２に記載のアドレス生成器。
【請求項７】
前記アドレスカウンタは、モード切替手段をさらに備え、前記モード切替手段が外部演算モードを備える場合、前記所定のインクリメント値の加算を行わずに、外部から入力されたデータを保持して出力することを特徴とする請求項２に記載のアドレス生成器。
【請求項８】
前記アドレスカウンタは、アドレスの更新時にアドレスを減らすことにより、アドレスの巻き戻しを行う巻き戻し手段を備えることを特徴とする請求項２に記載のアドレス生成器。
【請求項９】
前記アドレスカウンタは、前記アドレス生成の回数が所定の回数に達したときに所定のインクリメント値の更新を終了し、終了信号を前記シーケンサに出力することを特徴とする請求項２に記載のアドレス生成器。
【請求項１０】
第１初期アドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第１アドレスを第１トークンとともに出力する第１アドレス生成器と、
前記第１トークンの受信に応答して、前記第１アドレスで指定されるデータを、第２トークンとともに出力する第１のメモリと、
前記第２トークンの受信に応答して、前記第１のメモリから出力されたデータに基づいて演算を行う演算器と、
第２初期アドレス値に所定のインクリメント値を加算することにより生成された第２アドレス値を第３トークンとともに出力する第２アドレス生成器と、
前記第３トークンの受信に応答して、前記演算器による演算結果を、前記第２のアドレス生成器で生成されたアドレスに書き込む第２のメモリと、
を備えることを特徴とする演算回路。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、接続構成を変更自在な再構成型のプロセッサ中のクラスタで用いられるアドレス生成器および演算回路に関する。
【背景技術】
【０００２】
複数のクラスタを一つのプロセッサの中に収容し、そのクラスタ間の配線を適宜切り替えることで、適切なクラスタで適切な処理を行うことができるようにし、処理全体の高速化を図るという、いわゆるリコンフィギュアブルな再構成型プロセッサの技術が登場している。ここで用いられるクラスタは、それぞれ演算器とこれを保持するメモリを備えており、高速な演算を行うことが求められている。
【０００３】
クラスタ構成のプログラミングにおいて、以下のような配列に対して演算を行う場合が多い。ａ［ｉ］＝ｂ［ｉ］×ｃ［ｉ］という演算を例に挙げる。この場合、入力データａ，ｂについて、アドレス指定を行い、メモリに書き込み、演算を行う。演算結果ｃについて、書き込むアドレスを求め、求められたアドレスに演算結果ｃを書き込むということを行っていた。特にクラスタ構成においては、演算器リソースを使用してメモリアドレス計算を行うことが予想される。また、デジタル通信技術において、バースト誤りの影響を低減するためのインターリーブ処理において、初期値０からカウントアップさせていく形でインターリーブのためのアドレスを生成させるインターリーブアドレス発生器の技術が開示されている（たとえば、特許文献１参照。）。
【０００４】
【特許文献１】特開２０００−７８０３０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
こうしたアドレス生成はソフトウェアにより、通常処理から連続で行われていたので、処理に時間がかかっていた。つまり、メモリのアドレスは演算により求め、そして求めたアドレスのメモリを使用することにより演算を実行していたため、アドレス生成に処理負担をとられることになり、処理効率が悪かった。
【０００６】
この発明は、上述した従来技術による問題点を解消するため、メモリに対するデータの読み書きを行うためのアドレス生成を高速に行うことができ、処理効率の向上を図ることができるアドレス生成器および演算回路の提供を目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するため、この発明にかかるアドレス生成器は、複数のＡＬＵ（Ａｒｉｔｈｍｅｔｉｃ  ａｎｄ  Ｌｏｇｉｃ  Ｕｎｉｔ）を有するＡＬＵモジュールを複数接続する接続構成を切り替えながら所定の演算処理を実行するプロセッサに設けられるアドレス生成器において、前記ＡＬＵモジュールに設けられた複数のメモリにそれぞれ対応して複数設けられ、前記接続構成の切り替えごとに前記メモリから読み出す、あるいは書き込むデータのアドレスを生成するアドレス生成手段を備えたことを特徴とする。
【０００８】
この発明のアドレス生成器によれば、メモリへのアドレス生成に当たり、専用のハードウェアをメモリポート対応として実装し、その動作設定を各種のパラメータ、設定値を用いて行うことにより、高速なアドレス生成を行うことができる。
【０００９】
また、この発明による演算回路は、第１初期アドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第１アドレスを第１トークンとともに出力する第１アドレス生成器と、前記第１トークンの受信に応答して、前記第１アドレスで指定されるデータを、第２トークンとともに出力する第１のメモリと、前記第２トークンの受信に応答して、前記第１のメモリから出力されたデータに基づいて演算を行う演算器と、第２初期アドレス値に所定のインクリメント値を加算することにより生成された第２アドレス値を第３トークンとともに出力する第２アドレス生成器と、前記第３トークンの受信に応答して、前記演算器による演算結果を、前記第２のアドレス生成器で生成されたアドレスに書き込む第２のメモリと、を備えることを特徴とする。
【００１０】
この発明の演算回路によれば、ハードウェアを利用した高速なアドレス生成が可能になり、従ってデータ読み出しを行うアドレス、およびデータの書き込みを行うアドレスが高速に生成されるので、高速な演算が可能になり、演算回路が組み込まれる装置全体でのパフォーマンスの向上を図ることができる。
【発明の効果】
【００１１】
本発明にかかるアドレス生成器および演算回路によれば、高速なアドレス生成を行うことができるので、演算に必要なデータをメモリから高速に読み出しすることができ、また、演算結果を高速にメモリに書き込むことができるため、クラスタの処理能力の向上を図ることができるという効果を奏する。
【発明を実施するための最良の形態】
【００１２】
（実施の形態）
図１は、本発明にかかる再構成型プロセッサのクラスタの構成を示すブロック図である。クラスタ１０は、実際の処理を行うＡＬＵブロック１１と、再構成のためのコンフィギュレーション情報を供給するシーケンサ部１２とによって構成されている。
【００１３】
ＡＬＵブロック１１は、各種の演算素子によって構成された複数のＡＬＵモジュール１３と、処理対象のデータの読み出しおよび処理結果のデータの格納を行うメモリ１４と、アドレスの生成を行うカウンタ１５と、入力された２つの信号の比較（条件判定）を行うコンパレータ１６と、バスブリッジ１７と、ネットワーク１８と、によって構成されている。ネットワーク１８は、各ＡＬＵモジュール１３に対する信号の入力部にそれぞれレジスタ１９と、セレクタ２０とが設けられている。
【００１４】
そして、演算内容等に応じてシーケンサ部１２が出力するコンフィギュレーション情報に基づいて、各ＡＬＵモジュール１３の組み合わせ（選択）と、メモリ１４と、コンパレータ１６との間の接続形態が再構成可能である。この接続形態の変更は、ネットワーク１８に設けられたセレクタ２０によって切り替えられる。
【００１５】
本発明にかかる演算回路は、演算器とメモリとアドレス生成器の組み合わせによりなる。後述の各種演算器はＡＬＵモジュール１３により、後述の各メモリはメモリ１４により、後述の各アドレス生成器はカウンタ１５により実行される。
【００１６】
図２はメモリ書き込みの基本構成を示すブロック図である。アドレス生成器１００がメモリ１１０のアドレス書き込みポートに接続される構成になっている。ここでアドレス生成器１００が自律的にアドレスを生成してメモリに順次出力することにより、アドレス生成処理を、シーケンサ制御によってではなく別個のハードウェアとして提供することができる。
【００１７】
アドレス生成器１００は、シーケンサ部１２（図１参照）からの起動要求１０１を受けてアドレスの生成を開始する。処理が終了したらシーケンサ部１２に終了通知１０２を送る。自律更新モードでない場合は、入力トークン１０３の入力を受けてアドレス生成を行う。生成されたアドレスは書き込みアドレス１０４として出力される。またこのときアドレストークン１０５を出力する。
【００１８】
トークンを持つことは、処理を行う権限を持っていることを示す。このトークンを持っている間はその処理部は処理を行い、処理が終了したらトークンを次の処理部に出力し、次の処理部に処理権限を渡す。この場合アドレス生成器１００からメモリ１１０にアドレストークン１０５が送られ、処理をメモリ１１０に渡している。
【００１９】
メモリ１１０は書き込みアドレス１０４およびアドレストークン１０５を入力する一方で、他のポートに書き込みデータ１１１およびデータ入力トークン１１２を入力する。ここで、メモリ１１０の指定された書き込みアドレス１０４に、入力された書き込みデータ１１１を書き込むことになる。
【００２０】
図３は、メモリ読み出しの基本構成を示すブロック図である。アドレス生成器１００がメモリ２１０のアドレス読み出しポートに接続される構成になっており、アドレス生成器１００が自律的にアドレスを生成してメモリに順次出力することにより、アドレス生成処理を、シーケンサ部１２の制御によってではなく別個のハードウェアとして提供することができる。
【００２１】
アドレス生成器１００の動作は、図２で説明したメモリ書き込みの場合と同じである。ただしアドレスの出力は、書き込みアドレス１０４としてではなく、読み出しアドレス２０４として行う。ここで、データの書き込みではないので、書き込みデータの入力はなく、メモリ２１０は読み出しアドレス２０４およびアドレストークン１０５を入力することにより、データの読み出しが行われる。ここで、メモリ２１０の指定された読み出しアドレス２０４に記憶された読み出しデータ２１１を読み出し、出力することになる。そして、読み出しデータ２１１とともに出力トークン２１２を出力する。
【００２２】
次にアドレス生成器およびメモリを用いて演算を行い、演算結果を出力する回路構成を、図４および図５を用いて説明する。例えば、ａ［ｉ］＝ｂ［ｉ］×ｃ［ｉ］という演算の場合、ａ［ｉ］がメモリＡに、ｂ［ｉ］がメモリＢに、ｃ［ｉ］がメモリＣに割り当てることを考える。メモリＡへはデータの書き込みを行うので、書き込みを行うためのアドレス生成器、メモリＢおよびＣからはデータの読み出しを行うので、読み出しを行うためのアドレス生成器を配置する。これらのアドレス生成器に同期して、ｉに相当させる０〜２５５番目のアドレスを生成させることにより、クロックごとにメモリの読み出し・書き込みを行うことができる。
【００２３】
アドレス生成器は、シーケンサ部１２からの指示を入力することにより動作を開始し、終了したときには動作終了信号をシーケンサ部１２に返す。またアドレス生成器は、アドレス値を保持しており、保持しているアドレス値を出力し続ける。アドレス値の出力とともにトークンの出力を行う。アドレス値は初期値が最初にロードされ、所定の更新タイミングでアドレス値が更新される。
【００２４】
図４は、アドレス生成器を用いた演算回路の構成を示すブロック図である。なお図中、ａ［ｉ］、＆ａ［ｉ］と一つの文字を＆で分けて表現しているが、ａ［ｉ］はデータであり、＆ａ［ｉ］はデータの書き込みまたは読み出しが行われるアドレスを意味している。
【００２５】
アドレス生成器３１０は、保持されている読み出しアドレス３１１をアドレストークン３１２とともに出力する。最初のアドレスはロードされた初期値であり、アドレスはクロックが入力されるごとにインクリメントされて更新される。メモリ３３０は、アドレス生成器３１０から出力された、読み出しアドレス３１１とアドレストークン３１２を受信し、読み出しアドレス３１１で指定されたアドレスに記憶される読み出しデータ３３１を、トークン３３２とともに演算器３５０に出力する。
【００２６】
アドレス生成器３２０は、保持されているアドレスをトークンとともに出力する。最初のアドレスはロードされた初期値であり、アドレスはクロックが入力されるごとにインクリメントされて更新される。メモリ３４０は、アドレス生成器３２０から出力された、読み出しアドレス３２１とアドレストークン３２２を受信し、読み出しアドレス３２１で指定されたアドレスのデータを読み出しデータ３４１とし演算器３５０に出力する。
【００２７】
演算器３５０は、メモリ３３０とメモリ３４０から出力された読み出しデータ３３１、３４１を受け取り、演算を行う。行う演算は、上述の例では乗算を挙げたが、加減乗除のいずれを採用することもできる。一方でアドレス生成器３００は、保持されているアドレスをトークンとともに出力する。最初のアドレスはロードされた初期値であり、アドレスはクロックが入力されるごとにインクリメントされて更新される。
【００２８】
メモリ３６０は、書き込みアドレス３０１およびアドレストークン３０２をアドレス生成器３００から、書き込みデータ３５１およびデータトークン３５２を演算器３５０から受け取り、演算結果の書き込みを行う。
【００２９】
図５は更新トリガを用いてアドレス生成器を自動更新する場合の構成を示すブロック図である。アドレス生成器の更新トリガには、１．自律更新モード、あるいは２．トークン更新モードがある。
【００３０】
（１．自律更新モードについて）
自律更新モードにおいては、動作を開始したらクロック信号が入力されるたびに自律でアドレスを更新し、出力するトークンを生成する。アドレス更新のタイミングはあくまでクロック信号の入力による自律的なものであり、トークンの入力を受けて行うものではない。
【００３１】
（２．トークン更新モードについて）
トークン更新モードにおいては、アドレスの更新はトークンの入力を受けて行う。アドレス更新のタイミングを、クロックのタイミングではなくトークンの入力とすることにより、更新のタイミングを自律的なものではなく他の回路からの入力により制御することができる。例えばトークンの入力を待つことにより、アドレスの更新タイミングを、アドレス生成器の出力するアドレスに書き込むべきデータの到着タイミングに合わせることができる。
【００３２】
アドレス生成器３１０、アドレス生成器３２０、メモリ３３０、メモリ３４０、および演算器３５０の動作は図３の場合と同様であるので説明は省略する。ただし、トークン３３２は、演算器３５０に対してだけではなく、アドレス生成器４１０に対しても出力される。
【００３３】
アドレス生成器４１０は、保持されている書き込みアドレス４１１をアドレストークン４１２とともに出力する。書き込みアドレス４１１の最初の値はロードされた初期値であり、トークン３３２が入力されるごとにインクリメントされて更新される。
【００３４】
メモリ４２０は、書き込みアドレス４１１およびアドレストークン４１２をアドレス生成器４１０から、書き込みデータ４２１およびデータトークン４２２を演算器３５０から受け取り、書き込みアドレス４１１の示すアドレスに書き込みデータ４２１の示す演算結果のデータの書き込みを行う。
【００３５】
（アドレス生成器について）
（１）アドレス生成器の基本設定内容
アドレス生成器の基本設定内容には、初期値、インクリメント値、更新回数、および更新トリガモード設定がある。初期値はアドレスの初期値である。インクリメント値は、アドレスに逐次加算する値である。加算のみの想定の場合、符号なしの整数とすることができる。減算を想定する場合、本フィールドに符号ビットを付加することにより補数表記にしてもよいし、符号ビットに絶対値を加算した形で表記することもできる。
【００３６】
アドレス生成器の基本動作は次の通りである。まず、（１）シーケンサ部１２からの信号を受けてアドレス生成器が起動する。起動すると、アドレス生成器内の内部カウンタにアドレスの初期値がロードされる。その後、（２）自律更新の場合はクロック信号の入力、トークン更新モードの場合はトークンの入力による更新タイミングに対し、そのときのカウンタの値を生成アドレスの値として出力する。このとき出力トークンも同時に出力する。
【００３７】
その後、（３）カウンタ値をインクリメント値だけ加算してカウンタ値を更新する。そして、（４）カウンタ値の加算回数が設定回数に達した場合、カウンタ値およびトークンの出力を停止する。そして、停止したことをシーケンサ部１２に通知する。
【００３８】
（自律更新モードの動作について）
図６は、自律更新モードにおいて、アドレス値を４回更新する場合を示すタイミングチャートである。自律更新モードは、クラスタ群の先頭クラスタの場合や、１クラスタのみを使用する場合などに用いられ、例えばトークン処理のマスタとして使用する場合に有効である。
【００３９】
まず起動要求６０１が入力され、これとともにアドレスの初期値がロードされる。これを受けて出力トークン６０２が生成され、アドレスの初期値とともに出力される。出力トークン６０２が出力され続ける一方で、クロック信号が入力されるたびにアドレスの初期値にインクリメント値が加算され、出力アドレス６０３が更新される。所定の更新回数に達すると出力トークン６０２は０となって出力が終了し、終了通知６０４が出力される。
【００４０】
（トークン更新モードの動作について）
図７は、トークン更新モードにおいて、アドレス値を４回更新する場合を示すタイミングチャートである。トークン更新モードは、クラスタ群の下流クラスタなどに用いられ、例えばトークン処理のスレーブとして使用する場合に有効である。
【００４１】
まず起動要求７０１が入力され、これとともにアドレスの初期値がロードされ、出力アドレス７０２が出力される。アドレスの出力および更新は入力トークン７０３の入力を待って行われる。入力トークン７０３が入力されると、１クロック後に出力トークン７０４が生成されて出力され、このときアドレスの初期値が出力される。さらに１クロック後にアドレスが更新され、アドレスの初期値にインクリメント値が加算され、出力アドレス７０５となる。
【００４２】
このとき入力トークン７０６が入力される場合は、再び１クロック後に出力トークン７０７が生成されて出力され、更新されたアドレスが出力される。そして同様にさらに１クロック後にアドレスの更新となり、アドレスにインクリメント値が加算され、出力アドレス７０８となる。
【００４３】
ここでさらに入力トークン７０９が入力される。同様に１クロック後に出力トークン７１０が生成されて出力され、出力アドレス７０８が出力される。そして同様にさらに１クロック後にアドレスが更新され、アドレスにインクリメント値が加算される。ここで、入力トークン７０９は立ち上がったままなので出力トークン７１０は立ち下がらず、そのまま更新された出力アドレス７１１が出力される。
【００４４】
このアドレス更新のタイミングで、ここでは入力トークン７０９が立ち下がりになるので、その１クロック後に出力トークン７１０が立ち下がる。アドレスは初期値を含めて４回出力されたので出力が終了し、終了通知７１２が出力される。
【００４５】
（２）終了通知の設定
なお、アドレス生成器により出力される終了通知は、シーケンサ部１２でのコンフィギュレーション切り替えトリガとしての使用を想定している。ただしシーケンサ部１２が終了通知を用いる必要はなく、例えば演算器からのフラグを参照してコンフィギュレーションの切り替えを行うことができる。その他、すべてのアドレス生成器ではなく、一部のアドレス生成器のみからの終了通知のみを参照する構成にして、シーケンサ部１２に終了通知を送信しないアドレス生成器が存在する構成にすることができる。
【００４６】
（３）インクリメント値の設定
インクリメント値を１として、カウンタの値を１ずつカウントアップする構成にすることもできる。また、インクリメント値を２のべき乗とすることもできる。例えばワード単位のデータの場合、データのビット数が２のべき乗なのでカウンタの増分を２のべき乗とすることは有用である。この場合、２nのｎを設定する構成にする。さらに、インクリメント値を可変とすることもできる。
【００４７】
（４）更新開始時刻の設定
アドレス生成器では、トークン出力およびアドレス更新を開始する、更新開始時刻を設定することができる。時刻はクロック数で指定することができる。構成としては、上述のアドレス生成器の出力を受けるメモリ２つの演算を行う回路構成からの出力に、更新開始時刻を指定する回路からの出力を加算する構成にする。これにより、所定の更新開始時刻から、トークン出力およびアドレス更新を開始することができる。
【００４８】
図８は、更新開始時刻を制御して演算を行い、出力を行う構成を示すブロック図である。アドレス生成器３１０、アドレス生成器３２０、メモリ３３０、メモリ３４０、および演算器３５０の動作は図３の場合と同様であるので説明は省略する。演算器３５０からは、演算結果である演算データ８０１およびトークン８０２が出力される。出力はＦＦ（フリップフロップ）８１０に入力され保持され、加算器８４０に出力される。
【００４９】
一方でアドレス生成器８２０は、保持されている読み出しアドレス８２１をアドレストークン８２２とともにメモリ８３０に出力する。最初のアドレスはロードされた初期値であり、アドレスはクロックが入力されるごとにインクリメントされて更新される。メモリ８３０は、アドレス生成器８２０から出力された、読み出しアドレス８２１とトークン８２２を受信し、読み出しアドレス８２１で指定されたアドレスに記憶される読み出しデータ８３１を、トークン８３２とともに加算器８４０に出力する。
【００５０】
加算器８４０には演算データ８０１、読み出しデータ８３１が入力されるので、一方で入力されるトークン８３２を受けてこれらを加算し、出力データ８４１とトークン８４２を出力する。
【００５１】
このように、アドレス生成器８２０は、アドレス生成器３１０およびアドレス生成器３２０よりも１クロック遅れて更新を開始する必要がある。ここでアドレス生成器３１０およびアドレス生成器３２０の更新開始時刻を０に、アドレス生成器８２０の更新開始時刻を１に設定する。なおこの設定は、アドレスの初期値のロードから、アドレスの更新までの遷移にかかる時間を示しているといえる。
【００５２】
更新開始時刻を遅らせるには、さらに次の方法が考えられる。（１）下流のアドレス生成器をトークン更新モードに設定する。（２）メモリの読み出しは時刻０で行い、メモリの後ろにフリップフロップを多数入れて遅延を発生させる。
【００５３】
（５）更新間隔の設定
アドレス生成器の設定事項として、更新間隔を設定することができる。更新間隔の時間はクロック数で指定される。ここで指定される間隔でトークン出力・アドレス更新の間隔が指定される。パイプラインの下流において、何らかの理由によりメモリデータの投入を離散的に行う必要がある場合に特に有効である。例えば１クロックで演算が終わらない場合などが挙げられる。更新間隔は、設定がなければ通常通り１クロック単位だが、２、３、・・、２５５といった形で設定することができる。
【００５４】
（６）終了通知の遅延の設定
クラスタがパイプライン構成となっているので、上流のアドレス生成器から出力する場合など、シーケンサ部１２への終了通知を遅らせたい場合がある。この場合、終了通知遅延時間をアドレス生成器に設定することにより、設定されたクロック数分終了通知を遅延させることができる。これにより、終了を見込んで終了通知を遅延して通知する形になる。
【００５５】
（７）アドレス初期値のロード抑止の設定
実行するプログラム中のｉｆ文をコンフィギュレーションの変更で対応する場合など、リコンフィギュレーション（再構成）を実行する際におけるアドレス初期値などのロードを、抑止したい場合がある。そのために、アドレス生成器にロード禁止を設定することにより、シーケンサ部１２からの起動要求があっても、起動時のアドレスの初期値などのロードを抑止できる。この設定は、アドレス初期値、カウントアップ値などの全パラメータ値に共通とすることができ、また、パラメータごとに一部はロード可として一部はロード不可というように個別に設定できるようにすることもできる。
【００５６】
（８）外部演算モード（ＦＦ動作モード）の設定
インクリメント値を可変にする場合など、アドレス計算にどうしても演算器を用いる必要がある場合がある。アドレス生成器は、その場合において単にロード可能なフリップフロップとして動作したほうが好ましい場合がある。この場合、アドレス生成器を外部演算モードとして設定することにより、アドレス更新値を別のクラスタで演算した結果の入力を受けることにより、演算器からアドレス更新値をロードするモードに設定することができる。この場合、内部カウンタを止め、入力トークンを受けた場合にアドレス更新値をロードするようにする。
【００５７】
図９は、外部演算モードの場合のアドレス生成器のタイミングチャートである。まず起動要求が入力される。入力トークンが入力されるとともに入力データが入力されると、１クロック後に出力トークンが生成される。一方で入力データがそのまま出力アドレスとなり、出力トークンとともに出力され、そして起動要求時に０だったトークン数が１にカウントアップされる。
【００５８】
さらに１クロック後に入力トークンが入力されるとともに入力データが入力されると、再び１クロック後に出力トークンが生成される。同様に入力データがそのまま出力アドレスとなり、出力トークンとともに出力され、そして１だったトークン数が２にカウントアップされる。ここでさらに１クロック後に入力トークンが入力されるとともに入力データが入力されると、再び１クロック後に出力トークンが生成される。同様に入力データがそのまま出力アドレスとなり、出力トークンとともに出力され、そして２だったトークン数が３にカウントアップされる。ここでは入力トークンが２クロック連続で入力されるので、さらに入力トークンが入力される。
【００５９】
従って、さらに１クロック後も出力トークンは立ち上がりのまま維持される。なお入力トークンはここでは立ち下がる。ここで同様に入力データがそのまま出力アドレスとなり、出力トークンとともに出力され、そして３だったトークン数が４にカウントアップされる。出力トークンは入力トークンに対応するので今度は立ち下り、またトークン数カウントが設定値の４に達したので、終了通知を出力して終了する。
【００６０】
ここでの終了通知の方法としては、（１）アドレス生成器で入力トークン数を計測し、アドレス生成器から通知する。（２）アドレス生成器では入力トークン数を計測せず、別のクラスタにある、外部の演算器のコンパレータを介して終了通知する。以上の２つの方法をとることができる。図９のタイミングチャートは、（１）の場合について説明している。
【００６１】
（９）設定値の外部入力設定
多重ループなどで、外側の演算結果よりも内側のループの回数が決まるなどの場合、設定値を演算器から書き込みたい場合がある。そのために、アドレス生成器に演算設定という設定項目を設け、演算器からの出力結果をこの設定に書き込むことができるようにすることができる。つまり、この演算設定とは、演算器での演算結果から設定値を求める設定である。この機能を実装する場合、アドレス生成器内部に演算器で求めた設定値を保持するレジスタが必要になる。ただし、アドレス初期値については、直接カウンタにロードする構成にすることができる。この設定は、アドレス初期値、カウントアップ値などの全パラメータ値に共通とすることができ、また、パラメータごとに一部はロード可として一部はロード不可というように個別に設定できるようにすることもできる。
【００６２】
（１０）アドレスの巻き戻し設定
パイプラインにハザードが発生したことにより、生成したアドレスを巻き戻したい場合がある。次に、この場合の対処方法について説明する。
【００６３】
（ａ）固定値を減算する方法
巻き戻し要求が発生した場合、現在のアドレス値を、設定した値だけ減算する。巻き戻し値は、アドレス生成器に設定しておくことにより、この場合の現在のアドレス値から減算する値である。カウントダウンのときは、この値に負の数を設定できるようにし、負の数の場合、実際は加算として実行する。
【００６４】
（ｂ）発行アドレスをパイプラインに記録しておき、記録したアドレスをロードする方法
通常は、パイプラインを形成するシフトレジスタに、発行アドレスを投入する。巻き戻し要求が発生した場合、設定数だけ先に存在している発行アドレスをロードする。このために、パイプライン段数を設定できるようにし、巻き戻し要求が発生した場合、指定したクロック数だけ進んだ位置にある発行アドレスをロードする。
【００６５】
図１０は、パイプライン段数を２に設定した場合のタイミングチャートである。出力トークンが１である間、出力アドレスは１０から１４までカウントされ、次に１５をカウントする前に、巻き戻し要求がなされ、一旦１２に戻り、１３から１５までカウントされていく場合について説明する。
【００６６】
ここで、パイプラインは０、１、２がある。出力アドレスはパイプライン０にそのまま渡され、１クロック後にパイプライン１に、さらに１クロック後にパイプライン２に渡される。出力アドレスが１４をカウントしているときに、パイプライン２は、１２をカウントしている。ここで、アドレス１２に対してハザードが発生した場合を仮定する。この場合巻き戻しの必要が発生したことが通知されるので、カウント１４の次は再び１２からやり直し、１３、１４、１５とカウントしていく。この出力アドレスの動作はパイプライン０〜２にも同じように伝えられ、最終的に巻き戻し動作が完了する。
【００６７】
ここで、アドレス生成個数をカウントしている場合、この個数を減算する必要がある場合があり、この場合、巻き戻し個数を設定することができる。ここでの巻き戻し個数とは、巻き戻し要求が発生した場合の、現在のアドレス発行個数から減算される値のことであり、パイプライン数に一致した数となる。
【００６８】
なお（ｂ）の場合、巻き戻し個数を固定値にするのではなく、パイプライン上に存在する有効な発行アドレスの個数を数えておき、その数だけ減算するという方法も考えられる。あるいは、（ｂ）と同様に、そのときの発行個数をパイプラインに投入し、パイプラインから発行個数を読み出してロードする方法も考えられる。こうした機能を実装する場合は、アドレス生成器に対して、外部から巻き戻し要求を入力できるようにする必要がある。
【００６９】
（バブルソートのためのアドレス生成器選択機能）
通常は、メモリのアドレスポートにアドレス生成器を１：１で接続することを想定しているが、図１１のバブルソートプログラムによれば、＆ａ［ｊ］、＆ａ［ｊ＋１］のように、一つのメモリアドレスに、２系統あるいはそれ以上の系列の書き込み・読み出しアドレス生成が必要となる場合がある。
【００７０】
バブルソートとは、ソートアルゴリズムの一種である。例えばｎ個の配列があったとして、配列の１番後ろから隣り合う要素を比較して、前の配列に入っている数値が後ろより大きければ、前と後ろの要素を交換する。これを先頭の要素まで繰り返すと、１番小さな数字が先頭に現れる。今度は先頭を除いてもう１回繰り返すと、２番目に小さな数字が２番目に現れる。この操作を繰り返していくことにより、先頭から小さな順に並べ替えられる。
【００７１】
図１１は、バブルソートプログラムの概要を示したプログラムを示す図である。ｉ＝０〜２５５の範囲内でループを行い、その中でｊ＝０〜２５５の範囲内でループを行う。ｊのループにおいては、ａ［ｊ］とａ［ｊ＋１］の比較を行い、ａ［ｊ］が大きければ順番を入れ替える。この比較をｊが０から２５５になるまで繰り返し、終了したら再びｊが０のところからやり直す。これをｉが０から２５５になるまで繰り返していく。
【００７２】
バブルソートの個々の処理は隣り合う２つの数字の比較とその入れ替えである。従って隣り合う２つのメモリからアドレス指定して読み出し、両者をソートしてからメモリに入れ直す構成により実現することができる。
【００７３】
図１２は、バブルソートを実行する場合にアドレス生成器をメモリのポートに接続した構成を示すブロック図である。この例に示すように、メモリに読み出しのためのアドレスとトークン、および書き込みのためのアドレスとトークンを接続し、この組となる構成を２つ並べている。これらのメモリの出力をソートに入力して、その出力を逆にしてメモリにそれぞれ書き込むことにより、データの順番を入れ替えている。
【００７４】
読み出しのフェーズのとき、アドレス生成器１０１０は、読み出しアドレス１０１１とともにアドレストークン１０１２をメモリ１０５０に出力する。一方でアドレス生成器１０３０は、読み出しアドレス１０３１とともにアドレストークン１０３２をメモリ１０６０に出力する。
【００７５】
メモリ１０５０は指定されたアドレスのデータを読み出しデータ１０５１としてデータトークン１０５２とともに出力し、ソート部１０７０に出力する。メモリ１０６０は指定されたアドレスのデータを読み出しデータ１０６１としてデータトークン１０６２とともに出力し、ソート部１０７０に出力する。ソート部１０７０は、読み出しデータ１０５１と読み出しデータ１０６１とを比較して、読み出しデータ１０５１のほうが小さければそのままに、読み出しデータ１０５１のほうが大きければ読み出しデータ１０５１と読み出しデータ１０６１とを入れ替える。
【００７６】
ここで書き込みのフェーズに移行する。ソート部１０７０から出力されたデータは、それぞれメモリ１０５０およびメモリ１０６０に書き直されるが、その前にアドレスの指定が行われる。すなわち、アドレス生成器１０２０は、書き込みアドレス１０２１とともにアドレストークン１０２２をメモリ１０５０に出力する。一方でアドレス生成器１０４０は、書き込みアドレス１０４１とともにアドレストークン１０４２をメモリ１０６０に出力する。
【００７７】
ソート部１０７０は、メモリ１０５０に書き込まれるデータを書き込みデータ１０５３としてデータトークン１０５４とともにメモリ１０５０に出力し、メモリ１０６０に書き込まれるデータを書き込みデータ１０６３としてデータトークン１０６４とともにメモリ１０６０に出力する。メモリ１０５０は指定されたアドレスに書き込みデータ１０５３を、メモリ１０６０は指定されたアドレスに書き込みデータ１０６３を書き込む。
【００７８】
しかし、通常は一般的に使用可能なメモリは読み出し／書き込みポートをせいぜい２つしか持たないが、図１２の場合、４つのポートを必要とする。従ってこの点で現実的な構成であるとはいえない。
【００７９】
そこで、メモリに対して読み出しフェーズと書き込みフェーズに分け、時分割の切り替えにより、読み出しフェーズのときには読み出しアドレスを生成するアドレス生成器とメモリを接続し、書き込みフェーズのときにはアドレスを生成するアドレス生成器とメモリを接続することにより、２つのポートを持つメモリに対してバブルソートを実現する様な構成が考えられる。
【００８０】
図１３は、２つのポートを持つメモリに対してバブルソートを実現する構成を示したブロック図である。アドレス生成器とメモリとの間にセレクタを挟むことにより、読み出しフェーズと書き込みフェーズの切り替えを可能にしている。読み出しフェーズと書き込みフェーズとは同じコンフィギュレーションとし、時分割制御が行われる。これを実行するためには、書き込みデータの入力タイミングと書き込みフェーズのタイミングを合わせる必要がある。
【００８１】
図１２の構成との違いは、アドレス生成器１０１０およびアドレス生成器１０２０と、メモリ１０５０との間にセレクタ１０８０が挿入され、アドレス生成器１０３０およびアドレス生成器１０４０と、メモリ１０６０との間にセレクタ１０９０が挿入されている点である。セレクタ１０８０およびセレクタ１０９０は、読み出しフェーズのときはアドレス生成器１０１０とアドレス生成器１０３０をそれぞれ選択し、書き込みフェーズのときはアドレス生成器１０２０とアドレス生成器１０４０をそれぞれ選択する。
【００８２】
セレクタ１０８０およびセレクタ１０９０により、メモリ１０５０およびメモリ１０６０の読み出し／書き込みポートが４つではなく２つの場合でもアドレス生成器を用いたバブルソートを実行することができる。大半の処理は図１２と同じだが、読み出し／書き込みポートが２つになる部分での処理の違いがある。
【００８３】
図１２では、アドレス生成器１０１０は読み出しアドレス１０１１およびアドレストークン１０１２を、アドレス生成器１０２０は書き込みアドレス１０２１およびアドレストークン１０２２を、メモリ１０５０にそのまま書き込むが、図１３の場合はセレクタ１０８０が上述の信号の入力を一旦受け、アドレス１０８１およびアドレストークン１０８２としてメモリ１０５０への出力を行う。
【００８４】
セレクタ１０９０も同様に、アドレス生成器１０３０からの読み出しアドレス１０３１およびアドレストークン１０３２を、アドレス生成器１０４０は書き込みアドレス１０４１およびアドレストークン１０４２を、一旦入力してアドレス１０９１およびアドレストークン１０９２としてメモリ１０６０への出力を行う。メモリ１０５０およびメモリ１０６０への出力が行われた後の処理は図１２の場合と同じであるので説明は省略する。
【００８５】
図１４は、バブルソートにおいてフェーズの切り替えを行う場合の、タイミングチャートを示す。図１４のタイミングチャートについて、図１３および図１３で用いられる図１２の構成を用いて説明する。最初のフェーズで、アドレス生成器１０１０およびアドレス生成器１０３０が読み出しアドレスおよびアドレストークンを出力するとともに、メモリ１０５０およびメモリ１０６０が、読み出しアドレス１０１１、１０３１およびアドレストークン１０１２、１０３２の入力を受ける。
【００８６】
次のフェーズで、メモリ１０５０およびメモリ１０６０は、読み出しデータ１０５１、１０６１およびデータトークン１０５２、１０６２の出力を行い、一方セレクタ１０８０およびセレクタ１０９０は読み出しフェーズから書き込みフェーズに移行して、アドレス生成器１０２０およびアドレス生成器１０４０が書き込みアドレス１０２１、１０４１およびアドレストークン１０２２、１０４２を出力するとともに、メモリ１０５０およびメモリ１０６０が、書き込みアドレス１０２１、１０４１およびアドレストークン１０２２、１０４２の入力を受ける。
【００８７】
以上のように読み出しフェーズと書き込みフェーズの切り替えを交互に行うことにより、２つのポートを持つメモリを使用する場合であってもバブルソートを実行することができる。もしメモリとして１ＲＷメモリを用いる場合、同様に４：１セレクタを用いて、４つのフェーズを管理することによって実現することができる。
【００８８】
以上の構成により、メモリへのアドレス生成に当たり、専用のハードウェアをメモリポート対応として実装し、その動作設定を各種のパラメータ、設定値を用いて行うことにより、高速なアドレス生成を行うことができる。これにより、演算に必要なデータの高速な読み出しが可能になり、または演算結果を高速にメモリ格納することが可能になるので、全体としての処理能力の向上を図ることができる。
【００８９】
（付記１）複数のＡＬＵ（Ａｒｉｔｈｍｅｔｉｃ  ａｎｄ  Ｌｏｇｉｃ  Ｕｎｉｔ）を有するＡＬＵモジュールを複数接続する接続構成を切り替えながら所定の演算処理を実行するプロセッサに設けられるアドレス生成器において、
前記ＡＬＵモジュールに設けられた複数のメモリにそれぞれ対応して複数設けられ、前記接続構成の切り替えごとに前記メモリから読み出すデータ、あるいは書き込むデータのアドレスを生成するアドレス生成手段を備えたことを特徴とするアドレス生成器。
【００９０】
（付記２）前記アドレス生成手段は、アドレスカウンタを有し、
前記アドレスカウンタは、前記接続構成の切り替えを制御するシーケンサからの外部入力に基づいて、アドレスの初期値と、増加あるいは減少させるアドレスのインクリメント値と、アドレス生成の回数と、アドレス生成のモードと、を設定することを特徴とする付記１に記載のアドレス生成器。
【００９１】
（付記３）前記アドレスカウンタは、前記シーケンサによる起動要求後は、自律的に更新したアドレスを生成し、出力するデータの有効性を示すトークンビットを当該データに付与する自律更新モードと、
前記シーケンサからの起動要求後に、データの有効性を示すトークンビットの入力ごとにアドレスの更新を行い、入力された当該トークンビットの入力に基づいて、出力するデータの有効性を示すトークンビットを当該データに付与するトークン更新モードと、
のうちいずれか一つのモードを選択可能なことを特徴とする付記２に記載のアドレス生成器。
【００９２】
（付記４）前記アドレスカウンタは、クロック信号の入力タイミングに基づいてアドレスをインクリメントすることを特徴とする付記２に記載のアドレス生成器。
【００９３】
（付記５）前記アドレスカウンタは、加算される前記所定のインクリメント値を設定する増分設定手段をそれぞれ備えることを特徴とする付記２に記載のアドレス生成器。
【００９４】
（付記６）前記アドレスカウンタは、前記ＡＬＵモジュールによって演算されたアドレスを設定可能なことを特徴とする付記２に記載のアドレス生成器。
【００９５】
（付記７）前記アドレスの初期値の設定を前記シーケンサから受け付けるか否かを設定するロード受付設定手段を備えたことを特徴とする付記２に記載のアドレス生成器。
【００９６】
（付記８）前記アドレスカウンタは、モード切替手段をさらに備え、前記モード切替手段が外部演算モードを備える場合、前記所定のインクリメント値の加算を行わずに、外部から入力されたデータを保持して出力することを特徴とする付記２に記載のアドレス生成器。
【００９７】
（付記９）前記アドレスカウンタは、アドレスの更新時にアドレスを減らすことにより、アドレスの巻き戻しを行う巻き戻し手段を備えることを特徴とする付記２に記載のアドレス生成器。
【００９８】
（付記１０）前記アドレスカウンタは、前記アドレス生成の回数が所定の回数に達したときに所定のインクリメント値の更新を終了し、終了信号を前記シーケンサに出力することを特徴とする付記２に記載のアドレス生成器。
【００９９】
（付記１１）前記アドレスカウンタは、前記自律更新モードのときに、前記シーケンサからの外部入力に基づいて、前記アドレスを生成する間隔を設定する間隔設定手段を備えることを特徴とする付記３に記載のアドレス生成器。
【０１００】
（付記１２）前記増分設定手段により設定される前記所定のインクリメント値は２のべき乗であり、前記増分設定手段は、前記２のべき乗の指数として前記所定のインクリメント値を設定することを特徴とする付記５に記載のアドレス生成器。
【０１０１】
（付記１３）前記終了信号を出力するタイミングを遅延させる遅延手段をさらに備えることを特徴とする付記１０に記載のアドレス生成器。
【０１０２】
（付記１４）前記アドレス生成手段は、前記メモリに対する読み出しアドレスを出力する読み出しアドレス生成手段と、
前記メモリに対する書き込みアドレスを出力する書き込みアドレス生成手段と、を備え、
前記メモリからのデータの読み出し時には、前記読み出しアドレス生成手段を前記メモリに接続させ、前記メモリに対するデータの書き込み時には、前記書き込みアドレス生成手段を前記メモリに接続させるセレクタをさらに備えたことを特徴とする付記１〜１３のいずれか一つに記載のアドレス生成器。
【０１０３】
（付記１５）第１初期アドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第１アドレスを第１トークンとともに出力する第１アドレス生成器と、
前記第１トークンの受信に応答して、前記第１アドレスで指定されるデータを、第２トークンとともに出力する第１のメモリと、
前記第２トークンの受信に応答して、前記第１のメモリから出力されたデータに基づいて演算を行う演算器と、
第２初期アドレス値に所定のインクリメント値を加算することにより生成された第２アドレス値を第３トークンとともに出力する第２アドレス生成器と、
前記第３トークンの受信に応答して、前記演算器による演算結果を、前記第２のアドレス生成器で生成されたアドレスに書き込む第２のメモリと、
を備えることを特徴とする演算回路。
【０１０４】
（付記１６）前記演算器による演算結果を記憶するバッファをさらに備え、
前記第２のメモリは、前記バッファに書き込まれた前記演算結果を書き込むことを特徴とする付記１５に記載の演算回路。
【０１０５】
（付記１７）第１初期読み出しアドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第１読み出しアドレスを出力する第１読み出しアドレス生成器と、
第１初期書き込みアドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第１書き込みアドレスを出力する第１書き込みアドレス生成器と、
前記第１読み出しアドレス生成器と前記第１書き込みアドレス生成器のうち一方を選択し、いずれか一方からの入力を、第１アドレスとして出力する第１セレクタと、
前記第１セレクタから出力される第１データを入力する第１のメモリと、
第２初期読み出しアドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第２読み出しアドレスを出力する第２読み出しアドレス生成器と、
第２初期書き込みアドレス値に所定のインクリメント値を所定のタイミングで加算することにより生成された第２書き込みアドレスを出力する第２書き込みアドレス生成器と、
前記第２読み出しアドレス生成器と前記第２書き込みアドレス生成器から入力され、いずれか一方からの入力を、第２アドレスとして出力する第２セレクタと、
前記第２セレクタから出力される第２データを入力する第２のメモリと、
前記第１のメモリから前記第１データを、前記第２のメモリから前記第２データを入力し、両者をソートして、前記第１データおよび前記第２データを、ソート順に前記第１のメモリおよび前記第２のメモリに書き込むソート手段と、
を備えることを特徴とする演算回路。
【産業上の利用可能性】
【０１０６】
以上のように、本発明にかかるアドレス生成器および演算回路は、メモリに入力するアドレスの生成をハードウェアで行いたい場合に有用であり、特に、再構成可能なプロセッサで用いられるクラスタに適している。
【図面の簡単な説明】
【０１０７】
【図１】本発明にかかる再構成型プロセッサのクラスタの構成を示すブロック図である。
【図２】メモリ書き込みの基本構成を示すブロック図である。
【図３】メモリ読み出しの基本構成を示すブロック図である。
【図４】アドレス生成器を用いた演算回路の構成を示すブロック図である。
【図５】更新トリガを用いてアドレス生成器を自動更新する場合の構成を示すブロック図である。
【図６】自律更新モードにおいて、アドレス値を４回更新する場合を示すタイミングチャートである。
【図７】トークン更新モードにおいて、アドレス値を４回更新する場合を示すタイミングチャートである。
【図８】更新開始時刻を制御して演算を行い、出力を行う構成を示すブロック図である。
【図９】外部演算モードの場合のアドレス生成器のタイミングチャートである。
【図１０】パイプライン段数を２に設定した場合のタイミングチャートである。
【図１１】バブルソートのプログラムを示した図である。
【図１２】バブルソートを実行する場合にアドレス生成器をメモリのポートに接続した構成を示すブロック図である。
【図１３】２つのポートを持つメモリに対してバブルソートを実現する構成を示したブロック図である。
【図１４】バブルソートにおいてフェーズの切り替えを行う場合のタイミングチャートである。
【符号の説明】
【０１０８】
１０  クラスタ
１１  ＡＬＵブロック
１２  シーケンサ部
１３  ＡＬＵモジュール
１４  メモリ
１５  カウンタ
１６  コンパレータ
１７  バスブリッジ
１８  ネットワーク
１９  レジスタ
２０  セレクタ
１００，３００，３１０，３２０，４１０，８２０  アドレス生成器
１１０，２１０，３３０，３４０，３６０，４２０，８３０  メモリ
３５０  演算器
８１０  フリップフロップ
【図１】
2006018412.tif 000003
【図２】
2006018412.tif 000004
【図３】
2006018412.tif 000005
【図４】
2006018412.tif 000006
【図５】
2006018412.tif 000007
【図６】
2006018412.tif 000008
【図７】
2006018412.tif 000009
【図８】
2006018412.tif 000010
【図９】
2006018412.tif 000011
【図１０】
2006018412.tif 000012
【図１１】
2006018412.tif 000013
【図１２】
2006018412.tif 000014
【図１３】
2006018412.tif 000015
【図１４】
2006018412.tif 000016