(57)【要約】【課題】  パイプラインの構成が変わっても、ループエンド判定を正確に行うことができるループ制御回路及びループ制御方法を提供すること。【解決手段】  本発明にかかるループ制御回路１００は、命令のアドレスを順次示すプログラムカウンタ１０１と、ループ先頭命令のループ先頭アドレスを計算するＬＳＡ計算回路１２１と、ループ終端命令のループ終端アドレスを計算するＬＥＡ計算回路１１１と、ループ命令のパイプライン処理が終了するまでの間、インターロックを発生させ、ループ終端命令のパイプライン処理を保留するインターロック発生回路１４０と、ループ命令のパイプライン処理終了後、プログラムカウンタとループ終端アドレスの比較結果に基づいて、プログラムカウンタをループ先頭アドレスに設定するループエンド判定回路１３０と、を有するものである。【選択図】  図１
2007207145.tif 000002
【特許請求の範囲】
【請求項１】
命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御回路であって、
前記ループ命令のパイプライン処理が終了するまで、前記ループ終端命令のパイプライン処理を保留するインターロック発生回路を有する、
ループ制御回路。
【請求項２】
パイプライン処理する命令のアドレスを順次示すプログラムカウンタと、
前記ループ命令のパイプライン処理中に、前記ループ先頭命令のアドレスであるループ先頭アドレスを計算するループ先頭アドレス計算回路と、
前記ループ命令のパイプライン処理中に、前記ループ終端命令のアドレスであるループ終端アドレスを計算するループ終端アドレス計算回路と、
前記ループ命令のパイプライン処理終了後、前記プログラムカウンタと前記ループ終端アドレスの比較結果に基づいて、前記プログラムカウンタを前記ループ先頭アドレスに設定するループ終端判定回路と、をさらに有する、
請求項１に記載のループ制御回路。
【請求項３】
前記インターロック発生回路は、前記ループ命令のパイプライン処理におけるデコードフェーズの次のフェーズから実行フェーズ終了までの間、インターロックを発生させ、前記ループ先頭命令のパイプライン処理を保留する、
請求項１又は２に記載のループ制御回路。
【請求項４】
前記ループ先頭アドレス計算回路は、前記ループ命令のパイプライン処理に含まれるパイプラインフェーズのうち、前記ループ先頭命令のアドレスがプログラムカウンタに設定されるタイミングに処理されるパイプラインフェーズで、前記ループ先頭アドレスを計算する、
請求項３に記載のループ制御回路。
【請求項５】
前記ループ先頭アドレスを保持するループ先頭アドレスレジスタ及び仮ループ先頭アドレスレジスタをさらに有し、
前記ループ先頭アドレス計算回路は、前記計算したループ先頭アドレスを前記仮ループ先頭アドレスレジスタに保持させ、
前記ループ命令のパイプライン処理終了時に、前記ループ先頭アドレス計算回路は、前記仮ループ先頭アドレスに保持されたループ先頭アドレスを前記ループ先頭アドレスレジスタに保持させる、
請求項３又は４に記載のループ制御回路。
【請求項６】
前記インターロック発生回路は、前記ループ命令のパイプライン処理におけるデコードフェーズの次のフェーズから実行フェーズ終了までの間、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留する、
請求項１又は２に記載のループ制御回路。
【請求項７】
前記インターロック発生回路は、前記ループ命令のパイプライン処理終了前に、前記ループ終端命令のパイプライン処理が実行される場合、インターロックを発生させる、
請求項６に記載のループ制御回路。
【請求項８】
前記ループ先頭アドレスを保持するループ先頭アドレスレジスタ及び仮ループ先頭アドレスレジスタと、前記ループ終端アドレスを保持するループ終端アドレスレジスタ及び仮ループ終端アドレスレジスタと、をさらに有し、
前記ループ先頭アドレス計算回路は、前記ループ命令のパイプライン処理に含まれるパイプラインフェーズのうち、前記ループ先頭命令のアドレスがプログラムカウンタに設定されるタイミングに処理されるパイプラインフェーズで計算したループ先頭アドレスを前記仮ループ先頭アドレスレジスタに保持させ、
前記ループ終端アドレス計算回路は、前記ループ命令のパイプライン処理に含まれるパイプラインフェーズのうち、デコードフェーズの次のフェーズから実行フェーズまでの任意のパイプラインフェーズで計算したループ終端アドレスを前記仮ループ終端アドレスレジスタに保持させ、
前記ループ命令のパイプライン処理終了時に、前記ループ先頭アドレス計算回路は、前記仮ループ先頭アドレスに保持されたループ先頭アドレスを前記ループ先頭アドレスレジスタに保持させるとともに、前記ループ終端アドレス計算回路は、前記仮ループ終端アドレスに保持されたループ終端アドレスを前記ループ終端アドレスレジスタに保持させる、
請求項６又は７に記載のループ制御回路。
【請求項９】
命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御回路であって、
パイプライン処理する命令のアドレスを順次示すプログラムカウンタと、
前記ループ終端命令のアドレスであるループ終端アドレスを計算するループ終端アドレス計算回路と、
前記ループ命令のパイプライン処理が完了するまで、前記計算されたループ終端アドレスと前記プログラムカウンタとの比較結果に基づいて、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留するインターロック発生回路とを有する、
ループ制御回路。
【請求項１０】
前記ループ命令のパイプライン処理に含まれるパイプラインフェーズのうち、前記ループ先頭命令のアドレスがプログラムカウンタに設定されるタイミングに処理されるパイプラインフェーズで、前記ループ先頭命令のアドレスであるループ先頭アドレスを計算するループ先頭アドレス計算回路と、
前記ループ命令のパイプライン処理終了後、前記プログラムカウンタと前記ループ終端アドレスの比較結果に基づいて、前記プログラムカウンタを前記ループ先頭アドレスに設定するループ終端判定回路とをさらに有する、
請求項９に記載のループ制御回路。
【請求項１１】
前記インターロック発生回路は、前記計算されたループ終端アドレスと前記プログラムカウンタとが一致した場合に、インターロックを発生させる、
請求項９又は１０に記載のループ制御回路。
【請求項１２】
命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御方法であって、
前記ループ命令のパイプライン処理が終了するまで、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留する、
ループ制御方法。
【請求項１３】
命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御方法であって、
パイプライン処理する命令のアドレスをプログラムカウンタで順次示し、
前記ループ終端命令のアドレスであるループ終端アドレスを計算し、
前記ループ命令のパイプライン処理が終了するまで、前記計算されたループ終端アドレスと前記プログラムカウンタとの比較結果に応じて、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留する、
ループ制御方法。
【請求項１４】
前記ループ命令のパイプライン処理が完了するまでに前記計算されたループ終端アドレスと前記プログラムカウンタが示すアドレスとが一致した場合にインターロックを発生させる、
請求項１３に記載のループ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ループ制御回路及びループ制御方法に関し、特に、命令をパイプライン処理するプロセッサで用いられるループ制御回路及びループ制御方法に関する。
【背景技術】
【０００２】
各種のプロセッサとして、命令をパイプライン処理によって実行するパイプライン方式のものが知られている。パイプラインは、命令のフェッチ、デコード、実行などの複数のフェーズ（ステージ）に分割されおり、このパイプラインを複数オーバラップさせて、１つの命令の処理が終了する前に次の命令の処理を順次開始し、同時に複数の命令を処理することで高速化を図っている。パイプライン処理とは、各命令についてフェッチフェーズから実行フェーズまでパイプラインの一連のフェーズを処理することである。
【０００３】
図１０は、一般的なパイプラインの構成例を示している。図１０（ａ）のパイプラインは、ＩＦ（Instruction Fetch：フェッチ）、ＤＥ（DEcode：デコード）１、ＤＥ２、ＥＸＥ（EXEcution：実行）の４フェーズ（４段）に分割されており、各フェーズは、１クロックサイクルで処理される。
【０００４】
各フェーズの動作例を説明すると、ＩＦフェーズでは、プログラムカウンタが指し示すアドレスに従って実行する命令を命令メモリからフェッチする。ＤＥ１フェーズでは、フェッチされた命令の命令長に応じて次の命令をフェッチするアドレスを示すためにプログラムカウンタを計算する。ＤＥ２フェーズでは、フェッチされた命令をデコードし演算の種類の決定やオペランドの取得を行う。ＥＸＥフェーズでは、命令のデコード結果に基づいて命令を実行し、各種演算やデータメモリへのアクセスを行う。
【０００５】
近年、パイプラインの段数（フェーズ数）を増やして高速クロックでの動作に対応する手法が多く用いられている。図１０（ｂ）のパイプラインは、高速動作に対応するために、フェーズ数を増やした例である。このパイプラインは、ＩＦ１、ＩＦ２、ＩＦ３、ＤＥ１、ＤＥ２、ＡＣ（Address Calculation）、ＥＸ１、ＥＸ２、ＥＸ３の９フェーズに分割されている。
【０００６】
各フェーズの動作例を説明すると、ＩＦ１〜ＩＦ３フェーズでは、３サイクルで１命令をフェッチする。ＤＥ１，ＤＥ２フェーズは、図１０（ａ）と同様に、プログラムカウンタの計算、命令のデコードを行う。ＡＣフェーズでは、データメモリにアクセスするためのアドレスを計算する。ＥＸ１〜ＥＸ３では、３サイクルのいずれか、例えばＥＸ３で命令を実行する。
【０００７】
一方、汎用マイクロプロセッサよりも積和演算などを高速に処理し、各種の用途に特化した機能を実現するプロセッサとしてＤＳＰ（Digital Signal Processor）が知られている。
【０００８】
一般にＤＳＰでは、連続する繰り返し処理（ループ処理）を効率よく実行するために、ループ処理専用のループ命令（ハードウェア・ループ命令やゼロ・オーバヘッド・ループ命令などと呼ばれる）と、このループ命令を実行するためのループ制御回路を備えている。ループ制御回路は、入力されてフェッチされた命令がループ命令の場合、入力順の命令を処理するのではなく、ループの先頭の命令からループの終端の命令までの処理を繰り返すように制御する。このようなループ制御に関する技術が、例えば、特許文献１に記載されている。
【０００９】
図１１は、特許文献１と同様にループ制御を行うプロセッサの構成を示している。図に示されるように、この従来のプロセッサ９００は、命令メモリ９０１、フェッチ回路９０２、デコード回路９０３、演算回路９０４、データメモリアクセス回路９０５、データメモリ９０６、ループ制御回路８００を備えている。ループ制御回路８００は、プログラムカウンタ（ＰＣ）８０１、ＬＥＡ（Loop End Address：ループ終端アドレス）計算回路８１１、ＬＥＡレジスタ８１２、ＬＳＡ（Loop Start Address：ループ先頭アドレス）計算回路８２１、ＬＳＡレジスタ８２２、ループカウンタ（ＬＣ）８０２、ループエンド判定回路８３０を有している。
【００１０】
図１２は、従来のプロセッサ９００における従来のループ制御方法を示している。フェッチ回路９０２が命令メモリ９０１から命令をフェッチすると、デコード回路９０３は、フェッチされた命令をデコードし、ループ命令かどうか判定する（Ｓ９０１）。デコードした命令がループ命令の場合、ループカウンタ８０２は、ループ命令で指定されたループ回数をＬＣ値として設定し（Ｓ９０２）、ループ命令の実行フェーズで、ＬＳＡ計算回路８２１はＬＳＡを計算し、ＬＥＡ計算回路８１１はＬＥＡを計算する（Ｓ９０３）。次いで、ＬＳＡ計算回路８２１はＬＳＡレジスタ８２２に計算したＬＳＡを設定し、ＬＥＡ計算回路８１１はＬＥＡレジスタ８１２に計算したＬＥＡを設定する（Ｓ９０４）。
【００１１】
Ｓ９０１でループ命令以外の場合、もしくは、Ｓ９０４でＬＳＡ／ＬＥＡの設定した後、ループエンド判定回路８３０は、現在ループ内命令の処理中かどうか判定し（Ｓ９０５）、ループ処理中である場合、Ｓ９０６及びＳ９０７によりループエンド判定を行う。すなわち、ループエンド判定回路８３０は、比較器８３１によってプログラムカウンタ８０１のＰＣ値とＬＥＡレジスタ８１２のＬＥＡを比較し（Ｓ９０６）、ＰＣ値がＬＥＡと一致した場合、比較器８３２によって、ループカウンタ８０２のＬＣ値と０を比較し（Ｓ９０７）、ＬＣ値が０と不一致の場合、プログラムカウンタ８０１のＰＣ値にＬＳＡレジスタ８２２のＬＳＡを設定し（Ｓ９０８）、ループカウンタ８０２は、ＬＣ値をデクリメントする（Ｓ９０９）。ＬＣ値のデクリメントとは、ＬＣ値から１を減算することである。
【００１２】
また、Ｓ９０５においてループ処理中ではない場合、Ｓ９０６においてＰＣ値がＬＥＡと不一致の場合、Ｓ９０７においてＬＣ値が０と一致した場合、プログラムカウンタ８０１は、ＰＣ値をインクリメントする（Ｓ９１０）。ＰＣ値のインクリメントとは、ＰＣ値を次の命令のアドレスに設定することである。
【００１３】
次に、従来のプロセッサ９００で各命令がパイプライン処理される例について説明する。図１３は、ここで実行されるプログラムの例である。このプログラムには、「ＬＯＯＰ  １６；（ループ命令）」、「ＮＯＰ（No OPeration）；（ノップ命令）」の次に、「ｉｎｓｔ（instruction）１；（第１命令）」、「ｉｎｓｔ２；（第２命令）」、「ｉｎｓｔ３；（第３命令）」からなるループ内命令が記述され、その次に「ｉｎｓｔ４；（第４命令）」が記述されている。
【００１４】
ループ命令のオペランドは、ループ回数を示しており、この例ではループ内命令を１６回繰り返すことを意味している。ノップ命令は、演算やメモリアクセスなどの処理が実行されない命令である。ここでノップ命令は、ループ内命令の実行を遅延させるためのディレイスロット命令であり、ループ内命令を実行するタイミング、ループ内命令のアドレスを決定するタイミングを調整するために記述されている。１つのノップ命令により１クロックサイクル分、ループ内命令の実行が遅延する。
【００１５】
ループ命令に続いて、中カッコ「｛｝」で囲まれた内側が、繰り返し実行されるループ内命令である。ループ内命令のうち最初に記述された命令をループ先頭命令といい、ループ内命令のうち最後に記述された命令をループ終端命令という。すなわち、このプログラムは、第１命令〜第３命令を１６回繰り返し実行した後、第４命令を実行することを意味している。
【００１６】
なお、このループ命令をコンパイルしたとき、ループ命令のマシン語には、ループ回数とループ終端命令のアドレス（オフセット値）が含まれ、ループ先頭命令のアドレスは含まれないものとし、ループ先頭命令のアドレスは、プロセッサがループ命令を処理しながら計算するものとする。
【００１７】
ここでまず、従来のプロセッサ９００に図１０（ａ）のパイプラインを適用した場合を考える。この場合に図１３のプログラムを実行すると、図１４に示すようなパイプライン処理となる。
【００１８】
クロックサイクル「１〜４」で、ループ命令のＩＦ、ＤＥ１、ＤＥ２、ＥＸＥの４フェーズのパイプラインが処理され、クロックサイクル「２〜５」で、ノップ命令のパイプラインが処理され、続いて、第１命令〜第３命令が順次処理される。
【００１９】
クロックサイクル「３」のループ命令・ＤＥ２フェーズでループ命令がデコードされると、クロックサイクル「４」のループ命令・ＥＸＥフェーズでＬＳＡ／ＬＥＡが計算され（Ｓ９０３）、クロックサイクル「４」から「５」に進むタイミングでＬＳＡ／ＬＥＡがＬＳＡレジスタ８２２／ＬＥＡレジスタ８１２に設定される（Ｓ９０４）。
【００２０】
このとき、ＬＳＡには、クロックサイクル「４」のとき、すなわちループ命令・ＥＸＥフェーズのときのＰＣ値が設定される。クロックサイクル「４」のときのＰＣ値は、ノップ命令によって１サイクルずれて第１命令のアドレスであり、この第１命令のアドレスがＬＳＡに設定される。また、ＬＥＡには、ループ命令のマシン語コード中に含まれたアドレスが設定される。ここでは、ＬＥＡには、第３命令のアドレスが設定される。
【００２１】
ＬＳＡ／ＬＥＡが設定されると、ループエンド判定となる。クロックサイクル「５」では、ＰＣ値が判定され（Ｓ９０６）、ＰＣ値が第２命令のアドレスでありＬＥＡと一致しないため、ＰＣ値がインクリメントされて（Ｓ９１０）、クロックサイクル「６」で第２命令の次の第３命令がデコードされる。
【００２２】
クロックサイクル「６」では、ＰＣ値が判定され（Ｓ９０６）、ＰＣ値が第３命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ９０７）、ＬＣ値が０ではないため、ＰＣ値がＬＳＡの第１命令のアドレスに設定され（Ｓ９０８）、ＬＣ値がデクリメントされて（Ｓ９０９）、クロックサイクル「７」で第１命令のデコードが行われる。
【００２３】
さらに第１命令〜第３命令のパイプライン処理が１６回繰り返されると、クロックサイクル「５１」では、ＰＣ値が判定され（Ｓ９０６）、ＰＣ値が第３命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ９０７）、ＬＣ値が０であるため、ループエンドとなり、ＰＣ値がインクリメントされて（Ｓ９１０）、クロックサイクル「５２」でループ内命令の次の第４命令がデコードされる。
【特許文献１】米国特許第５５３５３４８号明細書
【発明の開示】
【発明が解決しようとする課題】
【００２４】
次に、従来のプロセッサ９００に図１０（ｂ）のパイプラインを適用した場合を考える。この場合に図１３のプログラムを実行すると、図１５に示すようなパイプライン処理となる。
【００２５】
クロックサイクル「１〜９」で、ループ命令のＩＦ１〜ＩＦ３、ＤＥ１、ＤＥ２、ＡＣ、ＥＸ１〜ＥＸ３の９フェーズのパイプラインが処理され、クロックサイクル「２〜１０」で、ノップ命令のパイプラインが処理され、続いて、第１命令〜第３命令が順次処理される。
【００２６】
ここで、命令が実際に実行されるフェーズをＥＸ３とし、図１４と同様に動作させると、ＬＳＡ／ＬＥＡの計算・設定がＥＸ３フェーズで行われることになる。そうすると、クロックサイクル「５」でループ命令がデコードされた後、クロックサイクル「９」のループ命令・ＥＸ３フェーズでＬＳＡ／ＬＥＡが計算され（Ｓ９０３）、ＬＳＡレジスタ／ＬＥＡレジスタに設定される（Ｓ９０４）。
【００２７】
クロックサイクル「９」のループ命令・ＥＸ３フェーズのとき、つまり、ＬＥＡの設定前に、ＬＥＡの指すループ終端命令のデコード（ＤＥ２）が処理されてしまうため、ＬＥＡが設定されたときには、すでにループ内命令の次の第４命令のデコードが行われてしまい、ループ終端命令の次にループ先頭命令に戻ってループ内命令を繰り返すことができない。すなわち、ＰＣ値がＬＥＡのときに正しくループエンド判定することができないという問題がある。そうすると、ループ内命令が繰り返し実行されなくなってしまう。
【００２８】
このように、従来のループ制御方法では、高速動作対応などのためにパイプラインの構成が変わると、ＬＥＡの設定前にループ終端命令が実行されてしまい、正しくループエンド判定できずループ内命令が繰り返し実行されないという問題があった。
【００２９】
実行するプログラムにおいて、ループ命令とループ内命令との間にパイプラインの段数に合わせてノップ命令を追加することで、ループエンド判定のタイミングを調整することも可能であるが、プログラムの修正が必要となるため、プログラムを作成するユーザの負担が大きくなり、また、命令コードのサイズも大きくなるため好ましくない。
【課題を解決するための手段】
【００３０】
本発明にかかるループ制御回路は、命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御回路であって、前記ループ命令のパイプライン処理が終了するまで、前記ループ終端命令のパイプライン処理を保留するインターロック発生回路を有するものである。
【００３１】
このループ制御回路によれば、ループ命令の実行が完了するまでインターロックを発生させるため、ループエンド判定のタイミングをループ命令実行後とすることができ、正確にループエンド判定を行うことができる。
【００３２】
本発明にかかるループ制御回路は、命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御回路であって、パイプライン処理する命令のアドレスを順次示すプログラムカウンタと、前記ループ終端命令のアドレスであるループ終端アドレスを計算するループ終端アドレス計算回路と、前記ループ命令のパイプライン処理が完了するまで、前記計算されたループ終端アドレスと前記プログラムカウンタとの比較結果に基づいて、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留するインターロック発生回路とを有するものである。
【００３３】
このループ制御回路によれば、ループ命令の実行が完了するまでインターロックを発生させるため、ループエンド判定のタイミングをループ命令実行後とすることができ、正確にループエンド判定を行うことができる。
【００３４】
本発明にかかるループ制御方法は、命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御方法であって、前記ループ命令のパイプライン処理が終了するまでの間、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留するものである。
【００３５】
このループ制御方法によれば、ループ命令の実行が完了するまでインターロックを発生させるため、ループエンド判定のタイミングをループ命令実行後とすることができ、正確にループエンド判定を行うことができる。
【００３６】
本発明にかかるループ制御方法は、命令をパイプライン処理するプロセッサにおいて、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御するループ制御方法であって、パイプライン処理する命令のアドレスをプログラムカウンタで順次示し、前記ループ終端命令のアドレスであるループ終端アドレスを計算し、前記ループ命令のパイプライン処理が終了するまで、前記計算されたループ終端アドレスと前記プログラムカウンタとの比較結果に応じて、インターロックを発生させ、前記ループ終端命令のパイプライン処理を保留するものである。
【００３７】
このループ制御方法によれば、ループ命令の実行が完了するまでインターロックを発生させるため、ループエンド判定のタイミングをループ命令実行後とすることができ、正確にループエンド判定を行うことができる。
【発明の効果】
【００３８】
本発明によれば、パイプラインの構成が変わっても、ループエンド判定を正確に行うことができるループ制御回路及びループ制御方法を提供することができる。
【発明を実施するための最良の形態】
【００３９】
発明の実施の形態１．
まず、本発明の実施の形態１にかかるプロセッサについて説明する。本実施形態にかかるプロセッサでは、ループ命令の実行完了までインターロックを発生させてループ先頭命令の実行を保留し、ループ命令の実行後にループ先頭命令の実行を開始することを特徴としている。
【００４０】
図１を用いて、本実施形態にかかるプロセッサの構成について説明する。例えば、このプロセッサ１は、命令をパイプライン処理するプロセッサであり、ループ命令の実行が可能なＤＳＰである。図に示されるように、プロセッサ１は、命令メモリ２０１、フェッチ回路２０２、デコード回路２０３、演算回路２０４、データメモリアクセス回路２０５、データメモリ２０６、ループ制御回路１００を備えている。ループ制御回路１００は、プログラムカウンタ１０１、ＬＥＡ計算回路１１１、ＬＥＡレジスタ１１３、ＬＳＡ計算回路１２１、仮ＬＳＡレジスタ１２２、ＬＳＡレジスタ１２３、ループカウンタ１０２、ループエンド判定回路１３０、インターロック発生回路１４０を有している。
【００４１】
命令メモリ２０１には、実行する命令があらかじめ格納されている。この命令は、ユーザが作成したプログラムをコンパイルした結果、得られるマシン語コードである。
【００４２】
フェッチ回路２０２は、命令メモリ２０１から命令をフェッチする（読み出す）。プログラムカウンタ１０１はパイプライン処理する命令のアドレスを順次示しており、フェッチ回路２０２は、このプログラムカウンタ１０１が示すアドレスの命令をフェッチする。すなわち、フェッチ回路２０２は、パイプラインのフェッチフェーズ（ＩＦフェーズやＩＦ１〜ＩＦ３フェーズ）の処理を実行する。例えば、フェッチ回路２０２は、ＦＩＦＯ（First In First Out）方式のバッファであり、フェッチした命令が、入力された順序でデコード回路２０３へ出力される。
【００４３】
デコード回路２０３は、フェッチ回路２０２がフェッチした命令について、プログラムカウンタの計算やデコードを行う。すなわち、デコード回路２０３は、パイプラインのデコードフェーズ（ＤＥ１，ＤＥ２フェーズ）の処理を実行する。
【００４４】
演算回路２０４とデータメモリアクセス回路２０５は、デコード回路２０３のデコード結果に基づい処理を実行する。すなわち、演算回路２０４とデータメモリアクセス回路２０５は、パイプラインの実行フェーズ（ＥＸＥフェーズやＥＸ１〜ＥＸ３フェーズ）の処理を実行する。演算回路２０４は、加算等の各種演算を行う。データメモリ２０６は、演算結果などを格納するメモリであり、データメモリアクセス回路２０５は、このデータメモリ２０６にアクセスしデータの書き込み／読み出しを行う。
【００４５】
ループ制御回路１００は、デコードされた命令がループ命令の場合に、ループ命令に応じてループ先頭命令からループ終端命令までの命令の繰り返し実行を制御する。尚、ここでは図示を省略しているが、プロセッサ１は、分岐処理等を行うプログラム制御回路を有しており、ループ制御回路１００は、このプログラム制御回路の一部として動作していてもよい。
【００４６】
ループカウンタ１０２は、ループ内命令を繰り返すループ回数を示すカウンタである。ループカウンタ１０２には、ループ命令のオペランドに指定された「ループ回数−１」のＬＣ値が設定され、ループ毎にＬＣ値がデクリメントされる。
【００４７】
ＬＳＡ計算回路（ループ先頭アドレス計算回路）１２１は、ループ命令のパイプライン処理中にＬＳＡを計算する。特に、ＬＳＡ計算回路１２１は、ループ命令の実行フェーズより前、すなわち、ループ命令のデコードフェーズの次のフェーズ（ＡＣフェーズ）のタイミングでＬＳＡを計算する。ＬＳＡ計算回路１２１は、ループ命令のＡＣフェーズのときのＰＣ値をＬＳＡとする。尚、ＬＳＡの計算は、ＡＣフェーズに限らず、ループ命令のパイプライン処理に含まれるパイプラインフェーズのうち、ループ先頭命令のアドレスがプログラムカウンタに設定されるタイミングに処理されるパイプラインフェーズであればよい。
【００４８】
仮ＬＳＡレジスタ１２２は、ＬＳＡ計算回路１２１が計算したＬＳＡをループ命令の実行フェーズまで保持する。ＬＳＡレジスタ１２３は、仮ＬＳＡレジスタ１２２が保持していたＬＳＡを、ループ命令の実行フェーズ終了後に保持する。
【００４９】
ＬＥＡ計算回路（ループ終端アドレス計算回路）１１１は、ループ命令のパイプライン処理中にＬＥＡを計算する。ＬＥＡ計算回路１１１は、ループ命令のデコードフェーズの次のフェーズ（ＡＣフェーズ）から実行フェーズ（ＥＸ３フェーズ）までの間にＬＥＡを計算する。例えば、ＬＥＡ計算回路１１１は、ループ命令の実行フェーズにおいてＬＥＡを計算する。ＬＥＡ計算回路１１１は、デコードしたループ命令のマシン語コード中にあらかじめ含まれたアドレス（オフセット値）が設定される。例えば、このオフセット値は、プログラムのコンパイル時にコンパイラ等によって設定される。
【００５０】
ＬＥＡレジスタ１１３は、ＬＥＡ計算回路１１１が計算したＬＥＡを、ループ命令の実行フェーズ終了後に保持する。
【００５１】
ループエンド判定回路（ループ終端判定回路）１３０は、ループ内命令の繰り返しが終了するかどうかループエンド判定（ループ終端判定）を行う。ループエンド判定は、現在の処理がループ終端命令に達したかどうか、つまりＰＣ値がＬＥＡと一致するかという判定（ＰＣ値判定）と、ループ回数がループ命令で指定された回数に達したかどうか、つまりＬＣ値が０と一致するかという判定（ＬＣ値判定）を含んでいる。比較器１３１は、ＰＣ値とＬＥＡレジスタ１１３のＬＥＡを比較し、比較器１３２は、ループカウンタ１０２のＬＣ値と０を比較する。
【００５２】
インターロック発生回路１４０は、ループ命令のパイプライン処理におけるデコードフェーズの次のフェーズ（ＡＣフェーズ）から実行フェーズ（ＥＸ３フェーズ）終了までの間、インターロックを発生させ、ループ先頭命令のパイプライン処理を保留する。すなわち、本実施形態では、インターロックによってループ先頭命令の処理を保留することによって、ループ命令のパイプライン処理が終了するまでの間、ループ終端命令のパイプライン処理を保留している。インターロックとは、プログラムカウンタ１０１のＰＣ値のインクリメントを停止し、現在のＰＣ値を維持させることである。ＰＣ値が変更されなければ、フェッチ回路２０２による次の命令のフェッチが停止するため、次の命令のパイプライン処理が実行されない。
【００５３】
例えば、パイプラインの段数が増加した場合、インターロック発生回路１４０は、以前のパイプラインとの差分によるパイプラインハザードを考慮したインターロックを発生させる。このインターロック期間は、設計者がハードウェアの設計時にあらかじめ設定する。図１０（ａ）のパイプラインから、図１０（ｂ）のパイプラインに変更する場合、実行フェーズ（ＥＸ３フェーズ）がデコードフェーズ（ＤＥ２フェーズ）の４サイクル後に移動するので、インターロック期間を４サイクルとする。
【００５４】
次に、図２を用いて、本実施形態にかかるプロセッサのループ制御方法について説明する。フェッチ回路２０２が命令メモリ２０１から命令をフェッチすると、デコード回路２０３は、フェッチされた命令をデコードし、ループ命令かどうか判定する（Ｓ１０１）。
【００５５】
Ｓ１０１において、デコードした命令がループ命令の場合、インターロック発生回路１４０は、ループ命令の実行フェーズ完了までインターロックを行う（Ｓ１０２）。これにより、ループ命令の実行が完了するまで、ループ先頭命令の実行を保留する。
【００５６】
また、Ｓ１０１でループ命令の場合にＳ１０２のインターロックと平行して、Ｓ１０３〜Ｓ１０６の処理が行われる。すなわち、ループカウンタ１０２は、ループ命令で指定されたループ回数をＬＣ値として設定する（Ｓ１０３）。次いで、ループ命令のＡＣフェーズで、ＬＳＡ計算回路１２１は、ＬＳＡを計算して計算したＬＳＡを仮ＬＳＡレジスタ１２２に設定する（Ｓ１０４）。次いで、ループ命令の実行（ＥＸ３）フェーズで、ＬＥＡ計算回路１１１はＬＥＡを計算する（Ｓ１０５）。次いで、ＬＳＡ計算回路１２１は仮ＬＳＡレジスタ１２２に保持されたＬＳＡをＬＳＡレジスタ１２３に設定し、ＬＥＡ計算回路１１１はＬＥＡレジスタ１１３に計算したＬＥＡを設定する（Ｓ１０６）。
【００５７】
Ｓ１０１でループ命令以外の場合、もしくは、Ｓ１０２のインターロック及びＳ１０６のＬＳＡ／ＬＥＡ設定に次いで、ループエンド判定回路１３０は、現在ループ内命令の処理中かどうか判定する（Ｓ１０７）。Ｓ１０７においてループ処理中である場合、ループエンド判定回路１３０は、Ｓ１０８及びＳ１０９によりループエンド判定を行う。すなわち、ループエンド判定回路１３０は、比較器１３１によってプログラムカウンタ１０１のＰＣ値とＬＥＡレジスタ１１３のＬＥＡを比較し、一致／不一致を判定する（Ｓ１０８）。Ｓ１０８においてＰＣ値がＬＥＡと一致した場合、ループエンド判定回路１３０は、比較器１３２によって、ループカウンタ１０２のＬＣ値と０を比較し、一致／不一致を判定する（Ｓ１０９）。Ｓ１０９においてＬＣ値が０と不一致の場合、ループエンド判定回路１３０は、プログラムカウンタ１０１のＰＣ値にＬＳＡレジスタ１２３のＬＳＡを設定し（Ｓ１１０）、ループカウンタ１０２は、ＬＣ値をデクリメントする（Ｓ１１１）。
【００５８】
また、Ｓ１０７においてループ処理中ではない場合、Ｓ１０８においてＰＣ値がＬＥＡと不一致の場合、Ｓ１０９においてＬＣ値が０と一致した場合、プログラムカウンタ１０１は、ＰＣ値をインクリメントする（Ｓ１１２）。
【００５９】
次に、本実施形態にかかるプロセッサ１において、各命令がパイプライン処理される例について説明する。
【００６０】
本実施形態では、ループ命令のデコードフェーズの次のフェーズから実行フェーズの完了までのインターロックを発生させるため、図１０（ａ）のようにデコードフェーズの次のフェーズが実行フェーズとなっているパイプラインをプロセッサ１に適用した場合には、インターロックは発生せず、また、ＬＳＡ／ＬＥＡの計算・設定もＥＸＥフェーズで行われるため、図１４と同じ動作となる。
【００６１】
図３は、プロセッサ１に図１０（ｂ）のパイプラインを適用して、図１３のプログラムを実行した場合のパイプライン処理を示している。
【００６２】
クロックサイクル「１〜９」で、ループ命令のＩＦ１〜ＩＦ３、ＤＥ１、ＤＥ２、ＡＣ、ＥＸ１〜ＥＸ３の９フェーズのパイプラインが処理され、クロックサイクル「２〜１０」で、ノップ命令のパイプラインが処理され、続いて、第１命令〜第３命令が順次処理される。
【００６３】
クロックサイクル「５」のループ命令・ＤＥ２フェーズでループ命令がデコードされると、クロックサイクル「６」のループ命令・ＡＣフェーズからクロックサイクル「９」のループ命令・ＥＸ３フェーズまでの４サイクルの間、インターロックを発生させる（Ｓ１０２）。したがって、クロックサイクル「６」から「９」までは、第１命令のパイプライン処理が保留されるため、第１命令のデコードフェーズ（ＤＥ２フェーズ）が処理されない。
【００６４】
また、クロックサイクル「６」のループ命令・ＡＣフェーズでＬＳＡが計算され、クロックサイクル「６」から「７」に進むタイミングでＬＳＡが仮ＬＳＡレジスタ１２２に設定される。このとき、ＬＳＡは、クロックサイクル「６」のとき、すなわちループ命令・ＡＣフェーズのときのＰＣ値となり、この値が仮ＬＳＡレジスタ１２２に設定される。クロックサイクル「６」のときのＰＣ値は、ノップ命令によって１サイクルずれて第１命令のアドレスであり、この第１命令のアドレスがＬＳＡとなる。
【００６５】
クロックサイクル「９」のループ命令・ＥＸ３フェーズでＬＥＡが計算される（Ｓ１０５）。ＬＥＡは、ループ命令のマシン語コード中に含まれたアドレスとなる。ここでは、ＬＥＡは第３命令のアドレスとなる。
【００６６】
クロックサイクル「９」から「１０」に進むタイミングでＬＳＡ／ＬＥＡが、ＬＳＡレジスタ／ＬＥＡレジスタに設定される（Ｓ１０６）。すなわち、ＬＳＡとして仮ＬＳＡレジスタ１２２に保持された第１命令のアドレスがＬＳＡレジスタ１２３に設定され、ＬＥＡとして計算された第３命令のアドレスがＬＥＡレジスタ１１３に設定される。
【００６７】
クロックサイクル「９」でループ命令の実行が完了するとインターロックが終了するため、クロックサイクル「１０」から第１命令のパイプライン処理が再開しデコードが行われる。そして、ＬＳＡ／ＬＥＡが設定されると、ループエンド判定が行われる。
【００６８】
クロックサイクル「１１」では、ＰＣ値が判定され（Ｓ１０８）、ＰＣ値が第２命令のアドレスでありＬＥＡと一致しないため、ＰＣ値がインクリメントされて（Ｓ１１２）、クロックサイクル「１２」で第２命令の次の第３命令がデコードされる。
【００６９】
クロックサイクル「１２」では、ＰＣ値が判定され（Ｓ１０８）、ＰＣ値が第３命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ１０９）、ＬＣ値が０ではないため、ＰＣ値がＬＳＡの第１命令のアドレスに設定され（Ｓ１１０）、ＬＣ値がデクリメントされて（Ｓ１１１）、クロックサイクル「１３」で第１命令のデコードが行われる。
【００７０】
さらに第１命令〜第３命令のパイプライン処理が１６回繰り返されると、クロックサイクル「５７」では、ＰＣ値が判定され（Ｓ１０８）、ＰＣ値が第３命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ１０９）、ＬＣ値が０であるため、ループエンドとなり、ＰＣ値がインクリメントされて（Ｓ１１２）、クロックサイクル「５８」でループ内命令の次の第４命令がデコードされる。
【００７１】
なお、ループ内命令の命令数が１命令のみのような最小ループ構成の場合、ループ先頭命令＝ループ終端命令であるため、ループ命令の実行が完了するまで、ループ終端命令（ループ先頭命令）の実行が保留される。
【００７２】
このように、本実施形態では、動作周波数向上のためにパイプラインの段数を増加する場合でも、パイプラインの段数差によって生じるパイプラインハザード分のインターロックを固定的に発生させるようにすることで、ループ命令の実行フェーズの完了までループ先頭命令の実行を保留し、ループ命令の実行完了前にループエンド判定が行われないようにした。これにより、常に、ループ命令の実行完了後にループ終端命令が実行されるため、正しくループエンド判定を行い、ループ内命令を指定された回数繰り返すことができる。
【００７３】
また、パイプライン段数を増やした場合、図１５の従来例では、クロックサイクル「９」のループ命令・ＥＸ３フェーズのときには、ノップ命令、第１命令〜第３命令の処理が進み、ＰＣ値は、ループ内命令の次の第４命令となっている。したがって、このときのＰＣ値をＬＳＡを設定すると、第１命令のアドレスではなく、第４命令のアドレスが設定されてしまう。すなわち、従来例では、ＬＳＡに、正しいループ先頭命令のアドレスではなく、ループ先頭命令よりも後の命令のアドレスが誤って設定されてしまうという問題がある。そうすると、ループ処理を繰り返したときに、誤って設定されたＬＳＡの指す命令から繰り返しが開始されてしまい、本来のＬＳＡから誤ったＬＳＡまでの命令が繰り返し実行されなくなってしまう。
【００７４】
本実施形態では、ループ命令の実行フェーズではなく、ループ命令のデコードフェーズの次のフェーズにおいてＬＳＡを計算して仮ＬＳＡレジスタに保持してから、ループ命令の実行完了後にＬＳＡレジスタに設定することで、パイプライン増加前と同様に、正しいＬＳＡを設定することができる。
【００７５】
したがって、動作周波数向上のためにパイプラインの段数を増やした場合に、既存プログラムに対しノップ命令を追加するなどの修正を行う必要がなく、ソフトウェアの互換性を維持することができる。
【００７６】
発明の実施の形態２．
次に、本発明の実施の形態２にかかるプロセッサについて説明する。本実施形態にかかるプロセッサでは、ループ命令の実行完了よりもループ終端命令が先に実行される場合にのみインターロックをかけてループ終端命令の実行を中断し、ループ命令の実行後にループ終端命令を実行することを特徴としている。
【００７７】
図４を用いて、本実施形態にかかるプロセッサの構成について説明する。尚、図４において、図１と同一の符号を付されたものは同様の要素である。図に示されるように、このプロセッサ１は、図１の構成に加えて、ループ制御回路１００内に、仮ＬＥＡレジスタ１１２を有している。
【００７８】
本実施形態では、ＬＥＡ計算回路１１１は、ループ命令の実行フェーズより前、すなわち、ループ命令のデコードフェーズの次のフェーズ（ＡＣフェーズ）のタイミングでＬＥＡを計算する。尚、ＬＥＡの計算は、ＡＣフェーズに限らず、ループ命令のパイプライン処理に含まれるパイプラインフェーズのうち、デコードフェーズの次のフェーズから実行フェーズまでの任意のパイプラインフェーズであればよい。
【００７９】
仮ＬＥＡレジスタ１１２は、ＬＥＡ計算回路１１１が計算したＬＥＡを、ループ命令の実行フェーズまで保持する。ＬＥＡレジスタ１１３は、仮ＬＥＡレジスタ１１２が保持していたＬＥＡを、ループ命令の実行フェーズ終了後に保持する。
【００８０】
インターロック発生回路１４０は、ループ命令のパイプライン処理におけるデコードフェーズの次のフェーズ（ＡＣフェーズ）から実行フェーズ（ＥＸ３フェーズ）終了までの間、インターロックを発生させ、ループ終端命令のパイプライン処理を保留する。特に、インターロック発生回路１４０は、ループ命令のパイプライン処理終了前、つまりループ命令の実行フェーズ以前、インターロックチェックを行い、ループ終端命令のパイプライン処理が実行されるような場合に、インターロックを発生させる。インターロックチェックは、現在の処理がループ終端命令に達したかどうか、つまりＰＣ値がＬＥＡと一致するかという判定を含んでいる。比較器１４１は、ＰＣ値と仮ＬＥＡレジスタ１１２のＬＥＡを比較する。
【００８１】
次に、図５を用いて、本実施形態にかかるプロセッサのループ制御方法について説明する。まず、図２のＳ１０１と同様に、デコード回路２０３はデコードした命令がループ命令かどうか判定する（Ｓ２０１）。
【００８２】
Ｓ２０１において、デコードした命令がループ命令の場合、ループカウンタ１０２は、ループ命令で指定されたループ回数をＬＣ値として設定する（Ｓ２０２）。次いで、ループ命令のＡＣフェーズで、ＬＳＡ計算回路１２１は、ＬＳＡを計算して計算したＬＳＡを仮ＬＳＡレジスタ１２２に設定し、ＬＥＡ計算回路１１１は、ＬＥＡを計算して計算したＬＥＡを仮ＬＥＡレジスタ１１２に設定する（Ｓ２０３）。次いで、インターロック発生回路１４０は、ループ命令の実行完了までインターロックチェックを行う（Ｓ２０４）。
【００８３】
図６は、このインターロックチェック処理を示している。インターロックチェック処理では、まず、インターロック発生回路１４０は、ループ命令の実行フェーズの終了を判定する（Ｓ３０１）。
【００８４】
Ｓ３０１において、ループ命令の実行フェーズがまだ終了していない場合、インターロック発生回路１４０は、比較器１４１によって、ＰＣ値と仮ＬＥＡレジスタ１１２のＬＥＡを比較し、一致／不一致を判定する（Ｓ３０２）。この判定は、実行フェーズ終了まで繰り返し行われる。
【００８５】
Ｓ３０２において、ＰＣ値がＬＥＡと一致した場合、インターロック発生回路１４０は、ループ命令の実行フェーズ終了までインターロックを発生させる（Ｓ３０３）。これにより、ループ命令の実行が完了するまで、ループ終端命令の実行を保留する。
【００８６】
Ｓ３０１において、ループ命令の実行フェーズがすでに終了している場合、もしくは、Ｓ３０２において、ＰＣ値がＬＥＡと不一致の場合、インターロック発生回路１４０は、インターロックを発生させない。
【００８７】
Ｓ２０４のインターロックチェック処理が終了すると、図５に示すように、ＬＳＡ計算回路１２１は仮ＬＳＡレジスタ１２２に保持されたＬＳＡをＬＳＡレジスタ１２３に設定し、ＬＥＡ計算回路１１１は仮ＬＥＡレジスタ１１２に保持されたＬＥＡをＬＥＡレジスタ１１３に設定する（Ｓ２０５）。
【００８８】
続いて、Ｓ２０６以降では、図２のＳ１０７以降と同様に、ループエンド判定が行われる。すなわち、Ｓ２０１でループ命令以外の場合、もしくは、Ｓ２０５のＬＳＡ／ＬＥＡ設定に次いで、現在ループ内命令の処理中かどうか判定し（Ｓ２０６）、ループ処理中である場合、Ｓ２０７及びＳ２０８によりループエンド判定を行う。ループエンド判定回路１３０は、比較器１３１によってＰＣ値とＬＥＡを比較し（Ｓ２０７）、ＰＣ値がＬＥＡと一致した場合、比較器１３２によって、ＬＣ値と０を比較する（Ｓ２０８）。Ｓ２０８においてＬＣ値が０と不一致の場合、ループエンド判定回路１３０は、プログラムカウンタ１０１のＰＣ値にＬＳＡレジスタ１２３のＬＳＡを設定し（Ｓ２０９）、ループカウンタ１０２は、ＬＣ値をデクリメントする（Ｓ２１０）。
【００８９】
また、Ｓ２０６においてループ処理中ではない場合、Ｓ２０７においてＰＣ値がＬＥＡと不一致の場合、Ｓ２０８においてＬＣ値が０と一致した場合、プログラムカウンタ１０１は、ＰＣ値をインクリメントする（Ｓ２１１）。
【００９０】
次に、本実施形態にかかるプロセッサ１において、各命令がパイプライン処理される例について説明する。
【００９１】
本実施形態では、ループ命令の実行フェーズの完了までにループ終端命令が実行される場合にのみインターロックを発生させるため、図１０（ａ）のように実行フェーズが１フェーズのみのパイプラインをプロセッサ１に適用した場合には、インターロックは発生せず、また、ＬＳＡ／ＬＥＡの計算・設定もＥＸＥフェーズで行われるため、図１４と同じ動作となる。
【００９２】
図７は、プロセッサ１に図１０（ｂ）のパイプラインを適用して、図１３のプログラムを実行した場合のパイプライン処理を示している。
【００９３】
クロックサイクル「１〜９」で、ループ命令のＩＦ１〜ＩＦ３、ＤＥ１、ＤＥ２、ＡＣ、ＥＸ１〜ＥＸ３の９フェーズのパイプラインが処理され、クロックサイクル「２〜１０」で、ノップ命令のパイプラインが処理され、続いて、第１命令〜第３命令が順次処理される。
【００９４】
クロックサイクル「５」のループ命令・ＤＥ２フェーズでループ命令がデコードされると、クロックサイクル「６」のループ命令・ＡＣフェーズでＬＳＡ／ＬＥＡが計算され、クロックサイクル「６」から「７」に進むタイミングでＬＳＡ／ＬＥＡが仮ＬＳＡレジスタ１２２／仮ＬＥＡレジスタ１１２に設定される（Ｓ２０３）。このとき、実施の形態１と同様に、ＬＳＡは、クロックサイクル「６」のときのＰＣ値である第１命令のアドレスとなり、ＬＥＡは、ループ命令のマシン語コードから第３命令のアドレスとなる。
【００９５】
そして、クロックサイクル「７」から「９」のループ命令の実行フェーズ完了まで、インターロックチェックを行う（Ｓ２０４）。インターロックチェックでは、ＰＣ値と仮ＬＥＡレジスタ１１２のＬＥＡを比較する（Ｓ３０２）。クロックサイクル「７」では、ＰＣ値が第２命令のアドレスであり仮ＬＥＡレジスタ１１２のＬＥＡと一致しないため、インターロックは発生せず、第２命令がデコードされる。クロックサイクル「８」では、ＰＣ値が第３命令のアドレスであり仮ＬＥＡレジスタ１１２のＬＥＡと一致するため、ループ命令の実行完了までインターロックを発生させる（Ｓ３０３）。したがって、クロックサイクル「８」から「９」までは、第３命令のパイプライン処理が保留されるため、第３命令のデコードフェーズ（ＤＥ２フェーズ）が処理されない。
【００９６】
クロックサイクル「９」から「１０」に進むタイミングでＬＳＡ／ＬＥＡが、ＬＳＡレジスタ１２３／ＬＥＡレジスタ１１３に設定される（Ｓ２０５）。すなわち、ＬＳＡとして仮ＬＳＡレジスタ１２２に保持された第１命令のアドレスがＬＳＡレジスタ１２３に設定され、ＬＥＡとして仮ＬＥＡレジスタ１１２に保持された第３命令のアドレスがＬＥＡレジスタ１１３に設定される。
【００９７】
クロックサイクル「９」でループ命令の実行が完了するとインターロックチェックが終了し、発生させていたインターロックも終了するため、クロックサイクル「１０」から第３命令のパイプライン処理が再開しデコードが行われる。そして、ＬＳＡ／ＬＥＡが設定されると、ループエンド判定が行われる。
【００９８】
クロックサイクル「１０」では、ＰＣ値が判定され（Ｓ２０７）、ＰＣ値が第３命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ２０８）、ＬＣ値が０ではないため、ＰＣ値がＬＳＡの第１命令のアドレスに設定され（Ｓ２０９）、ＬＣ値がデクリメントされて（Ｓ２１０）、クロックサイクル「１１」で第１命令のデコードが行われる。
【００９９】
さらに第１命令〜第３命令のパイプライン処理が１６回繰り返されると、クロックサイクル「５５」では、ＰＣ値が判定され（Ｓ２０７）、ＰＣ値が第３命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ２０８）、ＬＣ値が０であるため、ループエンドとなり、ＰＣ値がインクリメントされて（Ｓ２１１）、クロックサイクル「５６」でループ内命令の次の第４命令がデコードされる。
【０１００】
このように、本実施形態では、必要な場合に必要な期間、つまりループ終端命令が実行されようとしたときからループ命令の実行終了までの間のみループ終端命令をインターロックするため、常にループ先頭命令を固定的にインターロックする実施の形態１と比べて、インターロックの期間を短くすることができる。
【０１０１】
次に、本実施形態にかかるプロセッサ１において、他のプログラムを実行する例について説明する。
【０１０２】
図８は、ここで実行するプログラムの例である。図８の例では、図１３と同様にループ命令、ノップ命令が記述され、さらに、ループ内命令を第１命令から第５命令の５つとして、ループ内命令に続く命令を第６命令としている。すなわち、このプログラムは、第１命令〜第５命令を１６回繰り返し実行した後、第６命令を実行することを意味している。
【０１０３】
図９は、プロセッサ１に図１０（ｂ）のパイプラインを適用して、図８のプログラムを実行した場合のパイプライン処理を示している。
【０１０４】
クロックサイクル「１〜９」で、ループ命令のＩＦ１〜ＩＦ３、ＤＥ１、ＤＥ２、ＡＣ、ＥＸ１〜ＥＸ３の９フェーズのパイプラインが処理され、クロックサイクル「２〜１０」で、ノップ命令のパイプラインが処理され、続いて、第１命令〜第５命令が順次処理される。
【０１０５】
クロックサイクル「５」のループ命令・ＤＥ２フェーズでループ命令がデコードされると、クロックサイクル「６」のループ命令・ＡＣフェーズでＬＳＡ／ＬＥＡが計算され、クロックサイクル「６」から「７」に進むタイミングでＬＳＡ／ＬＥＡが仮ＬＳＡレジスタ１２２／仮ＬＥＡレジスタ１１２に設定される（Ｓ２０３）。このとき、図７と同様に、ＬＳＡは、クロックサイクル「６」のときのＰＣ値である第１命令のアドレスとなり、ＬＥＡは、ループ命令のマシン語コードから第５命令のアドレスとなる。
【０１０６】
そして、クロックサイクル「７」から「９」のループ命令の実行完了まで、ＰＣ値と仮ＬＥＡレジスタ１１２のＬＥＡを比較し、インターロックチェックを行う（Ｓ２０４）。
【０１０７】
クロックサイクル「７」では、ＰＣ値が第２命令のアドレスであり仮ＬＥＡと一致しないため、インターロックは発生せず、第２命令がデコードされる。クロックサイクル「９」では、ＰＣ値が第４命令のアドレスであり仮ＬＥＡと一致しないため、インターロックは発生せず、第４命令がデコードされる。
【０１０８】
クロックサイクル「９」でループ命令が実行され、クロックサイクル「９」から「１０」に進むタイミングで仮ＬＳＡレジスタ１２２のＬＳＡ／仮ＬＥＡレジスタ１１２のＬＥＡが、ＬＳＡレジスタ１２３／ＬＥＡレジスタ１１３に設定される（Ｓ２０５）。
【０１０９】
クロックサイクル「９」でループ命令の実行が完了するとインターロックチェックが終了するため、この場合インターロックを発生させることがない。そして、ＬＳＡ／ＬＥＡが設定されると、ループエンド判定が行われる。
【０１１０】
クロックサイクル「１０」では、ＰＣ値が判定され（Ｓ２０７）、ＰＣ値が第５命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ２０８）、ＬＣ値が０ではないため、ＰＣ値がＬＳＡの第１命令のアドレスに設定され（Ｓ２０９）、ＬＣ値がデクリメントされて（Ｓ２１０）、クロックサイクル「１１」で第１命令のデコードが行われる。
【０１１１】
さらに第１命令〜第３命令のパイプライン処理が１６回繰り返されると、クロックサイクル「８５」では、ＰＣ値が判定され（Ｓ２０７）、ＰＣ値が第５命令のアドレスでありＬＥＡと一致し、ＬＣ値が判定され（Ｓ２０８）、ＬＣ値が０であるため、ループエンドとなり、ＰＣ値がインクリメントされて（Ｓ２１１）、クロックサイクル「８６」でループ内命令の次の第６命令がデコードされる。
【０１１２】
このように、本実施形態では、不要な場合はインターロックを発生させないため、常にループ先頭命令をインターロックする実施の形態１と比べて、サイクル効率を向上することができる。
【０１１３】
以上のように、本実施形態では、動作周波数向上のためにパイプラインの段数を増加する場合でも、ループ命令の実行完了前にループ終端命令が実行される場合にのみインターロックを発生させるようにすることで、ループ命令の実行フェーズの完了までループ終端命令の実行を保留し、ループ命令の実行完了前にループエンド判定が行われないようにした。これにより、常に、ループ命令の実行完了後にループ終端命令が実行されるため、正しくループエンド判定を行い、ループ内命令を指定された回数繰り返すことができる。
【０１１４】
そして、ＰＣ値と仮ＬＥＡレジスタの値を比較することで、ループ命令の実行完了前にループ終端命令が実行されようとした場合にインターロックを発生させ、ループ命令の実行完了前にループ終端命令が実行されない場合にインターロックを発生させないため、実施の形態１のように、ループ命令の場合に無条件でインターロックを発生させる場合に比べて、インターロック期間を短縮できサイクル性能を向上することができる。例えば、プログラムが、ループの中にループを含むようなループの入れ子（ネスト）構造の場合には、内部のループが何度も繰り返し実行されることになり、ループ命令におけるインターロック期間の短縮の効果が大きい。
【０１１５】
また、実施の形態１と同様に、ループ命令のデコードフェーズの次のフェーズにおいてＬＳＡを計算するため、正しいＬＳＡを設定することができる。したがって、パイプラインの段数を増やす前の既存プログラムに対し修正を行う必要がなく、ソフトウェアの互換性を維持することができる。
【０１１６】
尚、上述の実施の形態に限らず、このほか、本発明の要旨を逸脱しない範囲で種々の変形、実施が可能である。例えば、上述の例では、インターロックにより命令の実行を保留したが、その他の方法により命令の実行を保留してもよい。また、上述の例では、ループ先頭命令、もしくは、ループ終端命令の実行を保留したが、ループ内命令の他の命令の実行を保留してもよい。また、上述の例では、ＬＳＡは命令コード中に含まれず、ループ命令実行時に計算するものとしたが、ＬＥＡと同様にＬＳＡを命令コード中に含んでいてもよい。また、上述のプロセッサは、ＤＳＰとして説明したが、これに限らず、その他のプロセッサでもよい。
【図面の簡単な説明】
【０１１７】
【図１】本発明にかかるプロセッサの構成図である。
【図２】本発明にかかるループ制御方法を示すフローチャートである。
【図３】本発明にかかるプロセッサによるループ命令の実行例を示す図である。
【図４】本発明にかかるプロセッサの構成図である。
【図５】本発明にかかるループ制御方法を示すフローチャートである。
【図６】本発明にかかるインターロックチェック方法を示すフローチャートである。
【図７】本発明にかかるプロセッサによるループ命令の実行例を示す図である。
【図８】ループ命令のプログラム例を示す図である。
【図９】本発明にかかるプロセッサによるループ命令の実行例を示す図である。
【図１０】パイプラインの構成例を示す図である。
【図１１】従来のプロセッサの構成図である。
【図１２】従来のループ制御方法を示すフローチャートである。
【図１３】ループ命令のプログラム例を示す図である。
【図１４】従来のプロセッサによるループ命令の実行例を示す図である。
【図１５】従来のプロセッサによるループ命令の実行例を示す図である。
【符号の説明】
【０１１８】
１  プロセッサ
１００  ループ制御回路
１０１  プログラムカウンタ（ＰＣ）
１０２  ループカウンタ（ＬＣ）
１１１  ＬＥＡ計算回路
１１２  仮ＬＥＡレジスタ
１１３  ＬＥＡレジスタ
１２１  ＬＳＡ計算回路
１２２  仮ＬＳＡレジスタ
１２３  ＬＳＡレジスタ
１３０  ループエンド判定回路
１３１，１３２  比較器
１４０  インターロック発生回路
１４１  比較器
２０１  命令メモリ
２０２  フェッチ回路
２０３  デコード回路
２０４  演算回路
２０５  データメモリアクセス回路
２０６  データメモリ
【図１】
2007207145.tif 000003
【図２】
2007207145.tif 000004
【図３】
2007207145.tif 000005
【図４】
2007207145.tif 000006
【図５】
2007207145.tif 000007
【図６】
2007207145.tif 000008
【図７】
2007207145.tif 000009
【図８】
2007207145.tif 000010
【図９】
2007207145.tif 000011
【図１０】
2007207145.tif 000012
【図１１】
2007207145.tif 000013
【図１２】
2007207145.tif 000014
【図１３】
2007207145.tif 000015
【図１４】
2007207145.tif 000016
【図１５】
2007207145.tif 000017