(57)【要約】      （修正有）【課題】製造コストと消費電力を増大させることなく、しかも演算を効率よく行える半導体装置を提供する。【解決手段】サイクルごとに第１の演算を行い、前記第１の演算の結果を示す第１のデータと、第１のバリッド信号とを前記サイクルごとに出力する第１の演算エンジン１１Ａ〜Ｅと、前記サイクルごとに第２の演算を行い、前記第２の演算の結果を示す第２のデータと、第２のバリッド信号とを前記サイクルごとに出力する第２の演算エンジン１１Ａ〜Ｅと、前記演算エンジン１１Ａ〜Ｅ間で前記第１のデータ及び前記第２のデータを受け渡すために用いられ、前記第１のバリッド信号又は前記第２のバリッド信号が第１の値ならば、前記第１のデータ又は前記第２のデータの書込みが可能であり、前記第１のバリッド信号又は前記第２のバリッド信号が第２の値ならば、前記第１のデータ又は前記第２データの書込みを禁止する演算エンジン間バッファ１２とを具備する。【選択図】図１
2008242947.tif 000002
【特許請求の範囲】
【請求項１】
サイクルごとに第１の演算を行い、前記第１の演算の結果を示す第１のデータと、第１の値又は第２の値を示す第１のバリッド信号とを前記サイクルごとに出力する第１の演算エンジンと、
前記サイクルごとに第２の演算を行い、前記第２の演算の結果を示す第２のデータと、前記第１の値又は前記第２の値を示す第２のバリッド信号とを前記サイクルごとに出力する第２の演算エンジンと、
前記第１の演算エンジンと前記第２の演算エンジンの間で前記第１のデータ及び前記第２のデータを受け渡すために用いられ、前記第１のバリッド信号又は前記第２のバリッド信号が前記第１の値を示すならば、前記第１のデータ又は前記第２のデータの書込みが可能であり、前記第１のバリッド信号又は前記第２のバリッド信号が前記第２の値を示すならば、前記第１のデータ又は前記第２データの書込みを禁止する演算エンジン間バッファと、を具備する半導体装置。
【請求項２】
前記第１の演算エンジンは、
第１の設定ＩＤにより識別可能な第１の設定情報を記憶する第１の設定情報レジスタと、
前記サイクルごとに前記第１の設定ＩＤに従って前記第１の設定情報レジスタから前記第１の設定情報を読み出し、該第１の設定情報に従って設定を変更しながら前記第１の演算を行う第１の演算ユニットとを備え、
前記第２の演算エンジンは、
第２の設定ＩＤにより識別可能な第２の設定情報を記憶する第２の設定情報レジスタと、
前記サイクルごとに前記第２の設定ＩＤに従って前記第２の設定情報レジスタから前記第２の設定情報を読み出し、該第２の設定情報に従って設定を変更しながら前記第２の演算を行う第２の演算ユニットとを備える請求項１に記載の半導体装置。
【請求項３】
前記バリッド信号が前記第２の値を示すならば、前記第１の設定情報及び前記第１のデータが不変となるような制御を行う第１の制御回路と、
前記バリッド信号が前記第２の値を示すならば、前記第２の設定情報及び前記第２のデータが不変となるような制御を行う第２の制御回路と、を具備する請求項２に記載の半導体装置。
【請求項４】
前記第１の演算エンジンは、
前記第１のバリッド信号の値を決定するための第１のコードを記憶する第１の記憶部と、
前記第１のコードから前記第１のバリッド信号の値を求め、前記サイクルごとに出力する第１のコントローラと、を具備し、
前記第２の演算エンジンは、
前記第３のバリッド信号の値を決定するための第２のコードを記憶する第２の記憶部と、
前記第２のコードから前記第２のバリッド信号の値を求め、前記サイクルごとに出力する第２のコントローラと、を具備する請求項１に記載の半導体装置。
【請求項５】
前記第１の演算エンジンは、
第１の設定ＩＤにより識別可能な第１の設定情報を記憶する第１の設定情報レジスタと、
前記サイクルごとに前記第１の設定ＩＤに従って前記第１の設定情報レジスタから前記第１の設定情報を読み出し、該第１の設定情報に従って設定を変更しながら前記第１の演算を行う第１の演算ユニットとを備え、
前記第２の演算エンジンは、
第２の設定ＩＤにより識別可能な第２の設定情報を記憶する第２の設定情報レジスタと、
前記サイクルごとに前記第２の設定ＩＤに従って前記第２の設定情報レジスタから前記第２の設定情報を読み出し、該第２の設定情報に従って設定を変更しながら前記第２の演算を行う第２の演算ユニットとを備える請求項４に記載の半導体装置。
【請求項６】
前記第１のバリッド信号が前記第２の値を示すならば、前記第１の設定情報及び前記第１のデータが不変となるような制御を行う第１の制御回路と、
前記第２のバリッド信号が前記第２の値を示すならば、前記第２の設定情報及び前記第２のデータが不変となるような制御を行う第２の制御回路と、を具備する請求項５に記載の半導体装置。
【請求項７】
請求項４に記載の半導体装置に用いられる前記第１のコード及び前記第２のコードを生成するコンパイラであって、
前記第１の演算エンジンと前記第２の演算エンジンの間で受け渡される前記第１のデータ及び前記第２のデータの依存関係を示すデータ依存グラフから、前記サイクルごとに、前記第１の演算エンジン及び前記第２の演算エンジンのそれぞれが演算を行うか否かを決定する決定部と、
前記第１の演算エンジンが演算を行うならば、前記第１のコントローラに前記第１の値を出力させ、前記第１の演算エンジンが演算を行わないならば、前記第１のコントローラに前記第２の値を出力させるようなコードを前記第１のコードとして生成し、
前記第２の演算エンジンが演算を行うならば、前記第２のコントローラに前記第１の値を出力させ、前記第２の演算エンジンが演算を行わないならば、前記第２のコントローラに前記第２の値を出力させるようなコードを前記第２のコードとして生成するコード生成部と、を具備するコンパイラ。
【請求項８】
前記決定部は、ある演算への入力となるデータの一部が既に演算されており、該データの一部が前記演算エンジン間バッファに書き込まれているような演算を前記データ依存グラフから特定する特定部と、
前記特定部により特定された演算が優先して実行されるように前記第１の演算エンジン及び前記第２の演算エンジンのそれぞれの演算の順序を決めるスケジューリング部と、を具備する請求項７に記載のコンパイラ。
【請求項９】
請求項４に記載の半導体装置に用いられる前記第１のコード及び前記第２のコードを生成するコード生成方法あって、
決定部が、
前記第１の演算エンジンと前記第２の演算エンジンの間で受け渡される前記第１のデータ及び前記第２のデータの依存関係を示すデータ依存グラフから、前記サイクルごとに、前記第１の演算エンジン及び前記第２の演算エンジンのそれぞれが演算を行うか否かを決定するステップと、
コード生成部が、
前記第１の演算エンジンが演算を行うならば、前記第１のコントローラに前記第１の値を出力させ、前記第１の演算エンジンが演算を行わないならば、前記第１のコントローラに前記第２の値を出力させるようなコードを前記第１のコードとして生成し、前記第２の演算エンジンが演算を行うならば、前記第２のコントローラに前記第１の値を出力させ、前記第２の演算エンジンが演算を行わないならば、前記第２のコントローラに前記第２の値を出力させるようなコードを前記第２のコードとして生成するステップと、を具備するコード生成方法。
【請求項１０】
請求項４に記載の半導体装置に用いられる前記第１のコード及び前記第２のコードを生成するコード生成プログラムあって、
コンピュータに、
前記第１の演算エンジンと前記第２の演算エンジンの間で受け渡される前記第１のデータ及び前記第２のデータの依存関係を示すデータ依存グラフから、前記サイクルごとに、前記第１の演算エンジン及び前記第２の演算エンジンのそれぞれが演算を行うか否かを決定する手順と、
前記第１の演算エンジンが演算を行うならば、前記第１のコントローラに前記第１の値を出力させ、前記第１の演算エンジンが演算を行わないならば、前記第１のコントローラに前記第２の値を出力させるようなコードを前記第１のコードとして生成し、前記第２の演算エンジンが演算を行うならば、前記第２のコントローラに前記第１の値を出力させ、前記第２の演算エンジンが演算を行わないならば、前記第２のコントローラに前記第２の値を出力させるようなコードを前記第２のコードとして生成する手順とを実行させるためのコード生成プログラム。
【請求項１１】
第１の値又は第２の値を持つバリッドビットをサイクルごとに出力するコントローラと、
前記バリッドビットを記憶し、第１のサイクルにおいて前記バリッドビットを出力する第１の制御レジスタと、
第１のデータに演算を行って第２のデータを出力する第１の演算ユニットと、
前記第２のデータを記憶し、前記第１のサイクルにおいて前記第２のデータを出力する第１のデータレジスタと、
前記第１の制御レジスタから出力されたバリッドビットを記憶し、第２のサイクルにおいて前記バリッドビットを出力する第２の制御レジスタと、
前記第１のデータレジスタから出力された第２のデータに演算を行って第３のデータを出力する第２の演算ユニットと、
前記第３のデータを記憶し、前記第２のサイクルにおいて前記第３のデータを出力する第２のデータレジスタと、
前記第２の制御レジスタから出力されたバリッドビットが前記第１の値であるならば、前記第２のデータレジスタから出力された第３のデータの書込みが可能であり、前記第２の制御レジスタから出力されたバリッドビットが前記第２の値であるならば、前記第２のデータレジスタから出力された第３のデータの書込みを禁止するバッファと、を具備する半導体装置。
【請求項１２】
前記第１の演算ユニットは、第１の設定ＩＤにより識別可能な第１の設定情報を記憶する第１の設定情報レジスタを具備し、前記サイクルごとに前記第１の設定ＩＤに従って前記第１の設定情報レジスタから前記第１の設定情報を読み出し、該第１の設定情報に従って設定を変更しながら演算を行い、
前記第２の演算ユニットは、第２の設定ＩＤにより識別可能な第２の設定情報を記憶する第２の設定情報レジスタを具備し、前記サイクルごとに前記第２の設定ＩＤに従って前記第２の設定情報レジスタから前記第２の設定情報を読み出し、該第２の設定情報に従って設定を変更しながら演算を行う請求項１１に記載の半導体装置。
【請求項１３】
前記バリッドビットが前記第２の値を示すならば、前記第１の設定情報及び前記第２のデータが不変となるような制御を行う第１の制御回路と、
前記バリッドビットが前記第２の値を示すならば、前記第２の設定情報及び前記第３のデータが不変となるような制御を行う第２の制御回路と、を具備する請求項１２に記載の半導体装置。
【請求項１４】
前記バリッドビットの値を決定するためのコードを記憶する記憶部と、
前記コードから前記バリッドビットの値を求め、前記サイクルごとに出力するコントローラと、を具備する請求項１１に記載の半導体装置。
【請求項１５】
前記第１の演算ユニットは、第１の設定ＩＤにより識別可能な第１の設定情報を記憶する第１の設定情報レジスタを具備し、前記サイクルごとに前記第１の設定ＩＤに従って前記第１の設定情報レジスタから前記第１の設定情報を読み出し、該第１の設定情報に従って設定を変更しながら前記第１の演算を行い、
前記第２の演算ユニットは、第２の設定ＩＤにより識別可能な第２の設定情報を記憶する第２の設定情報レジスタを具備し、前記サイクルごとに前記第２の設定ＩＤに従って前記第２の設定情報レジスタから前記第２の設定情報を読み出し、該第２の設定情報に従って設定を変更しながら前記第２の演算を行う請求項１４に記載の半導体装置。
【請求項１６】
前記バリッドビットが前記第２の値を示すならば、前記第１の設定情報及び前記第１のデータが不変となるような制御を行う第１の制御回路と、
前記バリッドビットが前記第２の値を示すならば、前記第２の設定情報及び前記第２のデータが不変となるような制御を行う第２の制御回路と、を具備する請求項１５に記載の半導体装置。
【請求項１７】
第１の設定ＩＤにより識別可能な第１の設定情報を記憶する第１の設定情報レジスタと、
サイクルごとに前記第１の設定ＩＤに従って前記第１の設定情報レジスタから前記第１の設定情報を読み出し、該第１の設定情報に従って設定を変更しながら第１の演算を行い、前記第１の演算の結果を示す第１のデータと、第１の値又は第２の値を示す第１のバリッド信号とを前記サイクルごとに出力する第１の演算エンジンと、
第２の設定ＩＤにより識別可能な第２の設定情報を記憶する第２の設定情報レジスタと、
サイクルごとに前記第２の設定ＩＤに従って前記第２の設定情報レジスタから前記第２の設定情報を読み出し、該第２の設定情報に従って設定を変更しながら第２の演算を行い、前記第２の演算の結果を示す第２のデータと、第１の値又は第２の値を示す第２のバリッド信号とを前記サイクルごとに出力する第２の演算エンジンと、
前記第１の演算エンジンと前記第２の演算エンジンの間で前記第１のデータ及び前記第２のデータを受け渡すために用いられ、前記第１のバリッド信号又は前記第２のバリッド信号が前記第１の値を示すならば、前記第１のデータ又は前記第２のデータの書込みが可能であり、前記第１のバリッド信号又は前記第２のバリッド信号が前記第２の値を示すならば、前記第１のデータ又は前記第２データの書込みを禁止する演算エンジン間バッファと、を具備するリコンフィギュアラブルデバイス。
【請求項１８】
前記第１の演算エンジンは、
前記第１のバリッド信号の値を決定するための第１のコードを記憶する第１の記憶部と、
前記第１のコードから前記第１のバリッド信号の値を求め、前記サイクルごとに出力する第１のコントローラと、を具備し、
前記第２の演算エンジンは、
前記第３のバリッド信号の値を決定するための第２のコードを記憶する第２の記憶部と、
前記第２のコードから前記第２のバリッド信号の値を求め、前記サイクルごとに出力する第２のコントローラと、を具備する請求項１７に記載のリコンフィギュアラブルデバイス。
【請求項１９】
前記第１の演算エンジンは、
第１の設定ＩＤにより識別可能な第１の設定情報を記憶する第１の設定情報レジスタと、
前記サイクルごとに前記第１の設定ＩＤに従って前記第１の設定情報レジスタから前記第１の設定情報を読み出し、該第１の設定情報に従って設定を変更しながら前記第１の演算を行う第１の演算ユニットとを備え、
前記第２の演算エンジンは、
第２の設定ＩＤにより識別可能な第２の設定情報を記憶する第２の設定情報レジスタと、
前記サイクルごとに前記第２の設定ＩＤに従って前記第２の設定情報レジスタから前記第２の設定情報を読み出し、該第２の設定情報に従って設定を変更しながら前記第２の演算を行う第２の演算ユニットとを備える請求項１７に記載のリコンフィギュアラブルデバイス。
【請求項２０】
前記第１のバリッド信号が前記第２の値を示すならば、前記第１の設定情報及び前記第１のデータが不変となるような制御を行う第１の制御回路と、
前記第２のバリッド信号が前記第２の値を示すならば、前記第２の設定情報及び前記第２のデータが不変となるような制御を行う第２の制御回路と、を具備する請求項１９に記載のリコンフィギュアラブルデバイス。
【請求項２１】
請求項１８に記載のリコンフィギュアラブルデバイスに用いられる前記第１のコード及び前記第２のコードを生成するコンパイラであって、
前記第１の演算エンジンと前記第２の演算エンジンの間で受け渡される前記第１のデータ及び前記第２のデータの依存関係を示すデータ依存グラフから、前記サイクルごとに、前記第１の演算エンジン及び前記第２の演算エンジンのそれぞれが演算を行うか否かを決定する決定部と、
前記第１の演算エンジンが演算を行うならば、前記第１のコントローラに前記第１の値を出力させ、前記第１の演算エンジンが演算を行わないならば、前記第１のコントローラに前記第２の値を出力させるようなコードを前記第１のコードとして生成し、
前記第２の演算エンジンが演算を行うならば、前記第２のコントローラに前記第１の値を出力させ、前記第２の演算エンジンが演算を行わないならば、前記第２のコントローラに前記第２の値を出力させるようなコードを前記第２のコードとして生成するコード生成部と、を具備するコンパイラ。
【請求項２２】
前記決定部は、ある演算への入力となるデータの一部が既に演算されており、該データの一部が前記演算エンジン間バッファに書き込まれているような演算を前記データ依存グラフから特定する特定部と、
前記特定部により特定された演算が優先して実行されるように前記第１の演算エンジン及び前記第２の演算エンジンのそれぞれの演算の順序を決めるスケジューリング部と、を具備する請求項２１に記載のコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動的リコンフィギュラブル回路技術を用いた半導体装置に関する。
【背景技術】
【０００２】
近年、低コスト・低消費電力が求められる携帯機器においても機能の複雑化、多様化が進んでおり、高い性能が必要とされてきている。高性能と低消費電力を両立させるためには専用ハードウェアの開発が不可避であるが、その開発費と製造費は年々増大している。これらを削減するものとして、動的リコンフィギュラブル回路技術を用いた半導体装置が注目されている（例えば、非特許文献１参照。）。
【０００３】
動的リコンフィギュラブル回路技術を用いた半導体装置はソフトウェアなどで与えられる命令に従って演算を行う通常のプロセッサと同様の装置であるが、次の点で通常のプロセッサとは相違している。すなわち、動的リコンフィギュラブル回路技術を用いた半導体装置は、その動作時に、命令に対応する演算器の設定を記憶装置から読み出して変更できる。記憶装置の内容は動的に書き換え可能であり、記憶装置に蓄える演算器の設定を半導体装置の使用状況に応じて動的に適宜書き換えることにより、一つの命令で多様な演算を行わせることができる。このように、命令と演算器の設定との対応関係を動的に変えられる点で通常のプロセッサとは相違している。
【０００４】
命令と演算器の設定を動的に変更できない通常のプロセッサでは、演算器の異なる設定が異なる命令に対応するよう演算器の設定を符号化し、これを「命令」としている。性能向上のために、演算器により実現することが可能な設定の種類を増やすと、命令のビット幅は増大し、命令を蓄えるのに必要なメモリなどの記憶装置のサイズも増大する。その結果、製造コストが増大するとともに、符号化された演算器の設定を命令から復号する際に消費される電力量も増大する。
【０００５】
一方、動的リコンフィギュラブル回路技術を用いた半導体装置では、命令と演算器の設定との対応を動的に変更できる。演算器の設定を変化させるために必要な命令のビット幅は、演算器で実現可能な設定の種類が増大してもさほど増えることはない。
【０００６】
したがって、動的リコンフィギュラブル回路技術を用いた半導体装置は、同等の演算処理性能を有する通常のプロセッサなどの半導体装置と比べて、製造コストおよび消費電力の点で有利であるとされる。
【０００７】
動的リコンフィギュラブル回路技術を用いた半導体装置の性能をより高くするためには、そのような半導体装置に複数の演算器を持たせ、それら演算器の設定変更をそれぞれ独立に制御できることが必要である。また、演算を終えたデータの受け渡しが演算器の間で可能であり、かつそのデータ受け渡しのための設定変更が行えることも必要である。
【０００８】
このような半導体装置では、一つの演算処理を複数の演算器を用いて流れ作業式に行っている場合において、ある演算器がその演算結果を別の演算器に渡そうとした際に、その演算結果を受け取る側の演算器ではまだ受け取りの準備ができていない状況が起こり得る。そのような場合には、演算結果を渡そうとする演算器の処理を停止するとともに、流れ作業において停止する演算器よりも前の作業を行っている全ての演算器の処理も停止する必要がある。この停止処理のことをパイプラインインターロック処理と呼ぶ。
【０００９】
従来の動的リコンフィギュラブル回路技術を用いた半導体装置では、パイプラインインターロック機構は実現されていない。このため演算器の数や演算器間でのデータ受け渡しに用いるバッファの数を多くしておき、複雑な演算処理が発生してもパイプラインインターロック処理が必要となる事態があまり生じないようにしている。パイプラインインターロック処理の発生が避けられないようなさらに複雑な演算処理については、これを複数の演算処理に分割して逐次実行するようにしている。
【非特許文献１】「リコンフィギュラブルシステム」、オーム社、ページ１４１−２０８
【発明の開示】
【発明が解決しようとする課題】
【００１０】
パイプラインインターロック機構が実現されていないことから、従来の動的リコンフィギュラブル回路技術を用いた半導体装置には、パイプラインインターロック処理回避のために演算器の数やバッファの数を多くすることによる製造コストの増大という問題点がある。
【００１１】
また、パイプラインインターロック処理回避のために複雑な演算処理を複数の演算処理に分割して逐次実行すると、演算を効率よく行えない。
【００１２】
複雑な演算処理をパイプラインインターロック処理が必要とならない演算処理に変更する方法として、データの受け渡しを行う演算器が演算処理とは関係のない無駄な演算を実行し、これによりデータ受け渡しのタイミングを調整することが考えられる。しかしながら、この方法では無駄な演算の実行に伴う消費電力の増大が問題となるため、低消費電力が求められる機器に搭載される動的リコンフィギュラブル回路技術を用いた半導体装置では採用されていない。
【００１３】
本発明は以上に鑑みてなされたものであり、製造コストおよび消費電力を増大させることなく、しかも演算を効率よく行える半導体装置を提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明の一観点に係る半導体装置は、サイクルごとに第１の演算を行い、前記第１の演算の結果を示す第１のデータと、第１の値又は第２の値を示す第１のバリッド信号とを前記サイクルごとに出力する第１の演算エンジンと、前記サイクルごとに第２の演算を行い、前記第２の演算の結果を示す第２のデータと、前記第１の値又は前記第２の値を示す第２のバリッド信号とを前記サイクルごとに出力する第２の演算エンジンと、前記第１の演算エンジンと前記第２の演算エンジンの間で前記第１のデータ及び前記第２のデータを受け渡すために用いられ、前記第１のバリッド信号又は前記第２のバリッド信号が前記第１の値を示すならば、前記第１のデータ又は前記第２のデータの書込みが可能であり、前記第１のバリッド信号又は前記第２のバリッド信号が前記第２の値を示すならば、前記第１のデータ又は前記第２データの書込みを禁止する演算エンジン間バッファと、を具備する。
【発明の効果】
【００１５】
本発明によれば、製造コストおよび消費電力を増大させることなく、しかも演算を効率よく行える半導体装置を提供できる。
【発明を実施するための最良の形態】
【００１６】
一実施の形態に係る半導体装置１を図１に示す。半導体装置１は、プロセッサなどの外部装置からの指示によりデータ処理を行うリコンフィギュアラブルデバイスであって、５つの演算エンジン１１Ａ〜Ｅと、演算エンジン間バッファ１２と、コードメモリ１３と、コード転送制御装置１４と、データメモリ１５を有している。なお、ここでいうデータ処理とは、演算エンジン１１Ａ〜Ｅによって個々の演算が行われたことによる一連の演算の総称である。
【００１７】
コードメモリ１３は演算エンジン１１Ａ〜Ｅとコード転送制御装置１４に接続する。データメモリ１５は演算エンジン１１Ａの入力に接続し、演算エンジン１１Ｅの出力に接続する。演算エンジン間バッファ１２は演算エンジン１１Ｂ〜Ｅの入力に接続し、演算エンジン１１Ａ〜Ｄの出力に接続する。
【００１８】
演算エンジン１１Ａ〜Ｅは、演算の設定を動的に変更することが可能なデータ処理エンジンである。演算エンジン１１Ａ〜Ｅは、データ処理の開始前にコードメモリ１３から転送されるコードに従って設定を変更しながら、演算エンジン１１Ａ〜Ｅに入力されるデータに対して演算を行い、演算の結果を示すデータをＶａｌｉｄ（バリッド）信号とともに演算エンジン間バッファ１２に対して出力する。
【００１９】
演算エンジン間バッファの詳細な構成を図２に示す。演算エンジン間バッファ１２は８つのデータレジスタ１２０Ａ〜Ｈを有し、演算エンジン間のデータ受け渡しに使用される。演算エンジン１１Ａ〜Ｅはコードに従ってデータレジスタ１２０Ａ〜Ｈの中から一つを選択して、読み出しおよび書き込みに用いる。ただし、演算エンジン間バッファ１２への書き込みの際には、演算エンジン１１Ａ〜ＤからのＶａｌｉｄ信号が０の場合には書き込みは行われない。
【００２０】
コードメモリ１３には演算エンジン１１Ａ〜Ｅが使用するコードが保存される。プロセッサなどは、半導体装置１がデータ処理を開始する前に主記憶装置からコードメモリ１３にコードを転送しておく。
【００２１】
コード転送制御装置１４は、プロセッサなどによりコードの転送完了通知を受けた後に、コードメモリ１３からコードを順に読み出し、それらを演算エンジン１１Ａ〜Ｅにそれぞれ転送する機能を有する。
【００２２】
データメモリ１５は、半導体装置１がデータ処理の開始時に与えるデータや、半導体装置１によるデータ処理の中間結果または最終結果を一時的に保持するものである。また、データメモリ１５には、データ処理の開始前にプロセッサなどの外部装置により初期の入力データが書き込まれる。半導体装置１は、データメモリ１５に保持されたデータ処理の中間結果を再び入力データとしてデータ処理を続けることもできる。データメモリ１５に保持された最終結果は、プロセッサなどの外部装置によりデータメモリ１５から読み出され、主記憶装置に書き込まれる。
【００２３】
なお、本実施形態では演算エンジン１１Ａ〜Ｅの数を５つとし、データレジスタ１２０Ａ〜Ｈの数を８つとしているが、半導体装置１に必要とされる処理能力に応じてこれらの数を変更してもよい。
【００２４】
演算エンジン１１Ａの詳細な構成を図３に示す。演算エンジン１１Ａは、入力コントローラ１１０と、演算ユニット１１３Ａ〜Ｅと、データパイプラインレジスタ１１４Ａ〜Ｅと、制御パイプラインレジスタ１１５Ａ〜Ｅと、出力コントローラ１１６と、最終コンテキストＩＤラッチ１１７と、マルチプレクサ１１８を有する。
【００２５】
入力コントローラ１１０、演算ユニット１１３Ａ〜Ｅ、および出力コントローラ１１６はコードメモリ１３とコード転送制御装置１１４に接続する。コードメモリ１３から演算エンジン１１Ａ〜Ｅにそれぞれ送られるコードは、コード転送制御装置１１４から同時に送られるタグの値に従い、入力コントローラ１１０、演算ユニット１１３Ａ〜Ｅ、出力コントローラ１１６の内部の記憶部に、それぞれで用いられる部分ごとに分割して格納される。
【００２６】
入力コントローラ１１０は、データメモリ１５にも接続する。入力コントローラ１１０は、内部の記憶部に格納されるコードを順に解釈して、入力データの参照位置を表す入力Ａ選択信号、入力Ｂ選択信号を出力し、データメモリ１５からデータを読み出す。
【００２７】
また入力コントローラ１１０は、制御パイプラインレジスタ１１５Ａと、マルチプレクサ１１８にも接続し、同じコードを順に解釈して、コンテキストＩＤとＶａｌｉｄビットを出力する。この際、マルチプレクサ１１８は、Ｖａｌｉｄビットが１の場合は入力コントローラ１１０が出力するコンテキストＩＤの値を選び、Ｖａｌｉｄビットが０の場合は最終コンテキストＩＤラッチ１１７にセットされる値を選ぶ。この値はＶａｌｉｄビットとともに制御パイプラインレジスタ１１５Ａにセットされる。またマルチプレクサ１１８により選択された値は最終コンテキストＩＤラッチ１１７にもセットされる。最終コンテキストＩＤラッチ１１７はデータ処理の開始時には０とする。
【００２８】
制御パイプラインレジスタ１１５Ａ〜Ｄはそれぞれ制御パイプラインレジスタ１１５Ｂ〜Ｅに接続し、制御パイプラインレジスタ１１５Ｅは出力コントローラ１１６に接続することにより、演算ユニット１１３Ａ〜Ｅの動作を制御するためのパイプラインを構成している。そのため、あるサイクルに入力コントローラ１１０が制御パイプラインレジスタ１１５ＡにセットしたコンテキストＩＤおよびＶａｌｉｄビットの値は、その次のサイクルから１サイクルごとに制御パイプラインレジスタ１１５Ｂ〜Ｅ、出力コントローラ１６へと順に転送される。このような転送をパイプライン式転送という。
【００２９】
演算ユニット１１３Ａ〜Ｅはそれぞれ制御パイプラインレジスタ１１５Ａ〜Ｅに接続する。また、演算ユニット１１３Ａ〜Ｄの出力は、それぞれデータパイプラインレジスタ１１４Ａ〜Ｄを介して演算ユニット１１３Ｂ〜Ｅの入力に接続することで、データを演算するためのデータパイプラインを構成している。なお、演算ユニット１１３Ａの入力は、データメモリ１５に接続する。さらに、演算ユニット１１３Ｅの出力はデータパイプラインレジスタ１１４Ｄを介して、演算エンジン間バッファ１２に接続する。
【００３０】
演算ユニット１１３Ａ〜Ｅは、演算の設定を変更可能であって、サイクルごとにそれぞれ制御パイプラインレジスタ１１５Ａ〜ＥにセットされるコンテキストＩＤをアドレスとして内部の記憶部からコードを読み出し、そのコードにより選ばれた一つの設定情報に従って演算の設定を変更する。そして、そのサイクルに入力Ａデータ信号、入力Ｂデータ信号にセットされるデータに対し、変更後の設定に従って演算を行い、その演算結果をそれぞれデータパイプラインレジスタ１１４Ａ〜Ｅに書き込む。ただし、制御パイプラインレジスタ１１５Ａ〜ＥにセットされるＶａｌｉｄビットが０の場合には、演算結果はデータパイプラインレジスタ１１４Ａ〜Ｅには書き込まれない。
【００３１】
このように、演算エンジン１１においては、入力コントローラ１１０から出力されるＶａｌｉｄビットが０の場合には、最終コンテキストＩＤラッチ１１７に保存されているコンテキストＩＤが示す設定情報が演算ユニット１１３の設定として用いられるため、Ｖａｌｉｄビットが０である間は、演算ユニット１１３の設定は変化しない。また、データパイプラインレジスタ１１４の値も、Ｖａｌｉｄビットが０の間は変化しないため、それを入力として演算を行う演算ユニット１１３の出力結果もまた変化しない。このように、半導体装置１ではＶａｌｉｄビットが０である際に生じる信号線の変化を少なくすることで、演算ユニット１１３およびデータパイプラインレジスタ１１４で消費する電力についてもパイプラインインターロックを用いない従来の動的リコンフィギュラブル回路より小さくなる。
【００３２】
出力コントローラ１１６は、演算エンジン間バッファ１２に接続する。出力コントローラ１１６は、制御パイプラインレジスタ１１５Ｅが出力するコンテキストＩＤをアドレスとして内部の記憶部からコードを読み出し、そのコードに従ってデータの出力位置を示す出力選択信号を出力する。また、制御パイプラインレジスタ１１５ＥにセットされているＶａｌｉｄビットをそのままＶａｌｉｄ信号として出力する。
【００３３】
演算エンジン１１Ｂ〜Ｅは、半導体装置１を構成する他の装置との接続関係が演算エンジン１１Ａと異なるが、内部の構成は演算エンジン１１Ａと同様である。演算エンジン１１Ｂ〜Ｅが有する入力コントローラ１１０と演算ユニット１１３Ａは、演算エンジン間バッファ１２に接続している。また演算エンジン１１Ｅが有する出力コントローラ１１６とデータパイプラインレジスタ１１４Ｅは、データメモリ１５に接続している。
【００３４】
なお、演算エンジン１１Ａ〜Ｅの演算ユニット１１３の数は５つであるとしたが、半導体装置１に必要とされる処理能力に応じて変更してもよい。また、演算ユニット１１３の数は演算エンジン１１Ａ〜Ｅごとに異なっていてもよい。
【００３５】
次に、半導体装置１における処理の開始から終了までの流れを説明する。半導体装置１の処理は、データ処理前の初期化処理とデータ処理の２つに大別できる。
【００３６】
まず、初期化処理について説明する。
【００３７】
プロセッサなどの外部装置は、半導体装置１への入力データをデータメモリ１５に格納し、演算エンジン１１Ａ〜Ｅの動作を規定するコードをコードメモリ１３に格納する。
【００３８】
プロセッサなどの外部装置はコードメモリ１３へのコードの格納が完了すると、半導体装置１にコード転送の完了をパルス信号により通知する。コード転送制御装置１４は、半導体装置１からコード転送の完了通知を受けると、コードメモリ１３からコードを順に読み出し、それらを、格納先を示すタグとともに演算エンジン１１Ａ〜Ｅのそれぞれに転送する。
【００３９】
演算エンジン１１Ａ〜１１Ｅに転送されたコードは、入力コントローラ１１０、演算ユニット１１３Ａ〜Ｅ、出力コントローラ１１６の内部の記憶部に、それぞれで用いられる部分ごとに分割して格納される。
【００４０】
コード転送制御装置１４は、演算エンジン１１Ａ〜Ｅへのコードの転送を完了すると、プロセッサなどの外部装置に演算準備の完了を通知する。
【００４１】
プロセッサなどの外部装置は、演算準備の完了通知を受けた後に、半導体装置１にデータ処理の開始をパルス信号により通知する。
【００４２】
次に、データ処理について説明する。
【００４３】
入力コントローラ１１０は、内部の記憶部に格納されたコードをサイクルごとに解釈し、そのコードに従ってコンテキストＩＤとＶａｌｉｄビットをサイクルごとに出力する。そして、前述の通りＶａｌｉｄビットに従って入力コントローラ１１０が出力するコンテキストＩＤと、最終コンテキストＩＤラッチ１１７に格納されるコンテキストＩＤのいずれか一方が選択され、そのコンテキストＩＤがＶａｌｉｄビットとともに演算ユニット１１３Ａ〜Ｅおよび出力コントローラ１１６にパイプライン式に転送される。また、入力コントローラ１１０は、上記コードに従って、サイクルごとに入力Ａ選択信号、入力Ｂ選択信号を出力する。
【００４４】
データメモリ１５および演算エンジン間バッファ１２は、サイクルごとに演算エンジン１１Ａ〜Ｅの入力コントローラ１１０が出力する入力Ａ選択信号、入力Ｂ選択信号に従ってデータを読み出し、演算エンジン１１Ａ〜Ｅの演算ユニット１１３Ａの入力Ａデータ信号、入力Ｂデータ信号にそのデータをセットする。
【００４５】
演算ユニット１１３Ａ〜Ｅは、サイクルごとにコンテキストＩＤをアドレスとして内部の記憶部からコードを読み出し、そのコードにより選ばれた一つの設定情報に従って演算の設定を変更する。そして、そのサイクルに入力Ａデータ信号、入力Ｂデータ信号にセットされるデータに対し、変更後の設定に従って演算を行う。演算結果は、データパイプラインレジスタ１１４Ａ〜Ｅを介してデータメモリ１５または演算エンジン間バッファ１２にパイプライン式に転送される。ただし、Ｖａｌｉｄビットが０の場合には演算結果はデータパイプラインレジスタ１１４Ａ〜Ｅには書き込まれない。
【００４６】
出力コントローラ１１６は、サイクルごとに、コンテキストＩＤをアドレスとして内部の記憶部からコードを読み出し、そのコードに従ってデータの出力位置を示す出力選択信号を出力する。また、制御パイプラインレジスタ１１５ＥにセットされているＶａｌｉｄビットをそのままＶａｌｉｄ信号として出力する。
【００４７】
データメモリ１５および演算エンジン間バッファ１２は、サイクルごとに出力選択信号により指定される場所に、データパイプラインレジスタ１１４Ｅにセットされた値を書き込む。ただし、この書き込みはＶａｌｉｄ信号が１の場合にのみ行われ、Ｖａｌｉｄ信号が０の場合には書き込みは行われない。
【００４８】
演算エンジン１１Ａ〜１１Ｅの入力コントローラ１１０が全てのコードを解釈し終えた時点で、半導体装置１はプロセッサなどの外部装置にデータ処理の完了を通知する。以上によりデータ処理は終了する。
【００４９】
プロセッサなどの外部装置はデータ処理の完了通知を受けてから規定サイクル以上が経過した後に、データメモリ１５に蓄えられた半導体装置１の演算結果を読み出す。この規定サイクルは、最後にコードを解釈し終えた演算エンジン１１が備える演算ユニット１１３の数と、データメモリ１５へのデータ書き込みに要するサイクル数を加えたサイクル数になる。
【００５０】
次に、以上のような半導体装置１におけるデータ処理を実現する、データレジスタ１２０、コード転送制御ユニット１４、演算ユニット１１３、出力コントローラ１１６および入力コントローラ１１０について詳細に説明する。
【００５１】
データレジスタ１２０の実現例を図４に示す。データレジスタ１２０は、データラッチ１２００とＡＮＤロジック１２０１Ａ〜ＤとＯＲロジック１２０２とマルチプレクサ１２０３を有する。データはデータラッチ１２００に格納される。
【００５２】
ＡＮＤロジック１２０１Ａ〜Ｄは、それぞれ、デコーダＡ〜Ｄ出力とＶａｌｉｄＡ〜Ｄ信号のそれぞれのＡＮＤをＯＲロジック１２０２に入力する。これにより、演算エンジン１１Ａ〜Ｄの少なくとも一つからのＶａｌｉｄ信号が１であり、かつその出力選択信号がこのデータレジスタ１２０を選択する（即ちデコーダＡ〜Ｄ出力が１である）場合にのみ、ＯＲロジック１２０２は１を出力し、そうでない場合は０を出力する。ＯＲロジック１２０２からの出力信号はデータラッチ１２００のライトイネーブル信号として用いられる。このため、Ｖａｌｉｄ信号が０の場合にはデータレジスタ１２０にデータは書き込まれない。
【００５３】
マルチプレクサ１２０３は、ＶａｌｉｄＡ〜Ｄ信号が１の場合に、演算エンジン１１Ａ〜Ｄからの書き込みデータＡ〜Ｄを選択する。例えば、ＶａｌｉｄＡ信号が１の場合には、演算エンジン１１Ａからの書き込みデータＡを選択する。ＶａｌｉｄＢ信号が１の場合には、演算エンジン１１Ｂからの書き込みデータBを選択する。ＶａｌｉｄＣ〜Ｄ信号についても同様である。マルチプレクサ１２０３により選択されたデータはデータラッチ１２００に書き込まれる。ＶａｌｉｄＡ〜Ｄ信号が全て０の場合や、ＶａｌｉｄＡ〜Ｄ信号のうち２つ以上が１である場合の動作は未定義である。ただし、ＶａｌｉｄＡ〜Ｄ信号が全て０の場合には、前述の通りデータラッチ１２００にはデータは書き込まれない。
【００５４】
コード転送制御ユニット１４の実現例を図５に示す。コード転送制御ユニット１４は、メモリＩＤレジスタ１４０と、アドレスレジスタ１４１と、コードアドレスレジスタ１４２と、インクリメンタ１４３Ａ〜Ｃと、マルチプレクサ１４４Ａ〜Ｄと、Ｖａｌｉｄラッチ１４５と、比較器１４６を有する。
【００５５】
コードメモリ１３には、図６に示すように、演算エンジン１１Ａ〜Ｅが内部に有するコード格納用メモリの種類ごとに連続してコードが配置されているものとする。またコードの各々にはＥｎｄビットが付加されているものとする。Ｅｎｄビットの値は、メモリの種類ごとに連続するコードの最終に相当するコードの場合にのみ１となり、他のコードの場合は０となる。
【００５６】
このようなコードメモリ１３から演算エンジン１１Ａ〜１１Ｅに転送されるコードには、そのコードを格納するメモリの種類を示すメモリＩＤと、そのメモリのどの位置に格納するかを示すアドレスと、それが有効かを示すＶａｌｉｄビットとがコード転送制御ユニット１４により付加される。これらメモリＩＤ、アドレス、Ｖａｌｉｄビットの値は、それぞれメモリＩＤレジスタ１４０、アドレスレジスタ１４１、Ｖａｌｉｄラッチ１４５に格納される。なお、メモリＩＤ、アドレス、Ｖａｌｉｄビットの組をコードのタグと呼ぶ。
【００５７】
コードアドレスレジスタ１４２には、コードメモリ１３からコードを読み出す際に用いられるアドレスが格納される。
【００５８】
プロセッサなどの外部装置は、半導体装置１にコード転送の完了を通知する前に、データ処理に必要なコードが格納されているコードメモリ１３の先頭アドレスを、予め外部バスを介してコードアドレスレジスタ１４２に書き込んでおく。
【００５９】
半導体装置１がコード転送の完了通知を受けると、マルチプレクサ１４４Ａ〜Ｂにより初期値０が選択され、メモリＩＤレジスタ１４０およびアドレスレジスタ１４１に格納される。また、マルチプレクサ１４４Ｄにより１が選択されてＶａｌｉｄラッチ１４５にセットされる。
【００６０】
次のサイクルから、メモリＩＤレジスタ１４０、アドレスレジスタ１４１、Ｖａｌｉｄラッチ１４５の値が、コードメモリ１３から送られるコードに付加されて、演算エンジン１１Ａ〜Ｅに転送される。また、サイクルの終了時に、アドレスレジスタ１４１、コードアドレスレジスタ１４２の値が、インクリメンタ１４３Ｂ〜Ｃによりそれぞれ１増やされる。
【００６１】
コードメモリ１３からＥｎｄビットが１となるコードが転送されると、そのサイクルの終了時にはメモリＩＤレジスタ１４０の値がインクリメンタ１４３Ａにより１増やされ、またマルチプレクサ１４４Ｂにより０が選択されてアドレスレジスタ１４１の値は０にリセットされる。
【００６２】
以下、メモリＩＤレジスタ１４０の値が、有効なメモリＩＤの最大値＋１になるまで、同様の処理が繰り返される。メモリＩＤの値が有効なメモリＩＤの最大値＋１になると、Ｖａｌｉｄラッチ１４５に０がセットされ、演算エンジン１１Ａ〜Ｅへのコード転送は完了する。
【００６３】
演算ユニット１１３の実現例を図７に示す。演算ユニット１１３は、設定を動的に変更可能な演算器１１３０と、制御テーブルメモリ１１３１と、設定情報レジスタ１１３２Ａ〜Ｄと、マルチプレクサ１１３３を有する。
【００６４】
設定情報レジスタ１１３２Ａ〜Ｄには、データ処理において演算器１１３０で用いられる設定情報が保存されている。設定情報レジスタ１１３２の数は用途に応じて変更してよい。制御テーブルメモリ１１３１には、設定情報レジスタ１１３２Ａ〜Ｄの選択信号値がデータ処理で用いられるコンテキストＩＤの種類数分だけ、先頭から順に格納されている。
【００６５】
設定情報レジスタ１１３２Ａ〜Ｄおよび制御テーブルメモリ１１３１は、初期化においてコードメモリ１３から転送されるコードにより更新される。コード転送制御装置１４によりコードに付加されるＶａｌｉｄビットが１で、かつコードに付加されるメモリＩＤが、設定情報レジスタ１１３２Ａ〜Ｄ、制御テーブルメモリ１１３１を示すメモリＩＤと一致する場合に、メモリＩＤが一致する制御テーブルメモリ１１３１または設定情報レジスタ１１３２Ａ〜Ｄにコードが書き込まれる。制御テーブルメモリ１１３１にコードを書き込む場合には、コード転送制御装置１４によりコードに付加されるアドレスを書き込みアドレスとして用いる。
【００６６】
演算器１１３０の実現例を図８に示す。演算器１１３０は８ビットのＡＬＵとシフタをそれぞれ４つずつ備えており、３２ビットの２入力に対して、８ビット単位で異なる演算を行うよう設定できる。上述したように、演算器１１３０の設定は動的に変更可能である。この演算結果を３２ビットの出力の一つとする。また、演算器１１３０はクロスバーを備え、シフタからの８ビット出力４つの配置順を変更した結果を３２ビット出力の一つとする。
【００６７】
この例では、演算器１１３０の設定情報は８ビット演算あたり、ＡＬＵの入力の一つを直値とするかどうかを決める入力モードを１ビット、直値を８ビット、ＡＬＵ設定を２ビット、シフト値を３ビット、クロスバー設定を２ビットとする計１６ビットからなる。演算器１１３０全体では６４ビットの設定情報となる。
【００６８】
演算ユニット１１３０は、入力コントローラ１１０から送信されるコンテキストＩＤをアドレスとして制御テーブルメモリ１１３１から値を読み出し、その値をマルチプレクサ１１３３の選択信号として設定情報レジスタ１１３２Ａ〜Ｄの一つを選択し、そこから設定情報を読み出して演算器１１３０に適用する。これによりコンテキストＩＤごとに演算の設定を変えるという動作が実現される。
【００６９】
演算エンジン１１Ｅが有する出力コントローラ１１６の実現例を図９に示す。演算エンジン１１Ｅが有する出力コントローラ１１６は、ベースアドレスレジスタ１１６０Ａ〜Ｂと、制御テーブルメモリ１１６１と、加算器１１６２とマルチプレクサ１１６３を有する。
【００７０】
ベースアドレスレジスタ１１６０Ａ〜Ｂには、データメモリ１５への出力アドレスを計算する際に用いられるベースアドレスが格納される。ベースアドレスレジスタ１１６０の数は１以上の任意の数でよい。制御テーブルメモリ１１６１には、ベースアドレスレジスタ１１６０Ａ〜Ｂを選択するための選択信号値とオフセットとが対になって格納されている。ベースアドレスレジスタ１１６０Ａ〜Ｂと制御テーブルメモリ１１６１の初期設定は、演算ユニット１１３の設定情報メモリ１１３２の初期化と同様の手法で行われる。
【００７１】
演算エンジン１１Ｅが有する出力コントローラ１１６は、入力コントローラ１１０から送信されるコンテキストＩＤをアドレスとして制御テーブルメモリ１１６１を参照し、アドレス計算に用いるベースアドレスが格納されているベースアドレスレジスタ１１６０Ａ〜Ｂを選択するための選択信号値と、オフセットを制御テーブルメモリ１１６１から読み出す。読み出された選択信号値はマルチプレクサ１１６３の選択信号となり、ベースアドレスレジスタ１１６０Ａ〜Ｂのいずれか一方が選択され、そこに格納されるベースアドレスが読み出される。読み出されたベースアドレスは、出力選択信号として外部に出力されるとともに、加算器１１６２においてオフセットとの加算が行われる。その加算結果は、選択されたベースアドレスレジスタ１１６０に書き戻される。ただし、Ｖａｌｉｄビットとして０が入力された場合には、ベースアドレスレジスタ１１６０の更新は行われない。
【００７２】
一方、演算エンジン１１Ａ〜１１Ｄが有する出力コントローラ１１６は、図１０に示すように、演算エンジン１１Ｅが有する出力コントローラ１１６とは異なる。演算エンジン１１Ａ〜１１Ｄが有する出力コントローラ１１６の制御テーブルメモリ１１６１には、出力に用いる演算エンジン間バッファ１２のデータレジスタ１２Ａ〜Ｈの一つを選択するための選択信号の値が、データ処理に用いられるコンテキストＩＤの数に対応して記憶されている。
【００７３】
演算エンジン１１Ａ〜１１Ｄが有する出力コントローラ１１６は、入力コントローラ１１０から送信されるコンテキストＩＤをアドレスとして制御テーブルメモリ１１６１から選択信号の値を読み出し、それを出力選択信号として出力する。
【００７４】
図１１は演算エンジン１１Ａ〜Ｅが有する入力コントローラ１１０の実現例を示す図である。入力コントローラ１１０は、入力Ａ選択部１１００と、入力Ｂ選択部１１０１と、コンテキスト情報メモリ１１０２と、コンテキストＩＤラッチ１１０３と、データ処理終了ラッチ１１０４と、インクリメンタ１１０５と、マルチプレクサ１１０６と、ラッチ１１０７Ａ〜Ｂと、タイミングラッチ１１０８Ａ〜Ｂを有する。
【００７５】
入力Ａ選択部１１００と入力Ｂ選択部１１０１は、それぞれ入力Ａ選択信号と入力Ｂ選択信号を生成するための回路である。これらは、演算エンジン１１Ａが有する入力コントローラ１１０の場合は、演算エンジン１１Ｅが有する出力コントローラ１１６と同一のものであり、また演算エンジン１１Ｂ〜Ｅが有する入力コントローラ１１０の場合は、演算エンジン１１Ａ〜Ｄが有する出力コントローラ１１６と同一のもので、出力選択信号が入力Ａ〜Ｂ選択信号として用いられる。Ｖａｌｉｄ信号は出力されない。
【００７６】
コンテキスト情報メモリ１１０２は、Ｖａｌｉｄビットとデータ処理終了ビットとを含むコンテキスト情報を、データ処理で用いられるコンテキストＩＤの数だけ保存している。
【００７７】
コンテキストＩＤラッチ１１０３には、出力するコンテキストＩＤの値が格納される。コンテキストＩＤが出力されると、コンテキストＩＤラッチ１１０３の値はインクリメンタ１１０５により１だけ増やされる。
【００７８】
データ処理終了ラッチ１１０４は、データ処理が完了したかどうかを示す信号を格納するラッチである。半導体装置１の初期状態においてこのラッチの値は、データ処理の完了を意味する１である。
【００７９】
次に、入力コントローラ１１０の動作を説明する。
【００８０】
プロセッサなどの外部装置から半導体装置１にデータ処理の開始が通知されると、データ処理終了ラッチ１１０４が０にセットされる。また、このサイクルではコンテキストＩＤラッチ１１０３は０を示しており、コンテキスト情報メモリ１１０２のアドレス０に格納されているコンテキスト情報が読み出される。この読み出されたコンテキスト情報が含んでいるＶａｌｉｄビットとデータ終了ビットとが、それぞれラッチ１１０７Ａ〜Ｂにセットされる。
【００８１】
次のサイクルに、入力Ａ選択部１１００と入力Ｂ選択部１１０１は、コンテキストＩＤラッチ１１０３に格納されるコンテキストＩＤと、ラッチ１１０７Ａに格納されるＶａｌｉｄビットとに従って、それぞれ入力Ａ選択信号、入力Ｂ選択信号を出力する。またこれらコンテキストＩＤとＶａｌｉｄビットは、それらが演算ユニット１１３Ａに到着するタイミングと、入力Ａ選択信号、入力Ｂ選択信号によってそれぞれ読み出される入力Ａデータ、入力Ｂデータが演算ユニット１１３Ａに到着するタイミングとが等しくなるよう、タイミングラッチ１１０８Ａ〜Ｂによりタイミングが調整された後に、演算ユニット１１３Ａに出力される。また、サイクルの終わりに、コンテキストＩＤラッチ１１０３の値がインクリメンタ１１０５により１だけ増やされる。同様にして、コンテキスト情報メモリ１１３からデータ処理終了ビットとして０が読み出される間、サイクルごとにコンテキストＩＤとＶａｌｉｄビットとが出力される。
【００８２】
コンテキスト情報メモリ１１３からデータ処理終了ビットとして１が読み出されると、コンテキストＩＤとＶａｌｉｄビットが出力されるとともに、データ処理終了ラッチ１１０４が１に設定される。
【００８３】
次のサイクル以後、データ処理完了信号として１が出力され、また、データ処理終了ラッチ１１０４が１なので、Ｖａｌｉｄビットは０となる。この状態が、演算エンジン１１でデータ処理が完了した状態である。
【００８４】
以上述べたように、演算エンジン１１Ａ〜Ｅはパイプライン式転送によってデータとＶａｌｉｄ信号の両者を同じタイミングで出力する。演算エンジン間バッファ１２はＶａｌｉｄ信号が１であるときに受け取ったデータのみをバッファ（データレジスタ１２０に相当する）に書き込む。
【００８５】
ここで、演算エンジン間バッファ１２において利用できるバッファが存在しなくなることが予見できるサイクルではＶａｌｉｄ信号として０が出力されるように、コンテキスト情報メモリ１１０２に格納されるコードに従って入力コントローラ１１０をソフトウェア制御すれば、パイプラインインターロック機構を有さない構成において、演算器の数や演算エンジン間バッファ１２が有するバッファの数を少なくしても、半導体装置１は効率よく演算を行うことが可能となる。
【００８６】
演算エンジン間バッファ１２の有するバッファの数が少ない構成とすると、これらバッファにおいて演算結果を一時的に格納する動作により消費される電力をパイプラインインターロックを用いない従来の動的リコンフィギュラブル回路技術を用いた半導体装置と比較して小さくすることが可能となる。また、製造コストの増大を抑えることができる。
【００８７】
さらに本実施形態において、演算エンジン１１Ａ〜Ｅは、直前のサイクルに出力したコンテキストＩＤを記憶する最終コンテキストＩＤラッチ１１７と、マルチプレクサ１１８を具備する。入力コントローラ１１０から出力されるＶａｌｉｄビットが０の場合には、最終コンテキストＩＤラッチ１１７に記憶されているコンテキストＩＤがマルチプレクサ１１８により選択され、そのＶａｌｉｄビットとともに演算ユニット１１３へパイプライン式転送によって出力されるよう制御する。演算ユニット１１３の出力結果は、Ｖａｌｉｄビットが０のときにはデータパイプラインレジスタ１１４には書き込まれない。このため、Ｖａｌｉｄビットが０である間は、演算ユニット１１３の入出力データ信号と設定信号は、最後にＶａｌｉｄビットが１であった状態から変化しない。
【００８８】
したがって、演算エンジン間バッファ１２のみならず演算エンジン１１内の演算ユニット１１３およびデータパイプラインレジスタ１１４が消費する電力についても、パイプラインインターロックを用いない従来の動的リコンフィギュラブル回路と比較して小さくすることが可能となる。
【００８９】
効率のよい演算と消費電力の削減は、前述の通り、入力コントローラ１１０をソフトウェア制御することによって達成される。そのためのコードは、別の半導体装置等により予め作成してコードメモリ１３に格納し、コード転送制御装置１４によりデータ処理の開始前に予めコンテキスト情報メモリ１１０２に転送して格納しておく必要がある。以下では、入力コントローラ１１０のコードを予め作成するコンパイラについて説明する。
【００９０】
このコンパイラは、例えばコンピュータのプログラムとして実現することができ、演算エンジン１１Ａ〜Ｅの間でどのようにして演算結果の受け渡しが行われるかを示すデータ依存グラフ、演算エンジン１１Ａ〜Ｅのパイプライン段数、およびデータメモリの読み書きに要するサイクル数を入力して記憶する記憶部と、該記憶部に記憶された情報を参照し、入力コントローラ１１０が有するコンテキスト情報メモリ１１０２に格納されるコードと、演算エンジン１１Ａ〜Ｄが有する制御テーブルメモリ１１６１に格納されるコードを生成するコード生成部とを有する。データ依存グラフのデータは、例えばユーザが予め作成しておく。
【００９１】
本実施形態の半導体装置１は、ある与えられた性能を実現するのに必要な演算エンジン間バッファ１２のバッファ数を少なくできることを特徴の一つとしている。このため、コンパイラもまた、演算エンジン間バッファ１２のバッファ数が少ない場合においても正しくコードを生成できなくてはならない。
【００９２】
この目的のために、以下で詳しく説明するコンパイル手法においては、与えられた複数の演算を演算エンジン１１Ａ〜Ｅがどの順序で実行すべきかを次のように決定する。すなわち、その演算への入力となるデータが全く生成されていないような演算よりも、その演算への入力となるデータの一部が既に演算され、該データの一部が演算エンジン間バッファ１２に書き込まれているような演算が優先して実行されるようにする。そうすれば、演算エンジン間バッファ１２におけるデータの滞留時間を極力少なくできる。このようなコンパイル手法は、演算エンジン間バッファ１２が多くのバッファを有することを前提としていた従来のコンパイル手法とは異なるものである。
【００９３】
以下、本実施形態に係るコンパイル手法を詳細に説明する。
【００９４】
コンパイラは、演算エンジン１１Ａ〜Ｅが有するコンテキスト情報メモリ１１０２に格納されるコードと、演算エンジン１１Ａ〜Ｄが有する制御テーブルメモリ１１６１に格納されるコードを出力する。このため、上述したコード生成部は、演算エンジン１１Ａ〜Ｅにより行われる複数の演算について、入力と出力のデータ依存関係を表すデータ依存グラフを解析する。前述の通り、データ依存グラフは、演算エンジン１１Ａ〜Ｅの間でどのようにして演算結果の受け渡しが行われるかを表している。
【００９５】
コード生成部は、ある演算への入力となるデータの一部が既に演算されており、該データの一部が演算エンジン間バッファ１２に書き込まれているような演算をデータ依存グラフから特定する特定部と、そのような演算が優先して実行されるように演算エンジン１１Ａ〜Ｅにより行われる演算の順序を決めるスケジューリング部と、この順序に従い、各サイクルにおいて演算エンジン１１Ａ〜Ｅの各々が演算を行うか否かを決定する決定部と、演算エンジン１１Ａ〜Ｅの各々が演算を行うならば、対応する入力コントローラ１１０からＶａｌｉｄビットとして１を出力し、演算を行なわないならば、対応する入力コントローラ１１０からＶａｌｉｄビットとして０を出力するためのコードを生成する生成部とを有する。また、コード生成部は、演算エンジン１１Ａ〜Ｅがサイクルごとにどの演算の設定を用いればよいかを規定するコードも生成する。
【００９６】
コード生成のより具体的な処理手順は、例えば、図１２のフローチャートに示す手順に従う。
【００９７】
図１３にデータ依存グラフの一例を示す。データ依存グラフの一つのノードは演算エンジン１１で実行される一つの演算に対応している。データ依存グラフの矢印は、矢印の元に接続するノードに対応する演算の結果が、矢印の先に接続するノードに対応する演算の入力として使われることを示している。本例のデータ依存グラフには次のような制約がある。すなわち、任意のノードの入力となるノードの数は高々２つとし、また任意のノードの出力は常に一つのノードの入力としてのみ用いられるものとする。データ依存グラフのノードには、その演算を実行する演算エンジン１１Ａ〜Ｅを識別するための、Ａ〜Ｅのいずれかのラベルが付与される。また、各ラベルのノードには、ＩＤ（例えば０から始まる番号）が付与される。
【００９８】
図１２のフローチャートに沿って、演算エンジン１１Ａ〜Ｅがサイクルごとにどの演算の設定を用いればよいかを図１３のデータ依存グラフから求める手法について説明する。
【００９９】
説明を容易にするため、演算エンジン１１Ａ〜Ｅのレイテンシを１とし、また演算エンジン間バッファ１２はデータレジスタ１２０Ａ〜Ｂの２つのみを有するものとする。なお、この手法はデータレジスタ１２０の数が２より大きい場合にも適用できる。また演算エンジン１１Ａ〜Ｅのレイテンシが２以上の場合にも適用できる。ここで、演算エンジン１１のレイテンシとは、演算エンジン１１が演算を完了するのに必要なサイクル数のことをいう。例えば、演算エンジン１１の演算ユニット１１３の数が５であれば、レイテンシは５である。
【０１００】
まずステップＳ０で初期化処理を行う。処理済ノード集合を空にし、グラフＧに図１３のデータ依存グラフをセットする。データレジスタ１２０Ａ〜Ｂの使用開始時刻、使用可能時刻をそれぞれ０とし、演算エンジン１１Ａ〜１１Ｅの使用可能時刻をＬとする。Ｌは、データメモリの読み書きに要するサイクル数であり、ここでは１とする。データ依存グラフのノードＮごとに、該ノードＮと同じノードに出力を行う別のノードＮ’を特定する。ノードＮ’をノードペアテーブルにおけるノードＮの項目に登録する。ノードＮ’が存在しない場合はノードＮの項目を空にする。ノードＮ’が存在する場合、「ノードＮとノードＮ’はペアである」と表現する。そして、スピルノードスタックを空にする。
【０１０１】
ステップＳ１においては、グラフＧに優先処理ノードが存在するかをチェックする。優先処理ノードとは、処理済ノード集合に含まれないノードであって、入力ノードを２つ有し、かつ入力ノードの一つのみが処理済ノードリストに含まれるようなノードである。この優先処理ノードは、演算の入力となるデータの一部が既に演算され、その演算結果が演算エンジン間バッファ１２に書かれているような演算に相当する。そのような演算が優先的に処理されるようにするのが、このステップＳ１の特徴である。この時点では、処理済ノード集合は一つのノードすら含んでいないので、処理はステップＳ２に進む。
【０１０２】
ステップＳ２においては、グラフＧに処理可能ノードが存在するかをチェックする。処理可能ノードとは、処理済ノード集合に含まれないノードであって、かつ入力ノードの全てが処理済みノードリストに含まれているか、または入力ノードを持たないノードのことである。この例では処理可能ノードであるノードＡ０〜３が存在するので、処理はステップＳ３に進む。
【０１０３】
ステップＳ３では、グラフＧにおいて深さ最深の処理可能ノードＮを求める。この例では、ノードＡ０〜３は全て同じ深さを持つので、任意のノードを一つ選ぶ。ここでは、例えばノードＡ０が選ばれたものとする。
【０１０４】
ステップＳ４では、ステップＳ３で求められた処理可能ノードＮがスケジュール可能であるかを判定する。「スケジュール可能である」とは、処理可能ノードＮが出力を持たないか、または、処理可能ノードＮの結果出力に使用できるデータレジスタ１２０の少なくとも一つが、ノードＮの入力となる別のノードの結果出力に用いられているか、または使用可能時刻が無限大でないという条件を満たすことをいう。ここで、ノードＮのペアとなるノードＮ’が存在し、かつノードＮ’が処理済ノード集合に含まれる場合には、ノードＮ’の結果出力に用いているデータレジスタ１２０は、ノードＮの結果出力には使用できない。この時点では、処理済みノード集合は空なので、ノードＡ０はスケジュール可能である。ステップ５に進む。
【０１０５】
ステップＳ５では、ノードＮのスケジュールを行う。ステップＳ５におけるスケジューリング処理は、例えば、図１４に示すようなフローチャートに従って行われる。
【０１０６】
まずステップＳ５Ａにおいて、ノードＮの入力となるノードが存在するかをチェックする。この例では、ノードＡ０は入力となるノードを持たないので、処理はステップＳ５Ｂに進む。
【０１０７】
次に、ステップＳ５Ｂにおいて、ノードＮの結果出力に使用できるデータレジスタ１２０のうち、その使用可能時刻が最小であるレジスタＲを一つ選ぶ。ただし、ノードＮが出力を持たない場合には、レジスタＲは任意に選ばれる。この時点では、データレジスタ１２０Ａ〜Ｂの使用可能時刻はいずれも１なので、どちらを使用してもよい。ここでは、データレジスタ１２０Ａを使用することにする。
【０１０８】
次に、ステップＳ５Ｃにおいて、ノードＮの実行可能時刻に演算エンジン１１のレイテンシを加えた値と、レジスタＲの使用可能時刻とを比較する。ノードＮの実行可能時刻は、ノードＮの任意の入力ノードが結果出力に使うデータレジスタ１２０の使用可能時刻と、演算エンジン１１の使用可能時刻の、遅い方の時刻とする。ノードＮが入力ノードを持たない場合、ノードＮの実行可能時刻は演算エンジン１１の使用可能時刻に等しい。また、ノードＮが出力を持たない場合、処理は常にステップＳ５Ｄに進む。この例では、データレジスタ１２０Ａの使用可能時刻の方が小さいので、ステップＳ５Ｄに進む。
【０１０９】
ステップＳ５Ｄにおいて、ノードＮの実行時刻を、ステップＳ５Ｃで求めたノードＮの実行可能時刻とし、その演算エンジン１１の使用可能時刻はノードＮの実行時刻に１を加えたものとする。また、レジスタＲの使用開始時刻はノードＮの実行時刻に演算エンジン１１のレイテンシを加えたものとし、レジスタＲの使用可能時刻を無限大とする。またレジスタＲの所有ノードをＮとする。ただし、ノードＮが出力を持たない場合には、レジスタＲの使用開始時刻および使用可能時刻の更新は行わない。この例では、Ａ０の実行時刻は１、演算エンジン１１Ａの使用可能時刻は２、データレジスタ１２０Ａの使用開始時刻は２、データレジスタ１２０Ａの使用可能時刻は無限大となる。データレジスタ１２０Ａの所有ノードはＡ０になる。
【０１１０】
そしてステップＳ５Ｅにおいて、ノードＮとＮが結果を出力するレジスタＲの組を処理済ノード集合に追加する。この例ではノードＡ０とデータレジスタ１２０Ａの組が処理済ノード集合に追加される。
【０１１１】
以上によりステップＳ５が完了すると、処理はステップＳ１に戻る。ステップＳ１の開始から、再びステップＳ１に戻るまでに行われる一連のステップをイテレーションと呼ぶことにする。
【０１１２】
次のイテレーションＩ１では、ステップＳ１において優先処理ノードＢ０が見つかるので、処理はステップＳ１からステップＳ６に進む。
【０１１３】
ステップＳ６では、まずグラフＧをグラフスタックの最上部に積む。次に、ステップＳ１で求められた優先処理ノードの入力ノードのうち、処理済ノード集合に含まれない方の入力ノードＮ’を含み、かつ優先処理ノードを含まないグラフＧの最大連結部分グラフＧ’を求める。Ｇ’を優先処理グラフと呼ぶ。そして、グラフＧに優先処理グラフＧ’をセットする。この例では、優先処理グラフＧ’はノードＡ１のみを含むグラフとなる。処理はステップＳ６からステップＳ１に戻り、イテレーションＩ２に進む。この例において、イテレーションＩ２では、ステップＳ１からＳ２、Ｓ３へと進み、ノードＡ１が深さ最深の処理可能ノードとなる。
【０１１４】
ステップＳ４では、ノードＡ１のペアとなるノードＡ０はデータレジスタ１２０Ａを結果出力に用いているので、データレジスタ１２０ＢのみがノードＡ１の結果出力に使用可能となる。データレジスタ１２０Ｂの使用可能時刻は０なので、ノードＡ１はスケジュール可能となり、処理はステップＳ５に進む。ステップＳ５では、ノードＡ０と同様に処理はステップＳ５ＡからＳ５Ｂ、Ｓ５Ｃ、Ｓ５Ｄ、Ｓ５Ｅへと進み、ノードＡ１の実行時刻は２、演算エンジン１１Ａの使用可能時刻は３、データレジスタ１２０Ｂの使用開始時刻は３、データレジスタ１２０Ｂの使用可能時刻は無限大、データレジスタ１２０Ｂの所有ノードはノードＡ１となる。ノードＡ１とデータレジスタ１２０Ｂの組が処理済ノード集合に追加される。処理はイテレーションＩ３に進む。
【０１１５】
イテレーションＩ３において、処理はステップＳ１からＳ２へと進み、グラフＧにはもはや処理可能なノードはないため、ステップＳ７に進む。
【０１１６】
ステップＳ７では、グラフスタックが空であるかをチェックする。空でなければステップＳ８に進み、グラフスタックの最上部からグラフを取り出してグラフＧにセットする。この例では、イテレーションＩ１でグラフスタックにグラフが積まれているので、ステップＳ８に進み、グラフスタックからグラフを取り出してグラフＧにセットする。このときのグラフＧは図１３に示したものと同じになる。
【０１１７】
ステップＳ１０では、スピルノードスタックが空であるかをチェックする。スピルノードスタックが空でなく、かつグラフＧに存在するノードがスピルノードスタックの最上部に積まれている場合には、スピル対応が必要になる。この時点ではスピルノードスタックは空なので、処理はイテレーションＩ４に進む。
【０１１８】
イテレーションＩ４では、ステップＳ１からＳ２、Ｓ３へと進み、ノードＢ０が深さ最深の処理可能ノードとなる。ノードＢ０の結果出力にはデータレジスタ１２０Ａ〜Ｂの両方が使用可能であり、かつそれらはノードＢ０の入力となるノードＡ１、Ａ２の結果出力に用いられているので、ノードＢ０はスケジュール可能である。
【０１１９】
ステップＳ５において、まずノードＢ０は入力ノードを持つので、処理はステップＳ５ＡからＳ５Ｆに進む。ステップＳ５Ｆでは、ステップＳ３で求められた深さ最深の処理可能ノードＮに対して、その入力ノードごとに結果出力に用いられるデータレジスタ１２０と、その使用開始時刻を求める。そして、求められた使用開始時刻の最大値に１を加えた値を、求められた全てのデータレジスタ使用可能時刻とする。この例では、データレジスタ１２０Ａ〜Ｂの使用可能時刻がそれぞれ４になる。
【０１２０】
ステップＳ５Ｂでは、データレジスタ１２０Ａ〜Ｂの使用可能時刻は等しいので、どちらを選んでもよい。ここではデータレジスタ１２０Ａが選ばれたとする。以下、処理はステップＳ５ＣからＳ５Ｄ、Ｓ５Ｅへと進み、ノードＢ０の実行時刻は４、演算エンジン１１Ｂの使用可能時刻は５、データレジスタ１２０Ａの使用開始時刻は５、データレジスタ１２０Ａの使用可能時刻は無限大、データレジスタ１２０Ａの所有ノードはＢ０となる。ノードＢ０とデータレジスタ１２０Ａの組が処理済ノード集合に追加される。処理はイテレーションＩ５に進む。
【０１２１】
イテレーションＩ５では、ステップＳ１においてノードＥ０が優先処理となり、ステップＳ６が処理され、イテレーションＩ６に進む。
【０１２２】
イテレーションＩ６において、処理はステップＳ１からＳ２、Ｓ３、Ｓ４へと進み、ステップＳ５においてノードＡ２がスケジュールされる。ステップＳ５において、処理はステップＳ５ＡからＳ５Ｂへと進む。ステップＳ５Ｃにおいて、データレジスタ１２０Ｂの使用可能時刻はノードＡ２の実行可能時刻＋１以上であるので、処理はステップＳ５Ｇに進む。
【０１２３】
ステップＳ５Ｇでは、ステップＳ５Ｃで求めたレジスタＲの使用可能時刻からノードＮを実行する演算エンジン１１のレイテンシを引いた値をノードＮの実行時刻とする。他の値はステップＳ５Ｄと同様に求める。この例では、Ａ２の実行時刻は３、演算エンジン１１Ａの使用可能時刻は４、データレジスタ１２０Ｂの使用開始時刻は４、データレジスタ１２０Ｂの使用可能時刻は無限大となる。データレジスタ１２０Ｂの所有ノードはＡ２になる。イテレーション７に進む。
【０１２４】
イテレーション７において、処理はステップＳ１からＳ６へと進み、グラフＧがノードＡ３のみのグラフとなる。
【０１２５】
イテレーション８において、処理はステップＳ１からＳ２、Ｓ３へと進み、ステップＳ４においてノードＡ３をスケジュールしようとするが、データレジスタ１２０Ａ〜Ｂはともに使用可能時刻が無限大なので、ノードＡ３はスケジュール不可能である。処理はステップＳ９に進む。
【０１２６】
ステップＳ９におけるスピル処理の手順を図１５のフローチャートに示す。まず、ステップＳ９Ａにおいて、データレジスタ１２Ａ〜Ｂからデータメモリ１５に書き戻すものを一つ選ぶ。この書き戻しをレジスタスピル処理と呼ぶ。スケジュール不可能なノードＮのペアとなるノードＮ’が存在する場合には、ノードＮ’の結果出力に用いられていないデータレジスタ１２を選ぶ。ノードＮのペアとなるノードＮ’が存在しない場合には、任意のデータレジスタ１２を選ぶ。この例では、データレジスタ１２Ａが選ばれる。
【０１２７】
ステップＳ９Ｂでは、演算エンジン１１Ｅでレジスタスピル処理を行う時刻を求める。演算エンジン１１Ｅの使用可能時刻と、データメモリに書き戻すデータレジスタ１２の使用開始時刻に１を加えたものとを比較し、大きい方がレジスタスピル処理を行う時刻になる。また、演算エンジン１１Ｅが行うデータ退避を表すものとしてグラフに新たに追加されるノード（データ退避ノード）の実行時刻と、データレジスタ１２の使用可能時刻を、レジスタスピル処理を行う時刻とする。この例では、時刻６がレジスタスピル処理を行う時刻となり、データ退避ノードＥ１の実行時刻と、データレジスタ１２Ａの使用可能時刻が６となる。
【０１２８】
ステップＳ９Ｃでは、スピルスタックに、データレジスタ１２の所有ノードと、レジスタスピル処理を行う時刻に２×Ｌを加えた時刻の組を積む。この例では、ノードＢ０と時刻８の組がスピルスタックに積まれる。ステップＳ５に進む。
【０１２９】
ステップＳ５では、データレジスタ１２Ａの使用開始時刻が６に更新されているので、Ａ３の実行時刻は５、演算エンジン１１Ａの使用可能時刻は６、データレジスタ１２０Ａの使用開始時刻は６、データレジスタ１２０Ａの使用可能時刻は無限大となる。データレジスタ１２０Ａの所有ノードはＡ３になる。処理はイテレーション９に進む。
【０１３０】
イテレーション９において、処理はステップＳ１からＳ２、Ｓ７、Ｓ８へと進む。ステップＳ１０において、スピルスタックは空でないが、ステップＳ８でグラフスタックから取り出したグラフＧには、スピルスタックの最上部にあるノードＢ０は含まれないので、イテレーション１０に進む。
【０１３１】
イテレーション１０において、処理はステップＳ１からＳ２、Ｓ３、Ｓ４、Ｓ５へと進む。ノードＢ１の実行時刻は７、演算エンジン１１Ｂの使用可能時刻は８、データレジスタ１２０Ｂの使用開始時刻は８、データレジスタ１２０Ｂの使用可能時刻は無限大となる。データレジスタ１２０Ｂの所有ノードはＢ１になる。イテレーション１１に進む。
【０１３２】
イテレーション１１では、処理はステップＳ１からＳ２、Ｓ７、Ｓ８へと進む。ステップＳ１０でスピル対応が必要と判断され、処理はステップＳ１１に進む。
【０１３３】
ステップＳ１１では、まずスピルスタックの先頭からノードと時刻の組を取り出す。そして、演算エンジン１１Ａの使用可能時刻を、取り出された時刻とする。さらにグラフＧから、取り出されたノードを含み、そのノードの出力を含まない最大連結部分グラフ（すなわち優先処理グラフ）Ｇ’を求める。この優先処理グラフＧ’をデータ復帰のための演算エンジン１１Ａのノードに置き換える。この例では、演算エンジン１１Ａの使用可能時刻は８となり、更新されたデータ依存グラフは図１６のようになる。イテレーション１２に進む。
【０１３４】
イテレーション１２において、処理はステップＳ１からＳ２、Ｓ３、Ｓ４、Ｓ５へと進み、イテレーション１１で生成されたデータ復帰用のノードＡ４がスケジュールされる。ノードＡ４の実行時刻は８、演算エンジン１１Ａの使用可能時刻は９、データレジスタ１２０Ａの使用開始時刻は９、データレジスタ１２０Ａの使用可能時刻は無限大となる。データレジスタ１２０Ａの所有ノードはＡ４になる。処理はイテレーション１３に進む。
【０１３５】
イテレーション１３において、処理はステップＳ１からＳ２、Ｓ３、Ｓ４、Ｓ５へと進み、ノードＥ０の実行時刻は１０、演算エンジン１１Ｅの使用可能時刻は１１となる。
【０１３６】
次のイテレーション１４において、処理はステップＳ１からＳ２、Ｓ７へと進む。グラフスタックは空であるため、最終的にコードを出力するためのステップＳ１２に進む。
【０１３７】
ステップＳ１２におけるコード出力処理の手順を図１７のフローチャートに示す。まずステップＳ１２Ａにおいて、アドレスを示す変数Ｃを０に初期化する。
【０１３８】
ステップＳ１２Ｂでは、演算エンジン１１Ａ〜Ｅのそれぞれが有するコンテキスト情報メモリ１１０２の、アドレスＣに保存されるコンテキスト情報を初期化する。この初期化により、Ｖａｌｉｄビット、データ処理終了ビットがそれぞれ０に初期化される。
【０１３９】
ステップＳ１２Ｃでは、処理済ノード集合に含まれる全てのノードＮについて、実行時刻がＣであるものを全て求める。そのようなノードが一つでも存在すれば、処理はステップＳ１２Ｅに進み、一つも存在しなければ、処理はステップＳ１２Ｆに進む。
【０１４０】
ステップＳ１２Ｅでは、ステップＳ１２Ｃで見つけられたノードＮごとに、ノードＮを実行する演算エンジン１１が有するコンテキスト情報メモリ１１０２の、アドレスＣに保存されるＶａｌｉｄビットを１に更新する。また、ノードＮが出力を持つ場合には、演算エンジン間バッファ１２のデータレジスタ１２Ａ〜Ｈの一つを選択するための選択信号の値として、レジスタＲを示す値を、ノードＮを実行する演算エンジン１１が有する制御テーブルメモリ１１６１のアドレスＣに保存する。また、ステップＳ１２Ｃで見つかった全てのノードＮを処理済ノード集合から削除する。
【０１４１】
ステップＳ１２Ｆでは、処理済ノード集合が空であるかを判定する。空でない場合には処理はステップＳ１２Ｈに進み、アドレスＣをＣ＋１に更新してステップＳ１２Ｂに戻る。空の場合には、処理はステップＳ１２Ｇに進む。
【０１４２】
ステップＳ１２Ｇでは、演算エンジン１１Ａ〜Ｅの入力コントローラ１１０が有するコンテキスト情報メモリ１１０２の、アドレスＣに保存されるデータ処理終了ビットを１とし、コード生成は完了する。
【０１４３】
以上説明したコンパイル手法により、図１３のデータ依存グラフから生成されたコードに従って半導体装置１を実行させた際のタイミングチャートを図１８に示す。図１８において、演算エンジン１１の演算結果が、１であるＶａｌｉｄビットとともに出力されるサイクルの各々には、その演算に相当するラベル（図１３参照）が示されている。図１８には、データレジスタ１２０の値がどのサイクルで変化するかについても示してある。
【０１４４】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【０１４５】
【図１】一実施形態に係る半導体装置を示すブロック図
【図２】演算エンジン間バッファを示す図
【図３】演算エンジンを示す図
【図４】演算エンジン間バッファが有するデータレジスタを示す図
【図５】コード転送制御ユニットを示す図
【図６】コードメモリにおけるコードの配置を示す図
【図７】演算エンジンが有する演算ユニットを示す図
【図８】演算ユニットが有する演算器を示す図
【図９】演算エンジンが有する出力コントローラを示す図
【図１０】演算エンジンが有する別の出力コントローラを示す図
【図１１】演算エンジンが有する入力コントローラを示す図
【図１２】コードの生成手順を示すフローチャート
【図１３】データ依存グラフを示す図
【図１４】ノードのスケジューリング処理の手順を示すフローチャート
【図１５】スピル処理の手順を示すフローチャート
【図１６】ノード置換後のデータ依存グラフを示す図
【図１７】コード出力処理の手順を示すフローチャート
【図１８】データ依存グラフから生成されたコードに従って半導体装置を実行させた際のタイミングチャート
【符号の説明】
【０１４６】
１…半導体装置；
１１Ａ〜Ｅ…演算エンジン；
１１０…入力コントローラ；
１１００…入力Ａ選択部；
１１０１…入力Ｂ選択部；
１１０２…コンテキスト情報メモリ；
１１０３…コンテキストＩＤラッチ；
１１０４…データ処理終了ラッチ；
１１０５…インクリメンタ；
１１０６…マルチプレクサ；
１１０７Ａ〜Ｂ…ラッチ；
１１０８Ａ〜Ｂ…タイミングラッチ；
１１３Ａ〜Ｅ…演算ユニット；
１１３０…演算器；
１１３１…制御テーブルメモリ；
１１３２Ａ〜Ｄ…設定情報レジスタ；
１１３３…マルチプレクサ；
１１４Ａ〜Ｅ…データパイプラインレジスタ；
１１５Ａ〜Ｅ…制御パイプラインレジスタ；
１１６…出力コントローラ；
１１６０Ａ〜Ｂ…ベースアドレスレジスタ；
１１６１…制御テーブルメモリ；
１１６２…加算器；
１１６３…マルチプレクサ；
１１７…最終コンテキストＩＤラッチ；
１１８…マルチプレクサ；
１２…演算エンジン間バッファ；
１２０Ａ〜Ｈ…データレジスタ；
１２００…データラッチ；
１２０１Ａ〜Ｄ…ＡＮＤロジック；
１２０２…ＯＲロジック；
１２０３…マルチプレクサ；
１３…コードメモリ；
１４…コード転送制御装置；
１４０…メモリＩＤレジスタ；
１４１…アドレスレジスタ；
１４２…コードアドレスレジスタ；
１４３Ａ〜Ｃ…インクリメンタ；
１４４Ａ〜Ｄ…マルチプレクサ；
１４５…Ｖａｌｉｄラッチ；
１４６…比較器；
１５…データメモリ
【図１】
2008242947.tif 000003
【図２】
2008242947.tif 000004
【図３】
2008242947.tif 000005
【図４】
2008242947.tif 000006
【図５】
2008242947.tif 000007
【図６】
2008242947.tif 000008
【図７】
2008242947.tif 000009
【図８】
2008242947.tif 000010
【図９】
2008242947.tif 000011
【図１０】
2008242947.tif 000012
【図１１】
2008242947.tif 000013
【図１２】
2008242947.tif 000014
【図１３】
2008242947.tif 000015
【図１４】
2008242947.tif 000016
【図１５】
2008242947.tif 000017
【図１６】
2008242947.tif 000018
【図１７】
2008242947.tif 000019
【図１８】
2008242947.tif 000020