| 【発明の名称】 |
情報処理装置及びパイプライン処理方法 |
| 【発明者】 |
【氏名】福本 晴継
|
| 【要約】 |
【課題】1回のフェッチステージ(IF)でメモリから2つの命令を読み込むようにした2語フェッチ式のパイプライン処理を行う情報処理装置において、オペランドコンフリクトが発生しても正常な演算結果が得られるようにする。
【解決手段】2語フェッチ式の5段パイプライン処理を行うCPUは、前回のデコードステージ(DEC)で解読した命令がロード命令であり、今回のデコードステージで解読した命令が、ロードしたデータを用いるロードデータ使用命令であった場合に(t4 〜t5 )、そのロードデータ使用命令を破棄すると共に、次のフェッチステージの動作(C12のIF)を1回休止し、更に、プログラムカウンタ(第1レジスタ)の値を、システムクロックCK1が次に立ち上がったタイミング(t5 )で1つ前の値に戻し、その後、システムクロックCK1の1周期分をおいて、上記破棄した命令を解読・実行する(C13:t6 〜t10)。 |
【特許請求の範囲】
【請求項1】 メモリから命令レジスタ内へ2つの命令を同時に読み込むフェッチステージの動作を、基本クロックが2回発生する毎に行うと共に、前記命令レジスタ内に読み込まれた2つの命令を1つずつ解読するデコードステージ及び該デコードステージで解読された命令の内容に応じた演算を行う実行ステージなどの他のステージの動作を、前記基本クロックが1回発生する毎に行うようにした2語フェッチ式のパイプライン処理を実施する情報処理装置において、前回のデコードステージで解読した命令が、メモリからデータを読み込むロード命令であり、且つ、今回のデコードステージで解読した命令が、前記ロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合に、そのロードデータ使用命令を破棄すると共に、次のフェッチステージの動作を1回休止し、更に、前記基本クロックの1周期分をおいて、前記破棄したロードデータ使用命令を解読して実行するように構成されていること、を特徴とする情報処理装置。 【請求項2】 請求項1に記載の情報処理装置において、前回のデコードステージで解読した命令が、メモリからデータを読み込むロード命令であり、且つ、今回のデコードステージで解読した命令が、前記ロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合に、更に、前記フェッチステージで読み込むべき命令のアドレスを前記基本クロックの1周期毎にカウントするプログラムカウンタの値を、前記基本クロックが次に発生したタイミングで、1つ前の値に戻すように構成されていること、を特徴とする情報処理装置。 【請求項3】 メモリから命令レジスタ内へ2つの命令を同時に読み込むフェッチステージの動作を、基本クロックが2回発生する毎に行うと共に、前記命令レジスタ内に読み込まれた2つの命令を1つずつ解読するデコードステージ及び該デコードステージで解読された命令の内容に応じた演算を行う実行ステージなどの他のステージの動作を、前記基本クロックが1回発生する毎に行うようにした2語フェッチ式のパイプライン処理方法において、前回のデコードステージで解読した命令が、メモリからデータを読み込むロード命令であり、且つ、今回のデコードステージで解読した命令が、前記ロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合に、そのロードデータ使用命令を破棄すると共に、次のフェッチステージの動作を1回休止し、更に、前記基本クロックの1周期分をおいて、前記破棄したロードデータ使用命令を解読して実行すること、を特徴とするパイプライン処理方法。
|
【発明の詳細な説明】【0001】 【発明の属する技術分野】本発明は、1回のフェッチステージでメモリから2つの命令を同時に読み込むようにした2語フェッチ式のパイプライン処理方法、及びその方法を採用した情報処理装置に関するものである。 【0002】 【従来の技術】従来より、メモリから命令を読み込んで実行するための処理機能を複数種類のステージに分け、並列して異なるステージの動作を行うことにより、複数の命令処理サイクルを部分的に重複したタイミングで実行するパイプライン処理方法を採用した情報処理装置が知られている。 【0003】そして更に、この種の情報処理装置として、処理速度をより高速化するために、メモリから2つの命令を1度に読み込むようにした2語フェッチ式のパイプライン処理を行うものが提案されている(例えば、本出願人による特願平9−289994号)。 【0004】ここで、こうした2語フェッチ式のパイプライン処理を行う情報処理装置の基本的な動作について、5段パイプライン処理を行う図8のCPU(マイクロプロセッサ)100を例に挙げて説明する。まず、図8に示すように、この例のCPU100は、データバス1とアドレスバス2を介して、プログラムを格納したROM等のメモリ3に接続されると共に、データバス4とアドレスバス5を介して、RAM等のデータ格納用メモリ6に接続される。また、メモリ3には、CPU100が1回のアクセスで2つの命令を同時に読み込むことができるようにするため、その1アドレス当りに、偶数アドレスの命令とそれに続く奇数アドレスの命令とが1組にされて格納されている。よって、CPU100は、メモリ3から「命令0」と「命令1」,「命令2」と「命令3」,「命令4」と「命令5」、といった具合に、偶数アドレスの命令とそれに続く奇数アドレスの命令とを一緒に読み込むこととなる。 【0005】次に、このCPU100では、処理機能を、メモリ3から命令レジスタ内へ2つの命令を同時に読み込むIF(フェッチ)ステージと、IFステージで命令レジスタ内に読み込まれた2つの命令を1つずつ解読するDEC(デコード)ステージと、DECステージで解読された命令の内容に応じて、IFステージで読み込むべき命令のアドレスやメモリ6へアクセスする際のアドレス等を演算するEXE(実行)ステージと、DECステージで解読された命令の内容に応じて、EXEステージでの演算結果をアドレスとしてメモリ6へのアクセス(即ち、データの読み込み或いは書き込み)を行うMA(メモリアクセス)ステージと、DECステージで解読された命令の内容に応じて、演算データ或いはメモリ6からのデータを内部レジスタに書き込むWB(ライトバツク)ステージとの、5つのステージに分割している。 【0006】そして、このCPU100は、IFステージの動作を、動作用の基本クロック(所謂システムクロック)が2回発生する毎に行うと共に、他のステージの動作を、基本クロックが1回発生する毎に行い、図9の如き並列関係にてパイプライン処理を実施する。 【0007】即ち、図9に示すように、n番目の命令処理サイクルC100では、まずIFステージにて、メモリ3から命令レジスタ内へ2つの命令を同時に読み込み、次にDECステージにて、上記読み込んだ2命令のうちの最初の命令(つまり、偶数アドレスの命令)を解読し、続くEXEステージにて、上記解読した命令の内容に応じた演算を行う。そして、上記解読した命令がメモリ6へアクセスする命令ならば、続くMAステージにて、メモリ6へのアクセス(データの読み込み或いは書き込み:リード/ライト)が行われ、最後にWBステージにて、演算データ或いはメモリ6からのデータが内部レジスタに格納される。 【0008】また、n+1番目の命令処理サイクルC101では、IFステージの動作が行われず、その命令処理サイクルC101のDECステージの動作は、命令処理サイクルC100のEXEステージと並列に行われる。そして、この命令処理サイクルC101では、DECステージにて、命令処理サイクルC100のIFステージで読み込んだ2命令のうちの2番目の命令(つまり、奇数アドレスの命令)を解読し、続くEXEステージ以降の各ステージの動作は、命令処理サイクルC100の場合と同様に行われていく。 【0009】そして、図9では、n番目からn+5番目までの6つの命令処理サイクルC100〜C105しか図示されていないが、前述した2つの命令処理サイクルC100,C101と同様の動作が繰り返されることとなる。具体的には、n番目の命令処理サイクルC100のDECステージとn+1番目の命令処理サイクルC101のDECステージとの期間に亘って、n+2番目の命令処理サイクルC102のIFステージの動作が行われ、その命令処理サイクルC102のEXEステージのときに、IFステージを持たないn+3番目の命令処理サイクルC103のDECステージの動作が行われる。そして更に、n+2番目の命令処理サイクルC102のDECステージとn+3番目の命令処理サイクルC103のDECステージとの期間に亘って、n+4番目の命令処理サイクルC104のIFステージの動作が行われ、その命令処理サイクルC104のEXEステージのときに、IFステージを持たないn+5番目の命令処理サイクルC105のDECステージの動作が行われる、といった具合に、複数の命令処理サイクルにおける異なるステージの動作が並列に行われる。 【0010】 【発明が解決しようとする課題】ところで、このような2語フェッチ式のパイプライン処理を行う従来のCPU100では、前回のDECステージで解読した命令が、メモリからデータを読み込むロード命令であり、且つ、今回のDECステージで解読した命令が、上記ロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合に、所謂オペランドコンフリクトが発生して、そのロードデータ使用命令の実行による演算結果が、正常な値にならないという問題がある。 【0011】以下、この問題を、図10と図11を用いて具体的に説明する。まず、図10は、命令処理サイクルC200のDECステージで、内部レジスタr0の値が示すメモリ6のアドレスからデータをロードして内部レジスタr1に格納するロード命令[load @r0,r1]を解読し、且つ、次の命令処理サイクルC201のDECステージで、内部レジスタr1の値と内部レジスタr2の値とを足し算するロードデータ使用命令[add r1,r2]を解読した場合を表している。 【0012】つまり、図10は、命令処理サイクルC200のIFステージで読み込んだ2命令のうちの偶数アドレスの命令が、上記ロード命令[load @r0,r1]であると共に、命令処理サイクルC200のIFステージで読み込んだ2命令のうちの奇数アドレスの命令が、上記ロードデータ使用命令[add r1,r2]であり、その命令処理サイクルC200にて、上記ロード命令[load@r0,r1]を解読及び実行し、次の命令処理サイクルC201にて、上記ロードデータ使用命令[add r1,r2]を解読及び実行する場合を表している。 【0013】この図10の場合、命令処理サイクルC200のMAステージで、内部レジスタr0の値をアドレスとしてメモリ6からデータが読み込まれ(ロードされ)、同命令処理サイクルC200の続くWBステージで、メモリ6からロードされたデータが内部レジスタr1に格納される。そして、命令処理サイクルC201のEXEステージで、内部レジスタr1の値と内部レジスタr2の値とが足し算される。 【0014】ところが、図10の斜線部で示すように、命令処理サイクルC201のEXEステージで、内部レジスタr1の値と内部レジスタr2の値とを足し算する時点では、命令処理サイクルC200のMAステージ及びWBステージの動作が完了しておらず、内部レジスタr1には、メモリ6からロードされるデータが未だ格納されていない。このため、命令処理サイクルC201のEXEステージにて、内部レジスタr1の古い値と、内部レジスタr2の値とが足し算されてしまい、正常な演算結果が得られなくなるのである。 【0015】次に、図11は、命令処理サイクルC301のDECステージで、前述のロード命令[load @r0,r1]を解読し、且つ、次の命令処理サイクルC302のDECステージで、前述のロードデータ使用命令[add r1,r2]を解読した場合を表している。 【0016】つまり、図11は、命令処理サイクルC300のIFステージで読み込んだ2命令のうちの奇数アドレスの命令が、上記ロード命令[load @r0,r1]であると共に、命令処理サイクルC302のIFステージで読み込んだ2命令のうちの偶数アドレスの命令が、上記ロードデータ使用命令[add r1,r2]であり、命令処理サイクルC301にて、上記ロード命令[load @r0,r1]を解読及び実行し、次の命令処理サイクルC302にて、上記ロードデータ使用命令[add r1,r2]を解読及び実行する場合を表している。 【0017】この図11の場合、命令処理サイクルC301のMAステージで、内部レジスタr0の値をアドレスとしてメモリ6からデータが読み込まれ(ロードされ)、同命令処理サイクルC301の続くWBステージで、メモリ6からロードされたデータが内部レジスタr1に格納される。そして、命令処理サイクルC302のEXEステージで、内部レジスタr1の値と内部レジスタr2の値とが足し算される。 【0018】ところが、図11の斜線部で示すように、命令処理サイクルC302のEXEステージで、内部レジスタr1の値と内部レジスタr2の値とを足し算する時点では、命令処理サイクルC301のMAステージ及びWBステージの動作が完了しておらず、内部レジスタr1には、メモリ6からロードされるデータが未だ格納されていない。このため、図10の場合と同様に、命令処理サイクルC302のEXEステージでは、内部レジスタr1の古い値と、内部レジスタr2の値とが足し算されてしまい、正常な演算結果が得られなくなるのである。 【0019】そして、従来より、上記のようなオペランドコンフリクトによる問題を解決するためには、プログラムを作成する際に、専用のコンパイラ或いは人手によって、ロード命令とロードデータ使用命令との間に、処理に影響を及ぼさないNOP(non operation )命令を追加挿入するようにしていた。しかし、NOP命令を挿入すると、プログラムサイズが大きくなってしまうという欠点がある。 【0020】本発明は、こうした問題に鑑みなされたものであり、1回のフェッチステージでメモリから2つの命令を同時に読み込むようにした2語フェッチ式のパイプライン処理を行う情報処理装置において、オペランドコンフリクトが発生して正常な演算結果が得られなくなってしまうことを、パイプライン処理の流れを乱すことなく自動的に回避できるようにすることを目的としている。 【0021】 【課題を解決するための手段、及び発明の効果】上記目的を達成するためになされた請求項1に記載の本発明の情報処理装置(10)は、前述した従来装置と同様に、メモリ(3)から命令レジスタ(20a)内へ2つの命令を同時に読み込むフェッチステージ(IF)の動作を、基本クロック(CK1)が2回発生する毎に行うと共に、前記命令レジスタ(20a)内に読み込まれた2つの命令を1つずつ解読するデコードステージ(DEC)及び該デコードステージ(DEC)で解読された命令の内容に応じた演算を行う実行ステージ(EXE)などの他のステージの動作を、前記基本クロック(CK1)が1回発生する毎に行うようにした2語フェッチ式のパイプライン処理を実施して、上記メモリ(3)に格納されたプログラムを実行する。 【0022】そして特に、本発明の情報処理装置(10)は、前回のデコードステージで解読した命令が、メモリ(6)からデータを読み込むロード命令であり、且つ、今回のデコードステージで解読した命令が、前記ロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合に(t4 〜t5 又はt25〜t26)、そのロードデータ使用命令を破棄すると共に(t4 〜t5 又はt25〜t26)、次のフェッチステージの動作(C12のIF又はC24のIF)を1回休止し、更に、前記基本クロック(CK1)の1周期分をおいて、前記破棄したロードデータ使用命令を解読して実行する(t6 〜t10又はt27〜t31)ように構成されている。 【0023】尚、()内の符号は、図1〜図7における符号のうちで本発明の主要な部分に対応するものを示している。つまり、本発明の情報処理装置では、前回のデコードステージで解読した命令がロード命令であり、且つ、今回のデコードステージで解読した命令がロードデータ使用命令であった場合(以下、オペランドコンフリクトが発生した場合ともいう)に、上記今回のデコードステージではロードデータ使用命令を破棄して、その命令の解読及び実行を本来行うはずの命令処理サイクルにて、実質的な処理を行わないようにすると共に、次のフェッチステージの動作(即ち、命令レジスタ内へ新たな2命令を読み込む動作)を1回休止して、命令レジスタ内のロードデータ使用命令を含む2命令が変更されないようにしている。そして、基本クロックの1周期分をおいてから、上記破棄したロードデータ使用命令を再度解読して実行するようにしている。 【0024】このため、本発明の情報処理装置では、オペランドコンフリクトが発生した場合に、フェッチステージの動作が1回休止されて、命令レジスタ内にロードデータ使用命令が保存され、そのロードデータ使用命令は、該命令の解読及び実行を本来行うはずであった命令処理サイクルからフェッチステージの実行周期である基本クロックの2周期分だけ後の命令処理サイクルにて、解読及び実行されることとなる。 【0025】例えば、図6に示すように、命令処理サイクルC10のDECステージ(t3〜t4 )でロード命令が解読され、次の命令処理サイクルC11のDECステージ(t4 〜t5 )でロードデータ使用命令が解読された場合には、その命令処理サイクルC11にて、ロードデータ使用命令が破棄されて実質的な処理が行われず、また、命令処理サイクルC12のIFステージの動作が休止されて、時刻t3 〜時刻t7 までの間、命令レジスタ内の2命令が変更されなくなる。そして、命令処理サイクルC11から基本クロックの2周期分だけ後の命令処理サイクルC13にて、命令レジスタ内のロードデータ使用命令が解読及び実行され、その後は、通常の流れでパイプライン処理が行われることとなる。そして特に、この場合、ロードデータ使用命令に応じた演算を行う命令処理サイクルC13のEXEステージの動作は、ロード命令を実行する命令処理サイクルC10のMAステージ及びWBステージの後に行われるため、オペランドコンフリクトが発生しても正常な演算結果が得られる。 【0026】また、図7に示すように、命令処理サイクルC21のDECステージ(t24〜t25)でロード命令が解読され、次の命令処理サイクルC22のDECステージ(t25〜t26)でロードデータ使用命令が解読された場合には、その命令処理サイクルC22にて、ロードデータ使用命令が破棄されて実質的な処理が行われず、また、命令処理サイクルC24のIFステージの動作が休止されて、時刻t25〜時刻t29までの間、命令レジスタ内の2命令が変更されなくなる。そして、命令処理サイクルC22から基本クロックの2周期分だけ後の命令処理サイクルC24にて、命令レジスタ内のロードデータ使用命令が解読及び実行され、その後は、通常の流れでパイプライン処理が行われることとなる。そして特に、この場合、ロードデータ使用命令に応じた演算を行う命令処理サイクルC24のEXEステージの動作は、ロード命令を実行する命令処理サイクルC21のMAステージ及びWBステージの後に行われるため、オペランドコンフリクトが発生しても正常な演算結果が得られる。 【0027】このように本発明の情報処理装置によれば、オペランドコンフリクトが発生して正常な演算結果が得られなくなってしまうことを、パイプライン処理の流れを乱すことなく自動的に回避することができるようになる。ところで、本発明の情報処理装置において、請求項2に記載のように、オペランドコンフリクトが発生した場合に、更に、フェッチステージ(IF)で読み込むべき命令のアドレスを基本クロック(CK1)の1周期毎にカウントするプログラムカウンタ(36)の値を、基本クロック(CK1)が次に発生したタイミングで、1つ前の値に戻すように構成すれば、より確実である。 【0028】つまり、通常この種の情報処理装置では、プログラムカウンタ(36)が基本クロック(CK1)に同期してカウントするアドレスの値がアドレスバス(2)へ出力され、そのアドレスに対応するメモリ(3)内の命令をデータバス(1)を介して命令レジスタ(20a)内に読み込むことによりIFステージの動作が行われる。 【0029】そして、本発明の情報処理装置では、オペランドコンフリクトが発生した場合に、ロードデータ使用命令の解読及び実行を本来行うはずの命令処理サイクルから基本クロック(CK1)の2周期分だけ後の命令処理サイクルで、そのロードデータ使用命令を実際に解読して実行するようにしているため、ロードデータ使用命令を実際に解読して実行する命令処理サイクルのDECステージのタイミングにて、プログラムカウンタ(36)の値が2つ余分に進んでしまうこととなる。 【0030】そこで、請求項2に記載のように、オペランドコンフリクトが発生した場合に、プログラムカウンタ(36)の値を、基本クロック(CK1)が次に発生したタイミング(前述した図6の例では時刻t5 であり、図7の例では時刻t26)で1つ前の値に戻すようにすれば、ロードデータ使用命令を実際に解読して実行する命令処理サイクルのDECステージでのプログラムカウンタ(36)の値が、ロードデータ使用命令を最初に解読した命令処理サイクルのDECステージでのプログラムカウンタ(36)の値と一致することとなり、パイプライン処理の流れが異常になってしまうのを確実に防ぐことができるのである。 【0031】一方、本発明の2語フェッチ式のパイプライン処理方法は、前回のデコードステージで解読した命令が、メモリからデータを読み込むロード命令であり、且つ、今回のデコードステージで解読した命令が、前記ロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合(オペランドコンフリクトが発生した場合)に、そのロードデータ使用命令を破棄すると共に、次のフェッチステージの動作を1回休止し、更に、前記基本クロックの1周期分をおいて、前記破棄したロードデータ使用命令を解読して実行することにより、実施することができる。 【0032】そして、CPU等の情報処理装置が本発明の2語フェッチ式のパイプライン処理方法を実施すれば、前述したように、オペランドコンフリクトが発生して正常な演算結果が得られなくなってしまうことを、パイプライン処理の流れを乱すことなく自動的に回避することができるようになる。 【0033】 【発明の実施の形態】以下、本発明が適用された実施形態の情報処理装置としてのCPU10について、図1〜図7を用いて説明する。尚、図1〜図7において、前述の図8〜図11と同じものについては、同一の符号を付しているため詳細な説明は省略する。 【0034】まず、本実施形態のCPU10も、基本的に図9に示した2語フェッチ式のパイプライン処理を行ってプログラムを実行するものであり、図1に示すように、データバス1とアドレスバス2を介して、実行対象のプログラムを記憶したメモリ(例えばROM)3に接続され、また、データバス4とアドレスバス5を介して、データ格納用のメモリ(例えばRAM)6に接続される。そして、CPU10には、リセット信号線12を介して初期化用のリセット信号RSが与えられ、また、クロック信号線14を介して動作用の基本クロックとしてのシステムクロックCK1が入力される。 【0035】尚、前述したように、メモリ3には、CPU10が1回のアクセスで2つの命令を同時に読み込むことができるようにするため、その1アドレス当りに、偶数アドレスの命令とそれに続く奇数アドレスの命令とが1組にされて格納されている(図8参照)。つまり、メモリ3のデータ線及びデータバス1のバス幅が、命令語長(1命令のビット長)の2倍になっている。 【0036】次に、本実施形態のCPU10は、図2に示すように、パイプライン処理のための制御を行うデコーダ16と、データやアドレス等の演算を行うデータパス18とから構成されている。そして、デコーダ16は、IFステージにてメモリ3からデータバス1を介して命令を読み込む命令レジスタユニット20と、DECステージにて命令を解読する命令解読部22と、図4に示す如くシステムクロックCK1が2回発生する毎にフェッチクロックCK2を生成して、そのフェッチクロックCK2を命令レジスタユニット20へ出力すると共に、後述するように命令解読部22からコンフリクト信号CSが出力された場合に、次のフェッチクロックCK2の出力を1回停止するフェッチクロック制御部24と、演算結果がオーバーフローしたとか0であるといったプロセッサステータスを保持して、その保持内容を表すプロセッサステータス信号PSSを命令解読部22に出力するプロセッサステータスレジスタ(以下、PSRという)25とを備えている。 【0037】一方、データパス18は、MAステージにてメモリ6からデータバス4を介してデータを読み込んだり、メモリ6に書き込むべきデータをデータバス4へ出力するロードストアユニット30と、EXEステージにて命令の内容に応じた演算を行う実行ユニット32と、複数の内部レジスタr0,r1,r2,…(図示省略)を内蔵したレジスタファイルユニット34と、メモリ3からIFステージで読み込むべき命令のアドレスを格納及びカウントするプログラムカウンタ36と、MAステージにてアドレスバス5へアドレスを出力するアドレスユニット38とを備えている。 【0038】ここで、デコーダ16内の命令レジスタユニット20は、図3に示すように、フェッチクロック制御部24から出力されるフェッチクロックCK2の立ち上がりタイミングで、データバス1上のデータ(即ち、2つの命令)を格納する命令レジスタ20aと、後述するように命令解読部22からシステムクロックCK1に同期して出力される命令セレクト信号SLSに従って、命令レジスタ20a内の上位命令(本実施形態では、偶数アドレスの命令)と下位命令(本実施形態では、奇数アドレスの命令)を交互に命令バス26へ出力する命令セレクタ20bと、から構成されている。尚、命令レジスタ20aのビット長は、命令語長の2倍に設定されている。 【0039】そして、命令解読部22は、図4に示す如く、システムクロックCK1が立ち上がる毎に、上記命令セレクタ20bへの命令セレクト信号SLSの論理値を、上位命令を命令バス26へ出力させるための「0」と、下位命令を命令バス26へ出力させるための「1」とに、交互に切り替えて出力する。 【0040】そして更に、命令解読部22は、システムクロックCK1に同期して、上記命令バス26の命令を1つずつ解読し、その解読した命令の内容に応じて、データパス18内の各部を制御するための制御信号を制御バス28へ出力する。よって、通常時には、図4に示すように、システムクロックCK1が2回発生してフェッチクロックCK2が立ち上がる毎に、命令レジスタユニット20の命令レジスタ20a内へメモリ3からの上位命令と下位命令とが同時に読み込まれると共に、システムクロックCK1が立ち上がる毎に、命令レジスタ20a内の上位命令と下位命令とが交互に命令バス26へ出力されて、その命令の各々が、1システムクロックCK1(システムクロックCK1の1周期)毎に、命令解読部22によって解読されることとなる。 【0041】ここで特に、命令解読部22は、前回解読した命令が、メモリ6からデータを読み込むロード命令であり、且つ、今回解読した命令が、そのロード命令の実行により読み込まれるデータを使用するロードデータ使用命令であった場合に、オペランドコンフリクトが発生したと判断する。 【0042】そして、命令解読部22は、オペランドコンフリクトが発生したと判断すると、今回解読したロードデータ使用命令を破棄すると共に、フェッチクロック制御部24へコンフリクト信号CSを出力し、更に、プログラムカウンタ36へ、制御バス28を介して、そのカウント値を1つ前の値に戻すための変更指令出力する。そして、その後、命令解読部22は、次のシステムクロックCK1のタイミングで命令バス26から取得する命令も破棄し、その次のシステムクロックCK1のタイミングで命令バス26から取得する命令から解読を再開する。尚、命令解読部22が命令を破棄すると、処理に影響を及ぼさないNOP命令を解読したのと同じ状態になる。 【0043】一方、データパス18内のロードストアユニット30は、システムクロックCK1に同期し、且つ、命令解読部22からの制御バス28の制御信号に従って、レジスタファイルユニット34からの出力データ(即ち、レジスタ値)Rmをデータバス4へ出力したり、或いは、データバス4から入力したデータをデータパス18内のWB(ライトバック)バス40へ出力する。 【0044】そして、実行ユニット32は、システムクロックCK1に同期し、且つ、制御バス28からの制御信号に従って、レジスタファイルユニット34からの2つの出力データRm,Rnに対し演算を行い、その演算結果をWBバス40へ出力する。 【0045】尚、実行ユニット32は、命令解読部22で解読された命令の内容に応じた演算を行う。例えば、命令解読部22で解読された命令がメモリ6をアクセスする命令であれば、実行ユニット32はアクセスすべき(即ち、データの読み書きを行うべき)メモリ6のアドレスを演算することとなり、また、命令解読部22で解読された命令が論理積や論理和等を行う命令であれば、実行ユニット32はその命令に応じた論理演算を行うこととなる。また例えば、命令解読部22で解読された命令が分岐命令であれば、実行ユニット32は分岐先の命令のアドレスを演算することとなる。 【0046】また、レジスタファイルユニット34は、システムクロックCK1に同期し、且つ、制御バス28からの制御信号に従って、WBバス40のデータを内部のレジスタ(内部レジスタ)に格納したり、或いは、その格納したデータを上記出力データRm,Rnとして実行ユニット32やロードストアユニット30へ出力する。 【0047】そして、プログラムカウンタ36は、システムクロックCK1に同期し、且つ、制御バス28からの制御信号に従って、WBバス40のデータを格納したりカウントアップし、そのデータを、データパス18内のプログラムバス42を介してアドレスバス2へ出力する。 【0048】ここで、プログラムカウンタ36は、図5に示すように、入力されるデータをシステムクロックCK1の立ち上がりタイミングで保持すると共に、その保持したデータをプログラムバス42へ出力する第1レジスタ36aと、この第1レジスタ36aの出力データをシステムクロックCK1の立ち上がりタイミングで保持すると共に、その保持したデータを出力する第2レジスタ36bと、第1レジスタ36aの出力データを1インクリメントして、その1インクリメント後のデータを出力する+1加算器36cと、制御バス28からの制御信号に従って、第2レジスタ36bの出力データ,+1加算器36cの出力データ,及びWBバス40のデータのうちの何れか1つを、第1レジスタ36aに入力させるPCセレクタ36dと、から構成されている。 【0049】このようなプログラムカウンタ36において、通常は、PCセレクタ36dが、制御バス28からの制御信号に従い、+1加算器36cの出力データを第1レジスタ36aに入力させる。よって、第1レジスタ36aの出力データは、システムクロックCK1が立ち上がる毎に1つずつカウントアップされる。 【0050】そして、その第1レジスタ36aの出力データが、メモリ3から命令を読み込むためのアドレスとして、プログラムバス42を介しアドレスバス2へ出力される。但し、プログラムバス42へは、第1レジスタ36aのデータの各ビットのうち、最下位ビット以外のビットが出力されるようになっている。このため、当該プログラムカウンタ36(詳しくは第1レジスタ36a)からアドレスバス2へ出力されるデータであって、メモリ3から命令を読み込むためのアドレスは、2システムクロックCK1(システムクロックCK1の2周期)毎に更新されることとなる。 【0051】また、第1レジスタ36aと第2レジスタ36bは、シフトレジスタの形態を成しているため、第2レジスタ36bには、第1レジスタ36aの前回の出力データが保持されることとなる。一方、命令解読部22が制御バス28へ前述の変更指令を出力すると、PCセレクタ36dは、第2レジスタ36bの出力データを第1レジスタ36aに入力させる。すると、当該プログラムカウンタ36のカウント値である第1レジスタ36aのデータは、次のシステムクロックCK1の立ち上がりタイミングで、1つ前の値に戻ることとなる。 【0052】また、命令解読部22が分岐命令を解読して、その分岐先の命令のアドレスを実行ユニット32が演算した場合には、PCセレクタ36dが、制御バス28からの制御信号に従い、WBバス40のデータ(即ち、分岐先の命令のアドレス)を第1レジスタ36aに入力させることとなる。 【0053】一方、データパス18内のアドレスユニット38は、システムクロックCK1に同期して、WBバス40のデータをラッチし、そのラッチしたデータをアドレスバス5へアドレスとして出力する。また、デコーダ16内のPSR25は、システムクロックCK1に同期し、且つ、制御バス28からの制御信号に従って、WBバス40のデータを基にプロセッサステータスを保持し、前述したプロセッサステータス信号PSSを命令解読部22に出力する。 【0054】以上のような本実施形態のCPU10においては、前述したように、通常は、2システムクロックCK1毎に、プログラムカウンタ36(詳しくは第1レジスタ36a)からアドレスバス2へ、メモリ3から命令を読み込むための新たなアドレスが出力される。 【0055】すると、そのアドレスバス2上のアドレスに応答して、メモリ3がデータバス1へ偶数アドレスの命令と奇数アドレスの命令との2つの命令を出力することとなり(図8参照)、その2つの命令が、2システムクロックCK1毎のフェッチクロックCK2の立ち上がりタイミングで、命令レジスタユニット20の命令レジスタ20aに同時に格納される。そして、このような2システムクロックCK1毎の動作によって、IFステージの動作が実現される。 【0056】一方、デコーダ16においては、命令解読部22が、命令レジスタ20a内の2つの命令を、1システムクロックCK1毎に、偶数アドレスの命令と奇数アドレスの命令の順に解読し、これによってDECステージの動作が実現される。そして、データパス18においては、1システムクロックCK1毎に、実行ユニット32が、命令解読部22で解読された命令の内容に応じた演算を行い、これによってEXEステージの動作が実現される。 【0057】また、このEXEステージでの実行ユニット32による演算結果が、データパス18のロードストアユニット30,レジスタファイルユニット34,及びアドレスユニット38で処理されることにより、MAステージやWBステージの動作が実現される。 【0058】例えば、命令解読部22で解読された命令が、メモリ6からデータを読み込むロード命令であり、実行ユニット32が、アクセスすべきメモリ6のアドレスを演算してWBバス40に出力すると、そのWBバス40のデータがアドレスユニット38によりアドレスバス5へ出力されると共に、そのアドレスバス5上のアドレスに応答してメモリ6からデータバス4へ出力されるデータが、ロードストアユニット30内に読み込まれることにより、MAステージの動作が実現される。そして、ロードストアユニット30内に読み込まれたデータを、レジスタファイルユニット34が、WBバス40を介して内部レジスタに格納することにより、WBステージの動作が実現される。 【0059】そして、本実施形態のCPU10では、デコーダ16とデータパス18の各部が上記のように動作することにより、基本的には、従来のCPU100と同様に、図9に示した流れのパイプライン処理を行うが、前述した図10,図11のようにオペランドコンフリクトが発生した場合には、パイプライン処理の流れが図6,図7のようになる。尚、図6及び図7において、t1 〜t11とt21〜t31とで示す各時刻は、システムクロックCK1の立ち上がりタイミングであり、その各時刻の間隔は、システムクロックCK1の1周期分である。 【0060】そこで以下、オペランドコンフリクトが発生した場合のCPU10の動作について、図6と図7との各々を用い説明する。まず、図6は、図10の場合と同様に、命令処理サイクルC10のDECステージ(t3 〜t4 )で、内部レジスタr0の値が示すメモリ6のアドレスからデータをロードして内部レジスタr1に格納するロード命令[load @r0,r1]を解読し、且つ、次の命令処理サイクルC11のDECステージ(t4 〜t5 )で、内部レジスタr1の値と内部レジスタr2の値とを足し算するロードデータ使用命令[add r1,r2]を解読した場合を表している。つまり、図6は、命令処理サイクルC10のIFステージで命令レジスタ20a内に読み込んだ2命令のうちの偶数アドレスの命令(図6における命令0)が、ロード命令[load @r0,r1]であり、命令処理サイクルC10のIFステージで命令レジスタ20a内に読み込んだ2命令のうちの奇数アドレスの命令(図6における命令1)が、ロードデータ使用命令[add r1,r2]であった場合を表している。 【0061】この図6の場合、命令解読部22が、命令処理サイクルC11のDECステージ(t4 〜t5 )にて、オペランドコンフリクトが発生したと判断し、前述したように下記の■〜■の動作を行う。 ■:今回解読したロードデータ使用命令[add r1,r2]を破棄する。尚、命令の破棄とは、制御バス28により、PSR25,レジスタファイルユニット34,及びメモリ6への書き込みを禁止することを意味しており、命令解読部22が命令を破棄すると、NOP命令を解読したのと同じ状態になる。 【0062】■:フェッチクロック制御部24へコンフリクト信号CSを出力する。 ■:プログラムカウンタ36へ、制御バス28を介して、そのカウント値を1つ前の値に戻すための変更指令を出力する。すると、上記■の動作により、命令処理サイクルC11のDECステージ以降の各ステージでは、「−」印で示すように実質的な処理が行われなくなる。 【0063】また、上記■の動作により、フェッチクロック制御部24が次のフェッチクロックCK2の出力を1回停止するため、本来ならば時刻t5 で命令レジスタユニット20へ出力されるはずのフェッチクロックCK2が出力されなくなる。その結果、次のIFステージ(この場合には、命令処理サイクルC12のIFステージ)の動作が休止されて、時刻t3 〜時刻t7 までの間、命令レジスタ20a内には、命令処理サイクルC10のIFステージで読み込んだロード命令(命令0)[load @r0,r1]とロードデータ使用命令(命令1)[add r1,r2]との2命令が保存されたままになる。 【0064】また更に、上記■の動作により、前述したように、プログラムカウンタ36の値としての第1レジスタ36aの値が、次のシステムクロックCK1の立ち上がりタイミング(この場合には、時刻t5 )で、1つ前の値に戻ることとなる。尚、図6の例では、時刻t1 にて、第1レジスタ36aの値が「PC」となっており、第2レジスタ36bの値が「PC」よりも1だけ小さい「PC-1」となっている。そして、この場合、システムクロックCK1が立ち上がる毎に、第1レジスタ36aの値は「PC+1」,「PC+2」,「PC+3」とカウントアップされ、また、第2レジスタ36bの値は「PC」,「PC+1」,「PC+2」とカウントアップされるが、命令処理サイクルC11のDECステージ(t4 〜t5 )で、命令解読部22からプログラムカウンタ36へ上記変更指令が出力されると、時刻t5 にて、第1レジスタ36aに直前の第2レジスタ36bの値(「PC+2」)が格納され、その結果、第1レジスタ36aの値は、時刻t5 にて、それまでの「PC+3」から1つ前の値である「PC+2」に戻ることとなる。 【0065】その後、命令解読部22は、次の命令処理サイクルC12のDECステージ(t5 〜t6 )においても、命令バス26から取得する命令を破棄する。よって、命令処理サイクルC12のDECステージ以降の各ステージにおいても、「−」印で示すように実質的な処理が行われなくなる。 【0066】そして、命令解読部22は、次の命令処理サイクルC13のDECステージ(t6 〜t7 )にて、命令バス26から取得する命令を解読し、以後は、通常の動作に戻る。ここで、命令処理サイクルC13のDECステージで解読される命令は、フェッチクロックCK2の停止に伴い命令レジスタ20a内に保存されている2命令のうちの奇数アドレスの命令であって、命令処理サイクルC11のDECステージで破棄されたロードデータ使用命令(命令1)[add r1,r2]である。 【0067】このため、ロードデータ使用命令[add r1,r2]は、その命令の解読及び実行を本来行うはずであった命令処理サイクルC11からIFステージの実行周期である2システムクロックCK1分だけ後の命令処理サイクルC13にて、解読及び実行されることとなる。 【0068】そして、この場合、ロードデータ使用命令[add r1,r2]に応じた演算(足し算)を行う命令処理サイクルC13のEXEステージ(t7 〜t8 )の動作は、ロード命令[load @r0,r1]を実行する命令処理サイクルC10のMAステージ(t5 〜t6 )及びWBステージ(t6 〜t7 )の後に行われるため、オペランドコンフリクトが発生しても正常な演算結果が得られる。 【0069】また、命令解読部22によりオペランドコンフリクトが発生したと判断されると、プログラムカウンタ36の値としての第1レジスタ36aの値が、次のシステムクロックCK1の立ち上がりタイミングで1つ前の値に戻されるため、図6に示すように、ロードデータ使用命令[add r1,r2]を実際に解読して実行する命令処理サイクルC13のDECステージでの第1レジスタ36aの値(「PC+3」)と、ロードデータ使用命令[add r1,r2]を最初に解読した命令処理サイクルC11のDECステージでの第1レジスタ36aの値(「PC+3」)とが一致することとなり、プログラムカウンタ36と命令との関係を正常な状態に保つことができる。 【0070】そして、本実施形態のCPU10では、上記一連の動作により、オペランドコンフリクトが発生して正常な演算結果が得られなくなってしまうことを、パイプライン処理の流れを乱すことなく自動的に回避することができる。次に、図7は、図11の場合と同様に、命令処理サイクルC21のDECステージ(t24〜t25)で、ロード命令[load @r0,r1]を解読し、且つ、次の命令処理サイクルC22のDECステージ(t25〜t26)で、ロードデータ使用命令[add r1,r2]を解読した場合を表している。つまり、図7は、命令処理サイクルC20のIFステージで命令レジスタ20a内に読み込んだ2命令のうちの奇数アドレスの命令(図7における命令1)が、ロード命令[load @r0,r1]であり、命令処理サイクルC22のIFステージで命令レジスタ20a内に読み込んだ2命令のうちの偶数アドレスの命令(図7における命令2)が、ロードデータ使用命令[add r1,r2]であった場合を表している。 【0071】この図7の場合、命令解読部22が、命令処理サイクルC22のDECステージ(t25〜t26)にて、オペランドコンフリクトが発生したと判断し、前述した■〜■の動作を行う。すると、上記■の動作により、命令処理サイクルC22のDECステージ以降の各ステージでは、「−」印で示すように実質的な処理が行われなくなる。 【0072】また、上記■の動作により、フェッチクロック制御部24が次のフェッチクロックCK2の出力を1回停止するため、本来ならば時刻t27で命令レジスタユニット20へ出力されるはずのフェッチクロックCK2が出力されなくなる。その結果、次のIFステージ(この場合には、命令処理サイクルC24のIFステージ)の動作が休止されて、時刻t25〜時刻t29までの間、命令レジスタ20a内には、命令処理サイクルC22のIFステージで読み込んだ偶数アドレスの命令であるロードデータ使用命令(命令2)[add r1,r2]と奇数アドレスの命令(命令3)との2命令が保存されたままになる。 【0073】また更に、上記■の動作により、プログラムカウンタ36の値としての第1レジスタ36aの値が、次のシステムクロックCK1の立ち上がりタイミング(この場合には、時刻t26)で、1つ前の値に戻ることとなる。尚、図7の例では、時刻t26にて、第1レジスタ36aに直前の第2レジスタ36bの値(「PC+3」)が格納され、その結果、第1レジスタ36aの値は、時刻t26にて、それまでの「PC+4」から1つ前の値である「PC+3」に戻ることとなる。 【0074】その後、命令解読部22は、次の命令処理サイクルC23のDECステージ(t26〜t27)においても、命令バス26から取得する命令を破棄する。よって、命令処理サイクルC23のDECステージ以降の各ステージにおいても、「−」印で示すように実質的な処理が行われなくなる。 【0075】そして、命令解読部22は、次の命令処理サイクルC24のDECステージ(t27〜t28)にて、命令バス26から取得する命令を解読し、以後は、通常の動作に戻る。ここで、命令処理サイクルC24のDECステージで解読される命令は、フェッチクロックCK2の停止に伴い命令レジスタ20a内に保存されている2命令のうちの偶数アドレスの命令であって、命令処理サイクルC22のDECステージで破棄されたロードデータ使用命令(命令2)[add r1,r2]である。 【0076】このため、ロードデータ使用命令[add r1,r2]は、その命令の解読及び実行を本来行うはずであった命令処理サイクルC22からIFステージの実行周期である2システムクロックCK1分だけ後の命令処理サイクルC24にて、解読及び実行されることとなる。 【0077】そして、この場合、ロードデータ使用命令[add r1,r2]に応じた演算(足し算)を行う命令処理サイクルC24のEXEステージ(t28〜t29)の動作は、ロード命令[load @r0,r1]を実行する命令処理サイクルC21のMAステージ(t26〜t27)及びWBステージ(t27〜t28)の後に行われるため、オペランドコンフリクトが発生しても正常な演算結果が得られる。 【0078】また、命令解読部22によりオペランドコンフリクトが発生したと判断されると、プログラムカウンタ36の値としての第1レジスタ36aの値が、次のシステムクロックCK1の立ち上がりタイミングで1つ前の値に戻されるため、図7に示すように、ロードデータ使用命令[add r1,r2]を実際に解読して実行する命令処理サイクルC24のDECステージでの第1レジスタ36aの値(「PC+4」)と、ロードデータ使用命令[add r1,r2]を最初に解読した命令処理サイクルC22のDECステージでの第1レジスタ36aの値(「PC+4」)とが一致することとなり、プログラムカウンタ36と命令との関係を正常な状態に保つことができる。 【0079】そして、本実施形態のCPU10では、上記一連の動作により、オペランドコンフリクトが発生して正常な演算結果が得られなくなってしまうことを、パイプライン処理の流れを乱すことなく自動的に回避することができる。以上のように、本実施形態のCPU10では、オペランドコンフリクトが発生したと判断すると、今回解読したロードデータ使用命令を破棄すると共に(図6におけるt4 〜t5 又は図7におけるt25〜t26)、次のフェッチステージの動作(図6におけるC12のIF又は図7におけるC24のIF)を1回休止し、更に、プログラムカウンタ36の値を、システムクロックCK1が次に立ち上がったタイミング(図6におけるt5 又は図7におけるt26)で1つ前の値に戻し、その後、システムクロックCK1の1周期分をおいて、上記破棄したロードデータ使用命令を解読して実行するようにしている(図6におけるt6 〜t10又は図7におけるt27〜t31)。 【0080】このため、オペランドコンフリクトが発生して正常な演算結果が得られなくなってしまうことを、パイプライン処理の流れを乱すことなく自動的に回避することができる。つまり、ロード命令の直後に、そのロード命令の実行によりメモリから読み込まれるデータを使用するロードデータ使用命令が発行された場合でも、正常な動作を維持することができ、汎用性の高いCPUとなる。 【0081】以上、本発明の一実施形態について説明したが、本発明は、上記実施形態に限定されるものではなく、種々の形態を採り得ることは言うまでもない。例えば、本発明は、図9に示したパイプライン処理を行うものに限らず、他の2語フェッチ式のパイプライン処理を行う情報処理装置に対しても、同様に適用することができる。
|
| 【出願人】 |
【識別番号】000004260 【氏名又は名称】株式会社デンソー
|
| 【出願日】 |
平成10年(1998)5月20日 |
| 【代理人】 |
【弁理士】 【氏名又は名称】足立 勉
|
| 【公開番号】 |
特開平11−327902 |
| 【公開日】 |
平成11年(1999)11月30日 |
| 【出願番号】 |
特願平10−138883 |
|