(57)【要約】      （修正有）【課題】マイクロコンピュータの回路規模の増大を抑制しながら処理時間を短縮する。【解決手段】命令メモリ２０２からフェッチした命令コードを保持する命令キュー１０２と、パイプラインハザード発生期間において、命令キュー内に分岐命令が有るか否かを検索するキュー制御回路１０６を備える。マイクロコンピュータは、キュー制御回路によって検索された分岐命令に応じた分岐先命令のアドレスをフェッチアドレスとして命令メモリに指定し、パイプラインハザード期間終了時に実行する。【選択図】図４
2014056359.tif 000002
【特許請求の範囲】
【請求項１】
命令メモリからフェッチした命令コードを保持する命令キューと、
パイプラインハザード発生期間において、前記命令キューに対する先入先出し方式による命令コードのエンキュー及びデキューを停止し、前記命令キュー内の複数の命令コードを順に命令デコーダに出力するキュー制御回路と、
パイプラインハザード発生期間において、前記命令デコーダによってデコードされた命令コードが分岐命令の場合、前記分岐命令に応じた分岐先命令のアドレスをフェッチアドレスとして前記命令メモリに指定するフェッチアドレス設定回路と
を具備する
マイクロコンピュータ。
【請求項２】
請求項１に記載のマイクロコンピュータにおいて、
パイプラインハザード発生期間において、前記命令デコーダによってデコードされた命令コードが分岐命令の場合、前記キュー制御回路は、パイプラインハザードの解消後、前記分岐命令に応じた分岐先命令を他の命令に先行して前記命令キューに格納し、パイプラインハザード解消後において前記分岐命令が実行された後、前記分岐先命令を前記命令デコードに出力する
マイクロコンピュータ。
【請求項３】
請求項１又は２に記載のマイクロコンピュータにおいて、
前記命令キューにおいて分岐命令が格納されているかの調査が行われたか否かを示すフラグ情報を保持するＤＦフラグレジスタを更に具備し、
パイプラインハザード発生期間中、前記キュー制御回路は、前記ＤＦフラグレジスタのフラグ情報に基づき、前記命令キューにおいて、分岐命令が格納されているかの調査が行われていない命令コードを前記命令デコーダに出力する
マイクロコンピュータ。
【請求項４】
請求項１から３のいずれか１項に記載のマイクロコンピュータにおいて、
前記分岐先命令が、前記命令キューにおけるどのレジスタに保持されたかを示すフラグ情報を保持するＢＦフラグレジスタを更に具備し、
前記キュー制御回路は、パイプラインハザード解消後、前記ＢＦフラグレジスタのフラグ情報に基づいて前記命令キュー内における前記分岐先命令を特定する
マイクロコンピュータ。
【請求項５】
請求項１から４のいずれか１項に記載のマイクロコンピュータにおいて、
パイプラインハザードが発生していない期間、前記命令キューに前記分岐先命令が保持されている場合、前記フェッチアドレス設定回路は、前記分岐命令の実行に応じて前記分岐先命令の次のアドレスをフェッチアドレスとして前記命令メモリに指定する
マイクロコンピュータ。
【請求項６】
命令キューから先入先出し方式により命令コードを命令デコーダに出力するステップと、
パイプラインハザード発生期間において、前記命令キューに対する先入先出し方式による命令コードのエンキュー及びデキューを停止し、前記命令キュー内の複数の命令コードを順に命令デコーダに出力するステップと、
パイプラインハザード発生期間において、命令デコーダにおいてデコードされた命令コードが分岐命令の場合、前記分岐命令に応じた分岐先命令のアドレスをフェッチアドレスとして指定するステップと
を具備する
命令処理方法。
【請求項７】
請求項６に記載の命令処理方法において、
パイプラインハザード発生期間において、前記命令デコーダによってデコードされた命令コードが分岐命令の場合、
パイプラインハザードの解消後、前記分岐命令に応じた分岐先命令を他の命令に先行して前記命令キューに格納するステップと、
パイプラインハザード解消後において前記分岐命令が実行された後、前記分岐先命令を前記命令デコードに出力するステップと
を具備する
命令処理方法。
【請求項８】
請求項６又は７に記載の命令処理方法において、
前記命令キューにおいて分岐命令が格納されているかの調査が行われたか否かを示すフラグ情報をＤＦフラグレジスタに保持するステップを更に具備し、
前記命令キュー内の複数の命令コードを順に命令デコーダに出力するステップは、
前記ＤＦフラグレジスタのフラグ情報に基づき、前記命令キューにおいて、分岐命令が格納されているかの調査が行われていない命令コードを前記命令デコーダに出力するステップ
を備える
命令処理方法。
【請求項９】
請求項６から８のいずれか１項に記載の命令処理方法において、
前記分岐先命令が、前記命令キューにおけるどのレジスタに保持されたかを示すフラグ情報をＢＦフラグレジスタに保持するステップと、
パイプラインハザード解消後、前記ＢＦフラグレジスタのフラグ情報に基づいて前記命令キュー内における前記分岐先命令を特定するステップと
を更に具備する
命令処理方法。
【請求項１０】
請求項６から９のいずれか１項に記載の命令処理方法において、
パイプラインハザードが発生していない期間、前記命令キューに前記分岐先命令が保持されている場合、前記分岐命令の実行に応じて前記分岐先命令の次のアドレスをフェッチアドレスとして前記命令メモリに指定する
命令処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロコンピュータ及び命令処理方法に関し、特にメモリから命令コードをフェッチして命令を実行するマイクロコンピュータ及び命令処理方法に関する。
【背景技術】
【０００２】
近年、自動車電装やモバイル機器などを代表とする電子機器は、多機能化と高性能化を市場から求められている。このため、これらの電子機器を制御するマイクロコンピュータに対しても高性能化が求められている。一方、必要な性能に対して低コスト要求があるため、特に低価格帯のマイクロコンピュータに対しては、高性能と低コストの両立が求められている。
【０００３】
マイクロコンピュータの性能を低下させる要因の１つとして、分岐命令実行によって発生する分岐ペナルティによる性能低下があげられる。パイプライン処理により命令フェッチ、命令デコード及び実行を行うマイクロコンピュータでは、分岐命令の実行を終了した後に、分岐先命令のフェッチを開始しなければならない。このため、パイプラインに空きスロットが発生するハザード状態が発生して処理性能を低下させることがある。これを分岐ペナルティと言う。一般的にマイクロコンピュータが処理する命令のうち、約２０％が分岐命令である。従って、マイクロコンピュータの処理を高速化するには、この分岐ペナルティを回避し分岐命令を高速処理することが必要である。
【０００４】
この分岐ペナルティを回避する方法として、分岐命令の履歴に基づいて分岐先を予測し先行して命令フェッチを行う「分岐予測方法」が一般的に知られている。分岐予測方法では、過去の分岐命令が実行されたアドレスや、分岐先アドレス、分岐を行ったか否かの履歴に応じて分岐予測が行われる。このため、分岐予測方法を利用したマイクロコンピュータでは、アドレスや履歴を保持する回路が必要となり、更に履歴による制御回路が必要となることで回路規模や設計の複雑性が増加してしまう。
【０００５】
従って、性能向上とコスト削減の両立を求められるマイクロコンピュータにおいては、必要最小限の回路で最大限の性能向上を達成する技術が求められている。
【０００６】
パイプライン処理を行うマイクロコンピュータにおける分岐命令処理の高速化を目的とした技術が、例えば特開平８−３１４７２０に示されている（特許文献１参照）。
【０００７】
図１は、特許文献１に記載のマイクロコンピュータの分岐制御システム構成図である。特許文献１に記載のマイクロコンピュータは、先取り命令格納用バッファ１、命令デコーダ２、分岐命令検出回路３、先行分岐制御回路４、第１、第２のアドレス計算器５、６、及びアドレスセレクタ７を備える。先取り命令格納用バッファ１は、実行中の命令（０）の次の命令（１）及び次の命令（２）を格納する。命令デコーダ２は、命令（０）の実行と各々並行して、命令（１）を解読する。第１、第２のアドレス計算器５、６は、命令（１）、（２）のアドレス計算を専用に行う。分岐命令検出回路３は、命令（１）、（２）が分岐可能な分岐命令であることを個別に検出する。アドレスセレクタ７は、分岐命令検出回路３の検出結果に基づき第１、第２のアドレス計算器５、６からのアドレス計算結果を選択する。先行分岐制御回路４は、選択されたアドレスに基づき命令（１）、（２）の分岐を起動する。
【０００８】
分岐命令検出回路３が命令（１）を分岐命令として検出した場合、先行分岐制御回路４は、先取り命令アドレス計算器５からのアドレス計算結果を命令（１）の分岐先アドレスとして、この命令（１）の終了を待たずに、命令（１）による分岐起動をかける。先取りされた分岐命令（１）のアドレス計算は、専用のアドレス計算回路（第１のアドレス計算器５）により行われる。このことにより、実行中の命令（０）が、ロード命令やストア命令等、オペランドアドレス計算を必要とする命令であっても、先の命令（０）の実行中に先取りした分岐命令（１）のアドレス計算結果は有効となる。そして、命令（０）の終了を待たずに、このアドレス計算結果（分岐先アドレス）に基づいて分岐され、命令（１）が無効化される。
【０００９】
又、特許文献１に記載のマイクロコンピュータでは、実行中の命令（０）の次の命令（１）と共に、さらに次の命令（２）も先取りして、それぞれ個別に、並行したアドレス計算と上述の分岐命令の判定、及び、分岐命令の起動が行われる。その結果、命令（２）が分岐可能な分岐命令の場合、例えば、命令（０）及び命令（１）が分岐命令でなく、かつ、分岐命令（２）のアドレス計算に用いるベースレジスタの値が確定している（命令（０）、及び、命令（１）で、このベースレジスタを書き換えない）場合には、分岐命令（２）の取り出しに続いて（分岐ハザード無しで）、分岐先命令の取り出しを行う事ができ、分岐命令処理を高速化することができる。
【００１０】
又、複数命令同時発行（スーパースカラ）システムにおける複数命令同時取り込み機構を高速化する技術が、例えば、特開平７−１２１３７１に記載されている（特許文献２参照）。
【００１１】
図２は、特許文献２に記載の複数命令同時取り込み機構の構成図である。特許文献２に記載の複数命令同時取り込み機構は、第１及び第２のプリフェッチバッファ１１、１２、及びマルチプレクサ１３を備える。第１のプリフェッチバッファ１１は、１対の分岐先命令の一方の分岐先命令（ｔａｋｅｎ）を格納し、第２のプリフェッチバッファ１２は、他方の分岐先命令（ｎｏｔ  ｔａｋｅｎ）を格納する。マルチプレクサ１３は、２つのプリフェッチバッファ１１、１２から出力される一対の分岐先命令、又は命令キャッシュからフェッチされた命令のいずれかを選択して命令選択部１４に出力する。第１及び第２のプリフェッチバッファ１１、１２は、分岐命令によるパイプライン停止時間を利用して両方の分岐先命令を予め取り込んでおく。これにより、分岐命令の結果が決まる時には、分岐先命令のデコードから開始することができ、分岐先命令の実行が早まる。
【００１２】
更に、分岐命令による遅延を防止する技術が例えば特開平８―３３９２９９（特許文献３参照）、特開平１１−７３３１７（特許文献４参照）、特開平９−２８２１６３（特許文献５参照）に記載されている。
【００１３】
特許文献３には、制御の流れを変更（分岐）するまでに予告分岐命令の後に続いて実行されるべき少なくとも１つの命令の数を定義する予告分岐命令に基づいて実行することで分岐命令による遅延を生じさせない技術が記載されている。特許文献３に記載の技術では、分岐先のアドレスと分岐するまでに実行する命令数をもつ命令によって、予め分岐先の命令をフェッチしている。又、指定された命令数実行後にあらかじめフェッチされた分岐先命令が実行される。
【００１４】
特許文献４には、条件分岐の制御を行うプログラム制御方法が記載されている。特許文献４には、条件分岐命令の条件が確定するまでの期間に分岐先命令を先行的にパイプラインに投入することで条件分岐命令による遅延を生じさせない技術が記載されている。分岐条件が確定する期間に分岐先命令をフェッチすることで遅延を生じさせないが、分岐条件確定期間がない無条件分岐には適用できない。このため、無条件分岐時の分岐ペナルティを削減することができない。
【００１５】
特許文献５には、インストラクションフェッチステージでフェッチした分岐命令から分岐先アドレスを取り出し、分岐不成立の場合と分岐成立の場合との両方の制御フローに対応する命令コードを、次のクロックのインストラクションステージでフェッチするダブルインストラクションフェッチ技術が記載されている。ここでは、分岐不成立時、分岐成立時両方に対応する命令コードを同時にフェッチしているため、両方の命令を制御する回路が必要となり極小コストを目的としていない。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】特開平８−３１４７２０
【特許文献２】特開平７−１２１３７１
【特許文献３】特開平８−３３９２９９
【特許文献４】特開平１１−７３３１７
【特許文献５】特開平９−２８２１６３
【発明の概要】
【発明が解決しようとする課題】
【００１７】
特許文献１に記載のマイクロコンピュータでは、分岐命令検出回路３と第１のアドレス計算器５が分岐命令のために専用に持つ必要があり、その回路規模は大きくなってしまう。
【００１８】
特許文献２に記載の複数命令同時取り込み機構では、複数個命令を同時にデコードする複数個のデコーダと、複数の命令が同時実行可能化どうかを決定するスケジュール機構を専用に持つ必要があり、その回路規模は大きくなってしまう。
【００１９】
このように、特許文献１、２の技術を利用した場合、分岐ペナルティを回避するためにチップ面積が増大してしまうため、チップ面積の増大を抑制しながら分岐ペナルティを回避できるマイクロコンピュータが望まれている。
【課題を解決するための手段】
【００２０】
本発明によるマイクロコンピュータは、パイプラインハザード発生期間において、命令キュー内に分岐命令が有るか否かを検索するキュー制御回路を備える。マイクロコンピュータは、キュー制御回路によって検索された分岐命令による分岐先命令を先行フェッチし、パイプラインハザード期間終了後、分岐命令が実行されると先行フェッチ命令を実行する。
【発明の効果】
【００２１】
本発明によれば、マイクロコンピュータの回路規模の増大を抑制しながら処理時間を短縮することができる。
【００２２】
又、マイクロコンピュータの回路規模の増大を抑制しながら分岐ペナルティを回避することができる。
【図面の簡単な説明】
【００２３】
【図１】図１は、特許文献１に記載のマイクロコンピュータの構成を示す図である。
【図２】図２は、特許文献２に記載の複数命令同時取り込み機構の構成を示す図である。
【図３】図３は、本発明によるマイクロコンピュータの構成の一例を示す図である。
【図４】図４は、本発明によるマイクロコンピュータの命令フェッチ制御回路の構成の一例を示す図である。
【図５】図５は、本発明によるマイクロコンピュータのキュー制御回路の構成の一例を示す図である。
【図６】図６は、本発明に係る分岐アドレス生成回路の構成の一例を示す図である。
【図７】図７は、本発明によるマイクロコンピュータのパイプライン処理動作の一例を示すタイミングチャートである。
【図８】図８は、本発明によるマイクロコンピュータのパイプライン処理動作の他の一例を示すタイミングチャートである。
【発明を実施するための形態】
【００２４】
以下、添付図面を参照しながら本発明の実施の形態を説明する。図面において同一、又は類似の参照符号は、同一、類似、又は等価な構成要素を示している。
【００２５】
（構成）
図３は、実施の形態によるマイクロコンピュータ２００の構成の一例を示す図である。図３を参照して、本実施の形態におけるマイクロコンピュータ２００は、ＣＰＵ２０１（演算装置）、命令メモリ２０２、周辺ＩＯ２０９、データメモリ２１１を具備する。命令メモリ２０２は、ＣＰＵ２０１が実行する命令コードを格納するメモリである。ＣＰＵ２０１は、命令メモリ２０２内に格納された命令コードを読み出して実行し、実行結果に基づいて周辺ＩＯ２０９（例示：タイマユニット、シリアル転送ユニット）や、データメモリ２１１（例示、ＲＡＭ）に対してリードアクセス又はライトアクセスを行う。
【００２６】
ＣＰＵ２０１は、命令フェッチ制御回路２０３、命令デコーダ２０４、演算実行回路２０５、パイプライン制御回路２０６、メモリアクセス制御回路２０７、実行結果格納回路２０８、命令実行制御回路２１０を備える。命令フェッチ制御回路２０３は、命令メモリ２０２から命令コードのフェッチの制御を行う。命令デコーダ２０４は、フェッチされた命令コードをデコードし、デコード結果を命令実行制御回路２１０に出力する。命令実行制御回路２１０は、デコード結果に応じた制御信号を出力し、演算実行回路２０５における命令実行や、メモリアクセス制御回路２０７におけるアクセス制御を制御する。演算実行回路２０５は、命令実行制御回路２１０からの制御信号に応じた演算を実行する。メモリアクセス制御回路２０７は、命令実行制御回路２１０からの制御信号に基づいてアクセス先及びアクセス方法を決定し、周辺ＩＯ２０９やデータメモリ２１１に対するアクセスを制御する。この際、リードアクセスの場合、メモリアクセス制御回路２０７は、周辺ＩＯ２０９やデータメモリ２１１からデータを読み出し、実行結果格納回路２０８に格納する。あるいは、ライトアクセスの場合、実行結果格納回路２０８に格納されたデータ（演算結果）を周辺ＩＯ２０９に出力、又はデータメモリ２１１に格納する。実行結果格納回路２０８は、演算実行回路２０５の演算結果、又は、周辺ＩＯ２０９やデータメモリ２１１から読み出したデータを格納する。パイプライン制御回路２０６は、命令フェッチ制御回路２０３、命令デコーダ２０４、演算実行回路２０５、メモリアクセス制御回路２０７、実行結果格納回路２０８の状態に応じてＣＰＵ２０１全体の動作を制御する。
【００２７】
図４は、本発明によるマイクロコンピュータ２００における命令フェッチ制御回路２０３の詳細構成の一例を示す図である。命令フェッチ制御回路２０３は、命令キュー１０２、ＱＶフラグレジスタ１０３、ＤＦフラグレジスタ１０４、ＢＦフラグレジスタ１０５、キュー制御回路１０６、分岐アドレス生成回路１０９、フェッチポインタ１１１、インクリメンタ１１２、セレクタ１１０、１１３を備える。分岐アドレス生成回路１０９、フェッチポインタ１１１、インクリメンタ１１２、セレクタ１１０、１１３は、フェッチアドレス１３０を命令メモリ２０２に指定するフェッチアドレス設定回路を構成する。
【００２８】
命令キュー１０２は、通常動作時において先入先出し方式により命令メモリ２０２からの命令コード１１４を格納するレジスタで、ここでは一例として５段のレジスタ（Ｑｕｅ［４：０］）で構成される。命令キュー１０２では、命令メモリ２０２からの命令コード１１４がＱｕｅ［４］に格納され（エンキュー）、命令が処理される毎にＱＵＥ［４］→ＱＵＥ［３］→ＱＵＥ［２］→ＱＵＥ［１］→ＱＵＥ［０］へシフトする。Ｑｕｅ［４：０］に格納された命令コードは、命令キュー出力信号１１５としてキュー制御回路１０６に出力される（デキュー）。
【００２９】
ＱＶフラグレジスタ１０３は、命令キュー１０２の各段（各レジスタ）に有効な（使用可能な）命令コードが格納されているか否かを示すフラグ情報を格納する。ここでは、ＱＶフラグレジスタ１０３は、命令キュー１０２における５段のレジスタ（Ｑｕｅ［４：０］）に対応する５段のフラグレジスタ（ＱＶ［４：０］）で構成される。例えば、ＱＶ［４］にフラグ情報として“１”が格納されている場合、Ｑｕｅ［４］に有効な命令コードが格納されていることを示し、ＱＶ［４］にフラグ情報として“０”が格納されている場合、Ｑｕｅ［４］に有効な命令コードが格納されていないことを示す。ＱＶフラグレジスタ１０３では、キュー制御回路１０６からのＱＶフラグレジスタ制御信号１１７に応じた値のフラグ情報が格納される。又、ＱＶ［４：０］に格納された命令コードは、ＱＶフラグレジスタ出力信号１１６としてキュー制御回路１０６に出力される。
【００３０】
ＤＦフラグレジスタ１０４は、命令キュー１０２の各段（各レジスタ）に対して分岐命令調査が行われたか否かを示すフラグ情報を格納する。ここでは、ＤＦフラグレジスタ１０４は、命令キュー１０２における５段のレジスタ（Ｑｕｅ［４：０］）に対応する５段のフラグレジスタ（ＤＦ［４：０］）で構成される。例えば、ＤＦ［４］にフラグ情報として“１”が格納されている場合、Ｑｕｅ［４］に分岐命令が格納されているか否かの調査（分岐命令調査）が行われたことを示し、ＤＦ［４］にフラグ情報として“０”が格納されている場合、Ｑｕｅ［４］に対して分岐命令調査が行われていないことを示す。ＤＦフラグレジスタ１０４では、キュー制御回路１０６からのＤＦフラグレジスタ制御信号１１９に応じた値のフラグ情報が格納される。又、ＤＦ［４：０］に格納された命令コードは、ＤＦフラグレジスタ出力信号１１８としてキュー制御回路１０６に出力される。
【００３１】
ＢＦフラグレジスタ１０５は、命令キュー１０２の各段（各レジスタ）に命令コードとして分岐先命令が格納されているか否かを示すフラグ情報を格納する。ここでは、ＢＦフラグレジスタ１０５は、命令キュー１０２における５段のレジスタ（Ｑｕｅ［４：０］）に対応する５段のフラグレジスタ（ＢＦ［４：０］）で構成される。例えば、ＢＦ［４］にフラグ情報として“１”が格納されている場合、Ｑｕｅ［４］に分岐先命令が格納されていることを示し、ＢＦ［４］にフラグ情報として“０”が格納されている場合、Ｑｕｅ［４］に分岐先命令が格納されていないことを示す。ＢＦフラグレジスタ１０５では、キュー制御回路１０６からのＢＦフラグレジスタ制御信号１２１に応じた値のフラグ情報が格納される。又、ＢＦ［４：０］に格納された命令コードは、ＢＦフラグレジスタ出力信号１２０としてキュー制御回路１０６に出力される。
【００３２】
キュー制御回路１０６には、命令キュー出力信号１１５、ＱＶフラグレジスタ出力信号１１６、ＤＦフラグレジスタ出力信号１１８、ＢＦフラグレジスタ出力信号１２０、ハザード信号１２３、分岐命令検出信号１２４、及び分岐確定信号１２５が入力される。ここで、ハザード信号１２３は、パイプラインハザードの発生有無を示し、パイプライン制御回路２０６から出力される。分岐命令検出信号１２４は、デコードされた命令コードが分岐命令か否かを示し、命令デコーダ２０４から出力される。分岐確定信号１２５は、分岐命令が実行されたか否かを示し、パイプライン制御回路２０６から出力される。
【００３３】
キュー制御回路１０６は、命令キュー出力信号１１５から選択した命令コードを選択後命令キュー出力信号１２２として命令デコーダ２０４及び分岐アドレス生成回路１０９に出力する。この際、ＱＶフラグレジスタ出力信号１１６、ＤＦフラグレジスタ出力信号１１８に応じて選択されたレジスタ内の命令コードが選択後命令キュー出力信号１２２として出力される。
【００３４】
又、キュー制御回路１０６は、ＱＶフラグレジスタ１０３、ＤＦフラグレジスタ１０４、ＢＦフラグレジスタ１０５のそれぞれのレジスタにフラグ情報を設定するためのＱＶフラグレジスタ制御信号１１７、ＤＦフラグレジスタ制御信号１１９、ＢＦフラグレジスタ制御信号１２１を出力する。更に、キュー制御回路１０６は、命令キュー１０２内における分岐先命令の有無を示す分岐先命令検出信号１３３を出力する。
【００３５】
命令デコーダ２０４は、キュー制御回路１０６から入力される選択後命令キュー出力信号１２２をデコードし、命令実行要求信号１３１として命令実行制御回路２１０に出力する。この際、命令デコーダ２０４は、デコードした選択後命令キュー出力信号１２２（命令コード）が分岐命令か否かを判定し、判定結果を示す分岐命令検出信号１２４をキュー制御回路１０６、分岐アドレス生成回路１０９、セレクタ１１３に出力する。
【００３６】
命令実行制御回路２１０は、命令実行要求信号１３１とハザード信号１２３に応じた命令実行信号１３２を出力し、演算実行回路２０５における命令実行や、メモリアクセス制御回路２０７におけるアクセス制御を制御する。
【００３７】
分岐アドレス生成回路１０９には、選択後命令キュー出力信号１２２、分岐命令検出信号１２４、分岐先命令検出信号１３３が入力される。分岐アドレス生成回路１０９は、選択後命令キュー出力信号１２２に基づいて分岐アドレスを生成し、分岐アドレス信号１２６としてセレクタ１１０、１１３に出力する。
【００３８】
セレクタ１１０は、分岐アドレス信号１２６と、インクリメンタ１１２から出力される更新アドレス信号１２７の一方を、分岐確定信号１２５に応じて選択し、更新フェッチアドレス１２８としてフェッチポインタ１１１に出力する。詳細には、セレクタ１１０は、ハイレベル“１”の分岐確定信号１２５に応じて分岐アドレス信号１２６を更新フェッチアドレス１２８として選択し、ローレベル“０”の分岐確定信号１２５に応じて更新アドレス信号１２７を更新フェッチアドレス１２８として選択する。
【００３９】
フェッチポインタ１１１は、セレクタ１１０から出力される更新フェッチアドレス１２８を保持するレジスタである。保持された更新フェッチアドレス１２８は、インクリメンタ１１２及びセレクタ１１３にフェッチポインタ信号１２９として出力される。又、フェッチポインタ１１１は、ハイレベル“１”のハザード信号１２３が入力されている間、更新フェッチアドレス１２８の取り込みを停止し、レジスタ内のデータ（フェッチポインタ信号１２９の値）を保持する。これにより、パイプラインハザードが発生している間、フェッチポインタ信号１２９の値は固定される。
【００４０】
インクリメンタ１１２は、フェッチポインタ信号１２９を随時インクリメントし、更新アドレス信号１２７としてセレクタ１１０に出力する。
【００４１】
セレクタ１１３は、分岐命令検出信号１２４、ハザード信号１２３及び分岐確定信号１２５に応じて、分岐アドレス信号１２６とフェッチポインタ信号１２９の一方を選択して、フェッチアドレス１３０として命令メモリ２０２に出力する。詳細には、セレクタ１１３は、ハイレベル“１”のハザード信号１２３が入力されている間、ハイレベル“１”の分岐命令検出信号１２４に応じて分岐アドレス信号１２６を選択し、ローレベル“０”の分岐命令検出信号１２４に応じてフェッチポインタ信号１２９を選択する。すなわち、セレクタ１１３は、パイプラインハザードが発生している間、デコードされた命令コードが分岐命令のとき分岐アドレス信号１２６をフェッチアドレス１３０として選択し、分岐命令以外のときフェッチポインタ信号１２９をフェッチアドレス１３０として選択する。一方、ローレベル“０”のハザード信号１２３が入力されている間、セレクタ１１３は、ハイレベル“１”の分岐確定信号１２５に応じて分岐アドレス信号１２６を選択し、ローレベル“０”の分岐確定信号１２５に応じてフェッチポインタ信号１２９を選択する。すなわち、セレクタ１１３は、パイプラインハザードが発生していない場合、実行された命令により分岐が確定したとき分岐アドレス信号１２６をフェッチアドレス１３０として選択し、分岐が確定しない間、フェッチポインタ信号１２９をフェッチアドレス１３０として選択する。
【００４２】
図５は、キュー制御回路１０６の構成の詳細の一例を示す図である。図５を参照して、キュー制御回路１０６は、セレクタ６１、キュー選択回路６２、キュークリア判定回路６３、分岐先命令格納判定回路６４、分岐先命令検出回路６５を備える。セレクタ６１は、命令キュー１０２の各段（各レジスタ）のうち、キュー選択回路６２から出力されるキュー選択制御信号１４０によって指定されたレジスタ内の命令コードを選択して選択後命令キュー出力信号１２２として出力する。ここでは命令キュー１０２におけるＱｕｅ［４：０］のうちキュー選択制御信号１４０によって指定されたＱｕｅ内の命令コードが、選択後命令キュー出力信号１２２として出力される。
【００４３】
キュー選択回路６２は、ハザード信号１２３、ＱＶフラグレジスタ出力信号１１６及びＤＦフラグレジスタ出力信号１１８に応じたキュー選択制御信号１４０をセレクタ６１に出力し、セレクタ６１における命令コード選択動作を制御する。又、キュー選択回路６２は、ハザード信号１２３に応じたＤＦフラグレジスタ制御信号１１９をＤＦフラグレジスタ１０４に出力し、ＤＦフラグレジスタ１０４へのフラグ情報の格納を制御する。
【００４４】
ここで、キュー選択回路６２は、ハザード信号１２３によってハザード発生期間か否かを確認する。又、キュー選択回路６２は、ＱＶフラグレジスタ出力信号１１６によって命令キュー１０２の各段（各レジスタ）に有効な命令コードが格納されているか否かを確認する。更に、キュー選択回路６２は、ＤＦフラグレジスタ出力信号１１８によって命令キュー１０２の各段（各レジスタ）が分岐命令調査済みか否かを確認する。
【００４５】
キュー選択回路６２は、ローレベル“０”のハザード信号１２３に応じて命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）をセレクタ６１に選択させる。これにより、ハザードが発生していない期間、セレクタ６１は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）の命令コードを選択後命令キュー出力信号１２２として出力する。又、キュー選択回路６２は、ハザードが未検出の次サイクルにおいて、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともに、ＤＦフラグレジスタ１０４の最上位のレジスタ（ここではＤＦ［４］）に“０”を格納する。
【００４６】
一方、キュー選択回路６２は、ハイレベル“１”のハザード信号１２３に応じて、有効な命令コードが格納され、分岐命令調査が未実施のレジスタのうち、最下位側のレジスタ（ここではＱｕｅ［０］又はＱｕｅ［０］に最も近いレジスタ）をセレクタ６１に選択させる。これにより、パイプラインハザードの発生期間中、セレクタ６１は、分岐命令調査が未実施のレジスタにおいて最下位側のレジスタ（ここではＱｕｅ［０］又はＱｕｅ［０］に最も近いレジスタ）の命令コードを、選択後命令キュー出力信号１２２として出力する。又、キュー選択回路６２は、パイプラインハザードの発生を確認した時の次サイクルにおいて、ＤＦフラグレジスタ１０４のシフト動作を停止するとともに、ハザードの発生を確認したときに選択した命令キュー１０２のレジスタ（Ｑｕｅ）に対応するＤＦフラグレジスタ（ＤＦ）に、分岐命令調査済みを示すフラグ情報“１”を格納する。
【００４７】
キュークリア判定回路６３は、分岐確定信号１２５、ＱＶフラグレジスタ出力信号１１６及びＢＦフラグレジスタ出力信号１２０に応じたＱＶフラグレジスタ制御信号１１７をＱＶフラグレジスタ１０３に出力し、ＱＶフラグレジスタ１０３へのフラグ情報の格納を制御する。キュークリア判定回路６３は、分岐確定信号１２５によって分岐命令が実行されたか否かを確認する。又、キュークリア判定回路６３は、ＱＶフラグレジスタ出力信号１１６によって命令キュー１０２の各段（各レジスタ）に有効な命令コードが格納されているか否かを確認する。更に、キュークリア判定回路６３は、ＢＦフラグレジスタ出力信号１２０によって命令キュー１０２の各段（各レジスタ）に分岐先命令が格納されているか否かを確認する。
【００４８】
キュークリア判定回路６３は、分岐命令が実行され、ＢＦフラグレジスタ１０５の全てのレジスタ（ＢＦ［４：０］）に“０”が格納されているとき、すなわち、分岐が確定し命令キュー１０２に分岐先命令が格納されていないとき、次のクロックサイクルにおいてＱＶフラグレジスタ１０３内の全てのフラグ情報をリセットする。
【００４９】
一方、キュークリア判定回路６３は、分岐命令が実行され、ＢＦフラグレジスタ１０５のレジスタ（ＢＦ［４：０］）のいずれかに“１”が格納されているとき、すなわち、分岐が確定し命令キュー１０２に分岐先命令が格納されているとき、次のクロックサイクルにおいてＱＶフラグレジスタ１０３の最下位のレジスタ（ＱＶ［０］）に“１”を格納し、他のレジスタ（ＱＶ［４：１］）に“０”を格納する。
【００５０】
分岐先命令格納判定回路６４は、ハザード信号１２３、分岐命令検出信号１２４、分岐確定信号１２５に応じたＢＦフラグレジスタ制御信号１２１を、ＢＦフラグレジスタ１０５に出力し、ＢＦフラグレジスタ１０５へのフラグ情報の格納を制御する。分岐先命令格納判定回路６４は、ハザード信号１２３によってハザード発生期間か否かを確認する。又、分岐先命令格納判定回路６４は、分岐命令検出信号１２４によって、デコードされた命令コードが分岐命令か否かを確認する。更に、分岐先命令格納判定回路６４は、分岐確定信号１２５によって、分岐命令が実行されたか否かを確認する。
【００５１】
分岐先命令格納判定回路６４は、パイプラインハザード発生期間中において、デコードデータが分岐命令であることを検出すると、当該検出から所定のサイクル後（例えば２サイクル後）にＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともにＢＦフラグレジスタ１０５の最上位のレジスタ（ここではＢＦ［４］）に“１”を格納する。
【００５２】
一方、分岐先命令格納判定回路６４は、ハザード発生の未検出期間中において、デコードデータが分岐命令であることを検出すると、当該検出から所定のサイクル後（例えば１サイクル後）にＢＦフラグレジスタ１０５内の全てのフラグ情報をリセットする。あるいは、分岐先命令格納判定回路６４は、ハザード発生の未検出期間中において、デコードデータが分岐命令であることを検出すると、当該検出から所定のサイクル後（例えば２サイクル後）にＢＦフラグレジスタ１０５の最下位のレジスタ（ここではＢＦ［０］）に“１”を格納し他のレジスタ（ここではＢＦ［４：１］）に“０”を格納してもよい。又、分岐先命令格納判定回路６４は、ハザード発生の未検出期間中において、デコードデータが分岐命令ではない場合、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦフラグレジスタ１０５の最上位のレジスタ（ここではＢＦ［４］）に“０”を格納する。
【００５３】
尚、分岐命令の検出からＢＦフラグレジスタ１０５の更新までの期間は、フェッチアドレスの出力から命令キュー１０２に命令コードがフェッチされるまでの期間に相当する（例えば２サイクル）。
【００５４】
更に、分岐先命令格納判定回路６４は、ハイレベル“１”の分岐確定信号１２５が入力された次のクロックサイクルにおいて、ＢＦフラグレジスタ１０５内のフラグ情報をリセットする。この場合、分岐命令の実行（分岐確定）に先行して格納された分岐先命令が命令キュー１０２のＱｕｅ［４］からＱｕｅ［０］のいずれにも格納されていないことを示すこととなる。あるいは、分岐先命令格納判定回路６４は、ハイレベル“１”の分岐確定信号１２５が入力された次のクロックサイクルにおいて、ＢＦフラグレジスタ１０５の最下位のレジスタ（ＢＦ［０］）のみに“１”を格納し、他のレジスタ（ＢＦ［４：１］）に“０”を格納してもよい。この場合、ＢＦフラグレジスタ１０５のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］のうちＱｕｅ［０］のみに分岐先命令が格納されていることを示すこととなる。
【００５５】
分岐先命令検出回路６５は、ＱＶフラグレジスタ出力信号１１６、ＢＦフラグレジスタ出力信号１２０、及び分岐確定信号１２５に応じた分岐先命令検出信号１３３を出力し、分岐アドレス生成回路１０９から出力される分岐命令アドレスを決定する。分岐先命令検出回路６５は、ＱＶフラグレジスタ出力信号１１６によって命令キュー１０２の各段（各レジスタ）に有効な命令コードが格納されているか否かを確認する。又、分岐先命令検出回路６５は、ＢＦフラグレジスタ出力信号１２０によって命令キュー１０２の各段（各レジスタ）に分岐先命令が格納されているか否かを確認する。更に、分岐先命令検出回路６５は、分岐確定信号１２５によって、分岐命令が実行されたか否かを確認する。
【００５６】
分岐先命令検出回路６５は、命令キュー１０２に分岐先命令が格納されている間に分岐命令の実行（分岐確定）を確認すると、選択後命令キュー出力信号１２２から抽出された分岐アドレスを所定の“ｎ”だけインクリメントした値を分岐アドレス信号１２６として選択出力するように、分岐アドレス生成回路１０９を制御する。一方、分岐先命令検出回路６５は、命令キュー１０２に分岐先命令が格納されていない間に分岐命令の実行（分岐確定）を確認すると、選択後命令キュー出力信号１２２から抽出された分岐アドレスを分岐アドレス信号１２６として選択出力するように、分岐アドレス生成回路１０９を制御する。すなわち、分岐命令がパイプラインハザード発生期間中に検出された場合、分岐命令の確定に応じて当該分岐命令に係る分岐先命令の次の分岐先命令のアドレスが、分岐アドレス生成回路１０９から出力される。又、分岐命令がパイプラインハザード発生期間中に検出されない場合、従来と同様に分岐命令の確定に応じて当該分岐命令に係る分岐先命令のアドレスが、分岐アドレス生成回路１０９から出力される。
【００５７】
図６は、分岐アドレス生成回路１０９の構成の一例を示す図である。図６を参照して分岐アドレス生成回路１０９は、分岐アドレス抽出回路９１、インクリメンタ９２、セレクタ９３を備える。分岐アドレス抽出回路９１は、選択後命令キュー出力信号１２２、すなわち、デコード対象となる命令コードから分岐命令のアドレスを抽出する。インクリメンタ９２は、分岐アドレス抽出回路９１によって抽出された分岐アドレスを所定の値だけインクリメントし、セレクタ９３に出力する。例えば、インクリメンタ９２は、一の分岐先命令のアドレスと次の分岐先命令のアドレスの差分“ｎ”だけ分岐アドレスをインクリメントする。セレクタ９３は、分岐アドレス抽出回路９１によって抽出された分岐アドレスと、インクリメンタ９２から入力されるアドレスの一方を選択し、分岐アドレス信号１２６として出力する。この際、セレクタ９３は、分岐先命令検出信号１３３に応じて分岐アドレス信号１２６として選択するアドレスを決定する。アドレス選択のアルゴリズムは上述の通りである。
【００５８】
（動作）
次に、図７及び図８を参照して、本実施の形態におけるパイプライン処理の動作の詳細を説明する。図７は、本発明によるマイクロコンピュータ２００のパイプライン処理動作の一例を示すタイミングチャートである。
【００５９】
図７を参照して、本実施の形態におけるマイクロコンピュータ２００は、基準クロック１５０に応じて動作する。ここでは、基準クロック１５０に応じたクロックサイクルＴ１〜Ｔ１１の動作を説明する。
【００６０】
状態１６０は、本実施例において各命令に対するＣＰＵ２０１の状態（ステージ）を示す。ここで、“ＩＦ”（ＩＦステージ）は、命令コードがＣＰＵ２０１にインストラクションフェッチされていることを示す。“ＩＤ”（ＩＤステージ）は、ＣＰＵ２０１において、命令コードのインストラクションデコードが行われていることを示す。“ＥＸ”（ＥＸステージ）は、ＣＰＵ２０１において、命令（デコードデータ）が実行されていることを示す。“ＭＥＭ”（ＭＥＭステージ）は、ＣＰＵ２０１による周辺ＩＯ２０９やデータメモリ２１１へのアクセス（メモリに対する読み出し、書き込み）を示す。
【００６１】
クロックサイクルＴ１：
クロックサイクルＴ１に至るまでに、命令メモリ２０２から“命令０”〜“命令４”が順次フェッチされ、命令キュー１０２のＱｕｅ［０］に“命令０”が、Ｑｕｅ［１］に“命令１”が、Ｑｕｅ［２］に“命令２”が、Ｑｕｅ［３］に“命令３”が、Ｑｕｅ［４］に“命令４”が格納される。
【００６２】
クロックサイクルＴ１では、パイプラインハザードが発生していないため、ハザード信号１２３はローレベル“０”を示す。又、ハザード信号１２３がローレベル“０”であるため、キュー選択回路６２は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“命令０”を、選択後命令キュー出力信号１２２としてセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“命令０”が命令デコーダ２０４によってデコードされる。デコードされた“命令０”は分岐命令ではないため、クロックサイクルＴ１における分岐命令検出信号１２４はローレベル“０”を示す。このとき、“命令１”は、“命令０”に引き続いてＩＤステージへ移行する前のＩＦステージとなる。又、実行中の命令がないため、分岐は確定しておらず分岐確定信号１２５もローレベル“０”を示す。
【００６３】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ１では、命令が実行されず分岐未確定のため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“命令６”のアドレス）が出力される。又、命令メモリ２０２から、命令コード１１４として命令５（分岐命令）が出力されている。
【００６４】
サイクルＴ１の前のサイクルにおいてハザードが未検出であるため（図示なし）、クロックサイクルＴ１においてキュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］に対して分岐命令が格納されたか否かの調査が行われていないことを示す“０００００”を維持する。
【００６５】
分岐先命令格納判定回路６４は、２サイクル前に分岐命令が検出されていないため（図示なし）、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦ［４］に“０”を格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］の全てに分岐命令が格納されていないことを示す“０００００”を維持する。
【００６６】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”が格納されている。
【００６７】
クロックサイクルＴ２：
クロックサイクルＴ１においてデコードされた“命令０”は、クロックサイクルＴ２において実行される。“命令０”のデコードが完了したため、クロックサイクルＴ２では、命令キュー１０２のＱｕｅ［０］に“命令１”が、Ｑｕｅ［１］に“命令２”が、Ｑｕｅ［２］に“命令３”が、Ｑｕｅ［３］に“命令４”がシフトしてそれぞれ格納され、Ｑｕｅ［４］には、命令メモリ２０２からフェッチされた“命令５（分岐命令）”が格納される。その結果、“命令０”がＥＸステージになり、“命令１”がＩＤステージになり、“命令２”がＩＦステージに移行する。ここで、“命令５”は分岐命令である。
【００６８】
クロックサイクルＴ１において実行された命令がないため、クロックサイクルＴ２において、パイプラインハザードは発生していない。このため、クロックサイクルＴ２では、ハザード信号１２３はローレベル“０”を示す。又、ハザード信号１２３がローレベル“０”であるため、キュー選択回路６２は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“命令１”を、選択後命令キュー出力信号１２２としてセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“命令１”が命令デコーダ２０４によってデコードされる。デコードされた“命令１”は分岐命令ではないため、クロックサイクルＴ２における分岐命令検出信号１２４はローレベル“０”を示す。このとき、“命令２”は、“命令１”に引き続いてＩＤステージへ移行する前のＩＦステージとなる。更に、クロックサイクルＴ２において実行中の“命令０”は分岐命令ではないため、分岐は確定せず分岐確定信号１２５もローレベル“０”を示す。
【００６９】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ２では、実行された“命令０”は分岐命令ではなく分岐未確定のため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“命令７”のアドレス）が出力される。又、１サイクル前のフェッチアドレス１３０に従い、命令メモリ２０２から、命令コード１１４として“命令６”が出力されている。
【００７０】
又、サイクルＴ１においてハザードが未検出であるため、クロックサイクルＴ２においてキュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］に対して分岐命令が格納されたか否かの調査が行われていないことを示す“０００００”を維持する。
【００７１】
分岐先命令格納判定回路６４は、２サイクル前に分岐命令が検出されていないため（図示なし）、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦ［４］に“０”を格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］の全てに分岐命令が格納されていないことを示す“０００００”を維持する。
【００７２】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”を維持する。
【００７３】
すなわち、クロックサイクルＴ２におけるハザード信号１２３、分岐命令検出信号１２４、分岐確定信号１２５、ＤＦ［４：０］、ＢＦ［４：０］、ＱＶ［４：０］はいずれもクロックサイクルＴ１から変化しない。
【００７４】
クロックサイクルＴ３、Ｔ４：
クロックサイクルＴ３、Ｔ４では、クロックサイクルＴ２と同様な動作により、ＣＰＵ２０１の状態１６０の移行及び命令キュー１０２への命令コードのフェッチが行われる。この際、クロックサイクルＴ３、Ｔ４におけるハザード信号１２３、分岐命令検出信号１２４、分岐確定信号１２５、ＤＦ［４：０］、ＢＦ［４：０］、ＱＶ［４：０］はいずれもクロックサイクルＴ２から変化しない。
【００７５】
クロックサイクルＴ３において“命令１”の実行、及び“命令２”のデコードが完了し、クロックサイクルＴ４では、“命令２”が実行され、“命令３”がデコードされる。このとき、“命令４”は、“命令３”に引き続いてＩＤステージへ移行する前のＩＦステージとなる。“命令２”のデコードが完了したため、クロックサイクルＴ４では、命令キュー１０２のＱｕｅ［０］に“命令３”が、Ｑｕｅ［１］に“命令４”が、Ｑｕｅ［２］に“命令５（分岐命令）”が、Ｑｕｅ［３］に“命令６”がシフトしてそれぞれ格納され、Ｑｕｅ［４］には、命令メモリ２０２からフェッチされた“命令７”が格納される。その結果、クロックサイクルＴ４では、“命令２”がＥＸステージになり、“命令３”がＩＤステージになり、“命令４”がＩＦステージに移行する。
【００７６】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ４では、実行された“命令２”は分岐命令ではなく分岐未確定のため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“命令９”のアドレス）が出力される。又、１サイクル前のフェッチアドレス１３０に従い、命令メモリ２０２から、命令コード１１４として“命令８”が出力されている。
【００７７】
クロックサイクルＴ５：
クロックサイクルＴ４において“命令３”のデコードが完了したため、クロックサイクルＴ５では、命令キュー１０２のＱｕｅ［０］に“命令４”が、Ｑｕｅ［１］に“命令５（分岐命令）”が、Ｑｕｅ［２］に“命令６”が、Ｑｕｅ［３］に“命令７”がシフトしてそれぞれ格納され、Ｑｕｅ［４］には、命令メモリ２０２からフェッチした“命令８”が格納される。
【００７８】
クロックサイクルＴ４において“命令２”の実行、及び“命令３”のデコードが完了する。この時、“命令２”が例えばロード命令のように、周辺ＩＯ２０９やデータメモリ２１１からデータをロードする命令の場合、状態１６０はメモリアクセスステージ（ＭＥＭ）となる。更に、“命令３”が“命令２”によるロードデータを使用する場合、“命令３”の実行（ＥＸ）は、“命令２”のＭＥＭの完了を待って行われる。このとき、命令実行制御回路２１０は命令実行信号１３２を出力せず“命令３”の実行が保留されるパイプラインハザード状態が発生し、ハザード信号１２３は、ハイレベル“１”となる。
【００７９】
本実施の形態では、クロックサイクルＴ５、Ｔ６がハザード発生期間となる。この間、キュー制御回路１０６及び命令デコーダ２０４によって命令キュー１０２に分岐命令が格納されているか否かの調査（分岐命令調査）が行われる。この際、命令キュー１０２において分岐命令調査が実施済みのＱｕｅに対応するＤＦフラグレジスタ１０４のレジスタには、当該分岐命令調査の次サイクルにおいて“１”が格納される。この際、未調査のレジスタには“０”が格納される。
【００８０】
クロックサイクルＴ５では、ハザード信号１２３がハイレベル“１”であるため、キュー選択回路６２は、命令キュー１０２において有効な命令コードが格納され、分岐命令調査が未実施のレジスタのうち、最下位側のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“命令４”をセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“命令４”が命令デコーダ２０４によってデコードされる。デコードされた“命令４”は分岐命令ではないため、クロックサイクルＴ５における分岐命令検出信号１２４はローレベル“０”を示す。更に、クロックサイクルＴ４において実行中の“命令２”は分岐命令ではないため、分岐は確定せず分岐確定信号１２５もローレベル“０”を示す。
【００８１】
パイプラインハザードの発生（ハイレベル“１”のハザード信号１２３）によりフェッチポインタ１１１は、直前のクロックサイクルＴ４においてインクリメントされたアドレス（“命令９”のアドレス）を保持する。セレクタ１１３は、ハイレベル“１”のハザード信号１２３に基づき、分岐命令の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択するハザードモードとなる。クロックサイクルＴ５では、デコードされた“命令４”が分岐命令ではないため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“命令９”のアドレス）が出力される。
【００８２】
サイクルＴ５では、直前のクロックサイクルＴ４においてハザードが未検出であったため、キュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］に対して分岐命令が格納されたか否かの調査が行われていないことを示す“０００００”を維持する。
【００８３】
分岐先命令格納判定回路６４は、２サイクル前にデコードされた“命令２”が分岐命令ではないため、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦ［４］に“０”を格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］の全てに分岐命令が格納されていないことを示す“０００００”を維持する。
【００８４】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”を維持する。
【００８５】
クロックサイクルＴ５では、パイプラインハザードの発生により、本来保留とされる“命令４”のデコードを、分岐命令調査（Ｑｕｅ［０］に対する調査）のために利用している。
【００８６】
クロックサイクルＴ６：
クロックサイクルＴ６では、引き続き“命令２”のＭＥＭステージであり、パイプラインハザードが発生中であることからＥＸステージ（ここでは“命令３”の実行）やＩＤステージ（ここでは“命令４”のでコード）は保留されている。このため、命令キュー１０２内のデータはシフトせず、Ｑｕｅ［０］に“命令４”が、Ｑｕｅ［１］に“命令５（分岐命令）”が、Ｑｕｅ［２］に“命令６”が、Ｑｕｅ［３］に“命令７”が、Ｑｕｅ［４］に“命令８”が格納された状態を維持する。
【００８７】
クロックサイクルＴ６では“命令３”の実行が保留されるパイプラインハザード状態が発生しているため、ハザード信号１２３は、ハイレベル“１”となる。
【００８８】
キュー選択回路６２は、直前のクロックサイクルＴ５においてパイプラインハザードの発生を検出しているため、ＤＦフラグレジスタ１０４のシフト動作を停止するとともに、クロックサイクルＴ５において分岐命令調査を行ったＱｕｅ［０］に対応するＤＦ［０］に、分岐調査済みを示すフラグ情報“１”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］のみに対し分岐命令調査が行われたことを示す“００００１”となる。
【００８９】
クロックサイクルＴ６では、ハザード信号１２３がハイレベル“１”であるため、クロックサイクルＴ５と同様に命令キュー１０２に対し分岐命令調査が行われる。ここでは、ＤＦ［０］に分岐命令調査済みを示す“１”が格納され、ＤＦ［１］に分岐命令未調査を示す“０”が格納されている。このため、キュー選択回路６２は、分岐命令未調査のＱｕｅ［１］に格納された“命令５（分岐命令）”を選択後命令キュー出力信号１２２として出力するようにセレクタ６１を制御する。これにより、Ｑｕｅ［１］内の“命令５”が命令デコーダ２０４によってデコードされる。デコードされた“命令５”は分岐命令であるため、命令デコーダ２０４はハイレベル“１”の分岐命令検出信号１２４を出力する。尚、クロックサイクルＴ６において実行中の“命令２”は分岐命令ではないため、分岐は確定せず分岐確定信号１２５はローレベル“０”を示す。
【００９０】
パイプラインハザードの発生（ハイレベル“１”のハザード信号１２３）によりフェッチポインタ１１１は、直前のクロックサイクルＴ４においてインクリメントされたアドレス（“命令９”のアドレス）を保持する。セレクタ１１３は、ハイレベル“１”のハザード信号１２３（ハザードの発生）及びハイレベル“１”の分岐命令検出信号１２４（分岐命令の検出）に基づき、分岐アドレス信号１２６をフェッチアドレス１３０として選択する。クロックサイクルＴ６では、デコードされた“命令５”が分岐命令であるため、フェッチアドレス１３０として、“命令５”から生成された分岐アドレス信号１２６（“分岐先命令１”のアドレス）が出力される。
【００９１】
分岐先命令格納判定回路６４は、２サイクル前にデコードされた“命令３”が分岐命令ではないため、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦ［４］に“０”を格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］の全てに分岐命令が格納されていないことを示す“０００００”を維持する。
【００９２】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”を維持する。
【００９３】
クロックサイクルＴ６では、パイプラインハザードの発生により、本来保留とされるＩＤステージ（ここでは“命令４”のデコード）を、分岐命令調査（Ｑｕｅ［１］に対する調査）のために利用している。
【００９４】
クロックサイクルＴ７：
クロックサイクルＴ７では、“命令２”のＭＥＭステージが完了しパイプラインハザードが解消して、保留されていた“命令３”がＥＸステージ、“命令４”がＩＤステージとなり、“命令５（分岐命令）”がＩＦステージに移行する。
【００９５】
クロックサイクルＴ４においてデコードされ、クロックサイクルＴ５、Ｔ６において保留とされていた“命令３”は、クロックサイクルＴ７において実行される。又、ＩＤステージとして保留とされていた“命令４”のデコードは未完了のため、クロックサイクルＴ７では、命令キュー１０２内のデータはシフトせず、Ｑｕｅ［０］に“命令４”が、Ｑｕｅ［１］に“命令５（分岐命令）”が、Ｑｕｅ［２］に“命令６”が、Ｑｕｅ［３］に“命令７”が、Ｑｕｅ［４］に“命令８”が格納された状態を維持する。すなわち命令キュー１０２の状態は、Ｔ６サイクルで命令３、命令４が保留されていたので、Ｔ６サイクルから変化はない。
【００９６】
クロックサイクルＴ７ではパイプラインハザードは発生していない（解消している）。このため、クロックサイクルＴ７では、ハザード信号１２３はローレベル“０”を示す。又、ハザード信号１２３がローレベル“０”であるため、キュー選択回路６２は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“命令４”を、選択後命令キュー出力信号１２２としてセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“命令４”が命令デコーダ２０４によってデコードされる。デコードされた“命令４”は分岐命令ではないため、クロックサイクルＴ７における分岐命令検出信号１２４はローレベル“０”を示す。このとき、クロックサイクルＴ７において実行中の“命令３”は分岐命令ではないため、分岐は確定せず分岐確定信号１２５もローレベル“０”を示す。
【００９７】
キュー選択回路６２は、直前のクロックサイクルＴ６においてパイプラインハザードの発生を検出しているため、ＤＦフラグレジスタ１０４のシフト動作を停止するとともに、クロックサイクルＴ６において分岐命令調査を行ったＱｕｅ［１］に対応するＤＦ［１］に、分岐調査済みを示すフラグ情報“１”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］及びＱｕｅ［１］に対し分岐命令調査が行われたことを示す“０００１１”となる。
【００９８】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ７では、実行された“命令３”は分岐命令ではなく分岐未確定のため、フェッチポインタ１１１によって保持されていたフェッチポインタ信号１２９（“命令９”のアドレス）がフェッチアドレス１３０として出力される。すなわち、クロックサイクルＴ７におけるフェッチアドレス１３０として、パイプラインハザード発生により保留されていた“命令９”が格納されているアドレスが出力される。又、１サイクル前のフェッチアドレス１３０に従い、命令メモリ２０２から、命令コード１１４として“分岐先命令１”が出力されている。
【００９９】
分岐先命令格納判定回路６４は、２サイクル前に分岐命令が検出されていないため、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦ［４］に“０”を格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］の全てに分岐命令が格納されていないことを示す“０００００”を維持する。
【０１００】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”を維持する。
【０１０１】
クロックサイクルＴ８：
クロックサイクルＴ７において“命令３”の実行及び、“命令４”のデコードが完了する。これにより、クロックサイクルＴ８では、命令キュー１０２のＱｕｅ［０］に“命令５（分岐命令）”が、Ｑｕｅ［１］に“命令６”が、Ｑｕｅ［２］に“命令７”が、Ｑｕｅ［３］に“命令８”がシフトしてそれぞれ格納され、Ｑｕｅ［４］には、命令メモリ２０２からフェッチした“分岐先命令１”が格納される。その結果、“命令４”がＥＸステージになり、“命令５（分岐命令）”がＩＤステージになり、“命令６”がＩＦステージに移行する。
【０１０２】
クロックサイクルＴ８ではパイプラインハザードは発生していない。このため、クロックサイクルＴ８では、ハザード信号１２３はローレベル“０”を示す。又、ハザード信号１２３がローレベル“０”であるため、キュー選択回路６２は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“分岐命令”を、選択後命令キュー出力信号１２２としてセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“分岐命令”が命令デコーダ２０４によってデコードされる。デコードされた“分岐命令”は分岐命令であるため、クロックサイクルＴ８における分岐命令検出信号１２４はハイレベル“１”を示す。このとき、クロックサイクルＴ８において実行中の“命令４”は分岐命令ではないため、分岐は確定せず分岐確定信号１２５もローレベル“０”を示す。
【０１０３】
分岐アドレス生成回路１０９は、ハイレベル“１”の分岐命令検出信号１２４に応じて“命令５”に基づく分岐先命令１が格納されたアドレスを生成する。しかし、“命令５”はＥＸステージ前であり分岐が確定していない。このためセレクタ１１３は、分岐アドレス信号１２６を出力しない。詳細には、セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ８では、実行された“命令４”は分岐命令ではなく分岐未確定のため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“命令１０”のアドレス）が出力される。又、１サイクル前のフェッチアドレス１３０に従い、命令メモリ２０２から、命令コード１１４として“命令９”が出力されている。
【０１０４】
又、サイクルＴ７においてハザードが未検出であるため、クロックサイクルＴ８においてキュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、シフト後の命令キュー１０２のうちＱｕｅ［０］に対してのみ分岐命令の格納有無の調査を行ったことを示す“００００１”に更新される。
【０１０５】
分岐先命令格納判定回路６４は、２サイクル前（クロックサイクルＴ６）に分岐命令が検出されたため、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、分岐命令の格納を示す“１”をＢＦ［４］に格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］のうちＱｕｅ［４］のみに分岐先命令が他の命令に先行して格納されていることを示す“１００００”となる。
【０１０６】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”を維持する。
【０１０７】
クロックサイクルＴ９：
クロックサイクルＴ８において“命令４”の実行及び、“命令５（分岐命令）”のデコードが完了する。これにより、クロックサイクルＴ９では、命令キュー１０２のＱｕｅ［０］に“命令６”が、Ｑｕｅ［１］に“命令７”が、Ｑｕｅ［２］に“命令８”が、Ｑｕｅ［３］に“分岐先命令１”がシフトしてそれぞれ格納され、Ｑｕｅ［４］には、命令メモリ２０２からフェッチした“命令９”が格納される。その結果、“命令５（分岐命令）”がＥＸステージに移行する。尚、分岐命令である“命令５”が実行され分岐が確定するため、後続の命令６は実行されず命令６のＩＤステージは破棄される。
【０１０８】
クロックサイクルＴ９ではパイプラインハザードは発生していない。このため、クロックサイクルＴ９では、ハザード信号１２３はローレベル“０”を示す。又、クロックサイクルＴ９において実行中の“命令５（分岐命令）”は分岐命令であるため、分岐が確定し、ハイレベル“１”の分岐確定信号１２５が出力されるとともに、ＩＤステージが破棄される。ここでは、“命令６”のデコードが破棄される。
【０１０９】
又、サイクルＴ８においてハザードが未検出であるため、クロックサイクルＴ９においてキュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、シフト後の命令キュー１０２におけるＱｕｅ［０］〜Ｑｕｅ［４］のいずれも分岐命令の格納有無の調査が行われていないことを示す“０００００”に更新される。
【０１１０】
分岐先命令格納判定回路６４は、２サイクル前（クロックサイクルＴ７）に分岐命令が検出されていないため、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、分岐命令の格納を示す“０”をＢＦ［４］に格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］のうちＱｕｅ［３］のみに分岐先命令が他の命令に先行して格納されていることを示す“０１０００”となる。
【０１１１】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］の全てに有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］〜Ｑｕｅ［４］に有効な命令が格納されていることを示す値“１１１１１”を維持する。
【０１１２】
分岐が確定すると分岐先命令１は次のサイクルでデコードされるＩＤステージとなるため、クロックサイクルＴ９において分岐先命令１はＩＦステージとなる。
【０１１３】
分岐アドレス生成回路１０９は、ハイレベル“１”の分岐命令検出信号１２４に応じてクロックサイクルＴ８においてデコードされた“命令５”に基づくアドレス（“分岐先命令１”が格納されたアドレス）と、これを“ｎ”だけインクリメントしたアドレス（“分岐先命令２”が格納されたアドレス）を生成している。ここで、ハイレベル“１”の分岐確定信号１２５に応じてキュー制御回路１０６から出力される分岐先命令検出信号１３３に基づき、分岐アドレス生成回路１０９は“ｎ”だけインクリメントしたアドレス（“分岐先命令２”が格納されたアドレス）を分岐アドレス信号１２６として出力する。
【０１１４】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなっている。クロックサイクルＴ９では、実行された“命令５”が分岐命令であるため、フェッチアドレス１３０として分岐アドレス信号１２６（ここでは、“分岐先命令２”のアドレス）を出力する。
【０１１５】
このように、分岐命令がハザード発生期間中に検出され、他の命令に先行して当該分岐命令に係る分岐先命令１が命令キュー１０２に格納されている場合、分岐確定時において分岐先命令１の次の命令（分岐先命令２）のアドレスをフェッチアドレスとして指定することができる。
【０１１６】
キュー制御回路１０６は、ハイレベル“１”の分岐確定信号１２５に応じてＢＦフラグレジスタ１０５のＢＦ［４：０］の値を判定して、“１”が格納されたＢＦに対応するＱｕｅを、次のクロックサイクルＴ１０において最下位のＱｕｅ［０］に移動する。ここではＢＦ［３］に“１”が格納されていることから、キュー制御回路１０６は、Ｑｕｅ［３］に分岐先命令が格納されていると判断して当該分岐先命令をＱｕｅ［０］に移動する。
【０１１７】
クロックサイクルＴ１０：
クロックサイクルＴ９において“命令６”のＩＤステージは破棄されたため、次のクロックサイクルＴ１０における“命令６”のＥＸステージも破棄される。又、クロックサイクルＴ１０では、前サイクルＴ９におけるハイレベル“１”の分岐確定信号１２５に応じてＱｕｅ［３］に格納された“分岐先命令１”がＱｕｅ［０］に移動し、他のＱｕｅ内の命令コードは破棄される。これにより“分岐先命令１”がＩＤステージとなる。
【０１１８】
クロックサイクルＴ９において実行された“命令５（分岐命令）”により、クロックサイクルＴ１０において、パイプラインハザードは発生していない。このため、クロックサイクルＴ１０では、ハザード信号１２３はローレベル“０”を示す。又、ハザード信号１２３がローレベル“０”であるため、キュー選択回路６２は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“分岐先命令１”を、選択後命令キュー出力信号１２２としてセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“分岐先命令１”が命令デコーダ２０４によってデコードされる。デコードされた“分岐先命令１”は分岐命令ではないため、クロックサイクルＴ１０における分岐命令検出信号１２４はローレベル“０”を示す。このとき、クロックサイクルＴ９において“分岐先命令２”のアドレスがフェッチアドレス１３０として出力されているため、“分岐先命令２”はクロックサイクルＴ１１においてデコードされる。このため、クロックサイクルＴ１０では、“分岐先命令２”がＩＦステージとなる。更に、クロックサイクルＴ１０において実行中の命令は破棄されるため、分岐は確定せず分岐確定信号１２５もローレベル“０”を示す。
【０１１９】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ１０では分岐未確定のため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“分岐先命令３”のアドレス）が出力される。又、１サイクル前のフェッチアドレス１３０に従い、命令メモリ２０２から、命令コード１１４として“分岐先命令２”が出力されている。
【０１２０】
又、サイクルＴ９においてハザードが未検出であるため、クロックサイクルＴ１０においてキュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］に対して分岐命令が格納されたか否かの調査が行われていないことを示す“０００００”を維持する。
【０１２１】
分岐先命令格納判定回路６４は、前のクロックサイクルＴ９において分岐が確定したため、クロックサイクルＴ１０においてＢＦフラグレジスタ１０５内のフラグ情報をリセットし“０００００”とする。これにより、分岐命令の実行（分岐確定）に先行して格納された分岐先命令が命令キュー１０２のＱｕｅ［４］からＱｕｅ［０］のいずれにも格納されていないことが示される。
【０１２２】
又、キュークリア判定回路６３は、前のクロックサイクルＴ９において分岐が確定し命令キュー１０２に分岐先命令が格納されているため、クロックサイクルＴ１０においてＱＶフラグレジスタ１０３の最下位のレジスタ（ＱＶ［０］）に“１”を格納し、他のレジスタ（ＱＶ［４：１］）に“０”を格納する。このため、ＱＶ［４：０］は、Ｑｕｅ［０］のみに有効な命令が格納されていることを示す値“００００１”となる。
【０１２３】
クロックサイクルＴ１１：
クロックサイクルＴ２においてデコードされた“分岐先命令１”は、クロックサイクルＴ１１において実行される。“分岐先命令１”のデコードが完了したため、クロックサイクルＴ１１では、命令キュー１０２のＱｕｅ［０］に“分岐先命令２”が格納される。その結果、“分岐先命令１”がＥＸステージになり、“分岐先命令２”がＩＤステージになり、“分岐先命令３”がＩＦステージに移行する。
【０１２４】
クロックサイクルＴ１０において実行された命令がないため、クロックサイクルＴ１１において、パイプラインハザードは発生していない。このため、クロックサイクルＴ１１では、ハザード信号１２３はローレベル“０”を示す。又、ハザード信号１２３がローレベル“０”であるため、キュー選択回路６２は、命令キュー１０２の最下位のレジスタ（ここではＱｕｅ［０］）に格納された命令コード“分岐先命令２”を、選択後命令キュー出力信号１２２としてセレクタ６１に出力させる。これにより、Ｑｕｅ［０］内の“分岐先命令２”が命令デコーダ２０４によってデコードされる。デコードされた“分岐先命令２”は分岐命令ではないため、クロックサイクルＴ１１における分岐命令検出信号１２４はローレベル“０”を示す。このとき、クロックサイクルＴ１０において“分岐先命令３”のアドレスがフェッチアドレス１３０として出力されているため、“分岐先命令３”はクロックサイクルＴ１２においてデコードされる。このため、クロックサイクルＴ１１では、“分岐先命令３”がＩＦステージとなる。更に、クロックサイクルＴ１１において実行中の“分岐先命令１”は分岐命令ではないため、分岐は確定せず分岐確定信号１２５もローレベル“０”を示す。
【０１２５】
セレクタ１１３は、ローレベル“０”のハザード信号１２３に基づき、分岐確定の検出に応じて分岐アドレス信号１２６をフェッチアドレス１３０として選択する通常動作モードとなる。クロックサイクルＴ１１では、実行された“分岐先命令１”は分岐命令ではなく分岐未確定のため、フェッチアドレス１３０としてフェッチポインタ信号１２９（“分岐先命令４”のアドレス）が出力される。又、１サイクル前のフェッチアドレス１３０に従い、命令メモリ２０２から、命令コード１１４として“分岐先命令３”が出力されている。
【０１２６】
又、サイクルＴ１０においてハザードが未検出であるため、クロックサイクルＴ１１においてキュー選択回路６２は、ＤＦフラグレジスタ１０４内のフラグ情報をシフトさせるとともにＤＦ［４］に“０”を格納する。これにより、ＤＦフラグレジスタ１０４（ＤＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］に対して分岐命令が格納されたか否かの調査が行われていないことを示す“０００００”を維持する。
【０１２７】
分岐先命令格納判定回路６４は、２サイクル前に分岐命令が検出されていないため、ＢＦフラグレジスタ１０５内のフラグ情報をシフトさせるとともに、ＢＦ［４］に“０”を格納する。これにより、ＢＦフラグレジスタ１０５（ＢＦ［４：０］）のフラグ情報は、Ｑｕｅ［０］〜Ｑｕｅ［４］の全てに分岐命令が格納されていないことを示す“０００００”を維持する。
【０１２８】
又、命令キュー１０２の５段のレジスタＱｕｅ［０］〜Ｑｕｅ［４］のうちＱｕｅ［０］のみ有効な命令が格納されているため、ＱＶ［４：０］には、Ｑｕｅ［０］のみに有効な命令が格納されていることを示す値“００００１”を維持する。
【０１２９】
すなわち、クロックサイクルＴ１０におけるハザード信号１２３、分岐命令検出信号１２４、分岐確定信号１２５、ＤＦ［４：０］、ＢＦ［４：０］、ＱＶ［４：０］はいずれもクロックサイクルＴ１０から変化しない。
【０１３０】
以上のように、本実施の形態によるマイクロコンピュータ２００では、パイプラインハザードが発生している間、ＩＤステージが保留されているために使用されていないデコード機能を、命令キュー１０２内に分岐命令が格納されているかの調査に使用している。この間に分岐命令が検出された場合、パイプラインハザード解消後、検出された分岐命令に対応する分岐先命令を他の命令に先行して命令キュー１０２にフェッチする。更に、命令キュー１０２に分岐先命令が格納された状態において、分岐命令が実行され分岐命令が確定すると、命令キュー１０２内の分岐先命令の次の分岐先命令のアドレスがフェッチアドレスとなる。これにより、分岐確定後、次のサイクルで分岐先命令が実行されるため、分岐ペナルティが削除される。
【０１３１】
尚、パイプラインハザード発生期間中に分岐命令を検出できなかった場合、従来のマイクロコンピュータと同様に分岐命令が実行される。
【０１３２】
本実施の形態によるマイクロコンピュータ２００では、パイプラインハザード発生期間において利用されていない命令デコーダ２０４及び分岐アドレス生成回路１０９を分岐命令の調査や、分岐先命令の先行フェッチに利用している。すなわち、通常動作時に使用している命令デコーダ２０４に新たな機能を追加することなく分岐命令の有無を調査することができる。又、分岐先命令に基づいて生成された分岐先命令のアドレスから次の分岐先命令のアドレスを生成する機能（ここでは、インクリメンタ９２）を分岐アドレス生成回路に追加することで、分岐先命令の次の命令のアドレスを分岐確定後遅滞なくフェッチアドレスとして出力することができる。この機能は小規模の回路（例えばインクリメンタ９２）で実現できる。又、本実施の形態によるマイクロコンピュータ２００では、１ビットで構成できるフラグレジスタを利用して命令キュー１０２内における分岐命令の有無や調査有無を把握している。このため、本実施の形態によれば小規模な回路により、分岐命令の先行フェッチを実現し分岐ペナルティを削除することが可能となる。従って、本実施の形態によるマイクロコンピュータ２００は、自動車電装やモバイル機器や、その他の汎用市場のなかでも、極小のコストが求められる低価格帯マイクロコンピュータの性能向上において特に有効である。
【０１３３】
本実施例では、パイプラインハザード期間がクロックサイクルＴ５〜Ｔ６の２サイクルである例を示したが、パイプラインハザード期間が２サイクル以上に長くなっても動作は同じである。この場合は、命令キュー格納されている分岐命令を検出する期間が長くなるため、分岐命令の先行検出及び分岐先命令の先行フェッチの確率は高まり、分岐ペナルティが排除され易くなる。
【０１３４】
図８は、本発明によるマイクロコンピュータのパイプライン処理動作の他の一例を示すタイミングチャートである。図８を参照して、ＤＦフラグレジスタ１０４の使用方法について説明する。
【０１３５】
図８を参照して、クロックサイクルＴ２からクロックサイクルＴ４の間、及びクロックサイクルＴ６からクロックサイクルＴ７の間、パイプラインハザードが発生しているものとする。
【０１３６】
クロックサイクルＴ２からクロックサイクルＴ４のハザード発生期間において、Ｑｕｅ［０］からＱｕｅ［４］には、“命令１”から“命令５”が保持される。クロックサイクルＴ２ではパイプラインハザードの発生により、ＤＦフラグレジスタ１０４のうち“１”が格納されていない最下位のＤＦ［０］に対応するＱｕｅ［０］の“命令１”が分岐命令か否かの調査が行われる。これにより、次のクロックサイクルＴ３においてＤＦ［０］に“１”がセットされる。クロックサイクルＴ３では、ハザード発生期間中のため、ＤＦフラグレジスタ１０４のうち“１”が格納されていない最下位のＤＦ［１］に対応するＱｕｅ［１］の“命令２”が分岐命令か否かの調査が行われる。これにより、次のクロックサイクルＴ４においてＤＦ［１］に“１”がセットされる。クロックサイクルＴ４では、ハザード発生期間中により、ＤＦフラグレジスタ１０４のうち“１”が格納されていない最下位のＤＦ［２］に対応するＱｕｅ［２］の“命令３”が分岐命令か否かの調査が行われる。これにより、次のクロックサイクルＴ５においてＤＦ［２］に“１”がセットされる。
【０１３７】
クロックサイクルＴ５では、ハザード期間中に命令１のデコードが保留とされていたため、命令キュー１０２内のデータはシフトせず、Ｑｕｅ［０］〜Ｑｕｅ［４］には“命令１”〜“命令５”が保持される。又、ハザード期間中に保留とされていた“命令０”がクロックサイクルＴ５において実行されることで、次のクロックサイクルＴ６からクロックサイクルＴ７の間、パイプラインハザードが発生する。
【０１３８】
クロックサイクルＴ６において命令キュー１０２内の命令コードはシフトしＱｕｅ［４］に“命令６”が格納される。クロックサイクルＴ６からクロックサイクルＴ７のハザード発生するため期間において、Ｑｕｅ［０］からＱｕｅ［４］には、“命令２”から“命令６”が保持される。又、クロックサイクルＴ５では、パイプラインハザードは発生していないため、クロックサイクルＴ６においてＤＦフラグレジスタ１０４内のフラグ情報はシフトし、ＤＦ［４］に“０”がセットされる。これにより、ＤＦ［４：０］に格納されるフラグ情報は“０００１１”となる。
【０１３９】
クロックサイクルＴ６ではパイプラインハザードの発生により、ＤＦフラグレジスタ１０４のうち“１”が格納されていない最下位のＤＦ［２］に対応するＱｕｅ［２］の“命令４”が分岐命令か否かの調査が行われる。これにより、次のクロックサイクルＴ７においてＤＦ［２］に“１”がセットされる。クロックサイクルＴ７では、ハザード発生期間中のため、ＤＦフラグレジスタ１０４のうち“１”が格納されていない最下位のＤＦ［３］に対応するＱｕｅ［２］の“命令５”が分岐命令か否かの調査が行われる。これにより、次のクロックサイクルＴ８においてＤＦ［３］に“１”がセットされる。
【０１４０】
以上のように、ＤＦフラグレジスタ１０４を利用することにより、命令キュー１０２において分岐命令か否かの調査が行われた否かを把握可能となる。このため、パイプラインハザードの発生の際、過去に分岐調査済みの命令コードを再調査することがなくなる。
【０１４１】
以上、本発明の実施の形態を詳述してきたが、具体的な構成は上記実施の形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。
【符号の説明】
【０１４２】
６１      ：セレクタ
６２      ：キュー選択回路
６３      ：キュークリア判定回路
６４      ：分岐先命令格納判定回路
６５      ：分岐先命令検出回路
９１      ：分岐アドレス抽出回路
９２      ：インクリメンタ
９３      ：セレクタ
１０２    ：命令キュー
１０３    ：ＱＶフラグレジスタ
１０４    ：ＤＦフラグレジスタ
１０５    ：ＢＦフラグレジスタ
１０６    ：キュー制御回路
１０９    ：分岐アドレス生成回路
１１０    ：セレクタ
１１１    ：フェッチポインタ
１１２    ：インクリメンタ
１１３    ：セレクタ
１１４    ：命令コード
１１５    ：命令キュー出力信号
１１６    ：ＱＶフラグレジスタ出力信号
１１７    ：ＱＶフラグレジスタ制御信号
１１８    ：ＤＦフラグレジスタ出力信号
１１９    ：ＤＦフラグレジスタ制御信号
１２０    ：ＢＦフラグレジスタ出力信号
１２１    ：ＢＦフラグレジスタ制御信号
１２２    ：選択後命令キュー出力信号
１２３    ：ハザード信号
１２４    ：分岐命令検出信号
１２５    ：分岐確定信号
１２６    ：分岐アドレス信号
１２７    ：更新アドレス信号
１２８    ：更新フェッチアドレス
１２９    ：フェッチポインタ信号
１３０    ：フェッチアドレス
１３１    ：命令実行要求信号
１３２    ：命令実行信号
１３３    ：分岐先命令検出信号
１４０    ：キュー選択制御信号
１５０    ：基準クロック
１６０    ：状態
２００    ：マイクロコンピュータ
２０１    ：ＣＰＵ
２０２    ：命令メモリ
２０３    ：命令フェッチ制御回路
２０４    ：命令デコーダ
２０５    ：演算実行回路
２０６    ：パイプライン制御回路
２０７    ：メモリアクセス制御回路
２０８    ：実行結果格納回路
２０９    ：周辺ＩＯ
２１０    ：命令実行制御回路
２１１    ：データメモリ
【図１】
2014056359.tif 000003
【図２】
2014056359.tif 000004
【図３】
2014056359.tif 000005
【図４】
2014056359.tif 000006
【図５】
2014056359.tif 000007
【図６】
2014056359.tif 000008
【図７】
2014056359.tif 000009
【図８】
2014056359.tif 000010