(57)【要約】【課題】未実行の命令と実行済みの命令の両方についてキャッシュヒットが可能なマイクロプロセッサを提供する。【解決手段】プリフェッチバッファ６は、ＳＤＲＡＭ２からプリフェッチした命令を格納する。バッファ制御部１６は、書込みアドレスを表わす第１のレジスタ１０内のトップホインタ、読出しアドレスを表わす第２のレジスタ１２内のリードホインタおよび最も古い有効な命令の格納アドレスを表わす第３のレジスタ１４内のボトムホインタに基づいて、分岐先の命令がプリフェッチバッファ６内に存在するか否かを判定し、分岐先の命令が存在するときには、リードホインタの値を分岐先の命令のアドレスを指定するように変更し、分岐先の命令が存在しないときには、トップホインタ、リードホインタ、ボトムホインタの値を初期値にリセットするとともに、分岐先の命令をプリフェッチバッファ６にプリフェッチさせる。【選択図】図１
2008299790.tif 000002
【特許請求の範囲】
【請求項１】
プログラムに含まれる命令を格納するメインメモリと、
前記メインメモリからプリフェッチした命令を格納する循環バッファと、
前記メインメモリから出力される命令の前記循環バッファへの書込みアドレスを指定する第１のポインタ、前記循環バッファから出力される命令の読出アドレスを指定する第２のポインタ、および前記循環バッファに格納されている最も古い有効な命令の格納アドレスを指定する第３のポインタを格納するレジスタと、
前記第２のポインタに基づいて前記循環バッファから命令を読出して、解読し、実行するＣＰＵコアと、
前記ＣＰＵコアで解読した命令が分岐命令の場合に、前記第１のポインタ、前記第２のポインタ、および前記第３のポインタに基づいて、分岐先の命令が前記循環バッファ内に存在するか否かを判定する制御部とを備え、
前記制御部は、前記分岐先の命令が前記循環バッファ内に存在するときには、前記第２のポインタを前記分岐先の命令のアドレスを指定するように変更し、前記分岐先の命令が前記循環バッファ内に存在しないときには、前記第１のポインタ、前記第２のポインタ、および前記第３のポインタを初期値にリセットするとともに、前記分岐先の命令を前記循環バッファにプリフェッチさせる、マイクロプロセッサ。
【請求項２】
前記制御部は、前記第１のポインタと前記第２のポインタとの差分値、および前記第２のポインタで指定されるアドレスに読出される命令を起点とした前記分岐先の命令のアドレスを表わす相対アドレスに基づいて、前記分岐先の命令が実行済みの命令として前記循環バッファ内に存在するか否かを判定し、
前記第２のポインタと前記第３のポインタとの差分値、および前記相対アドレスに基づいて、前記分岐先の命令が未実行の命令として前記循環バッファ内に存在するか否かを判定し、
前記分岐先の命令が、実行済の命令としてまたは未実行の命令として前記循環バッファ内に存在するときに、前記分岐先の命令が前記循環バッファ内に存在すると判定する、請求項１記載のマイクロプロセッサ。
【請求項３】
前記制御部は、前記第１のポインタと前記第２のポインタとの差分値が所定値以上の場合には、前記メインメモリからのプリフェッチを一時停止させる、請求項１記載のマイクロプロセッサ。
【請求項４】
前記所定値は、前記循環バッファに格納可能な命令数の半分の値である、請求項３記載のマイクロプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロプロセッサに関し、特にキャッシュ機能を有するマイクロプロセッサに関する。
【背景技術】
【０００２】
従来から、命令キャッシュを備えたマイクロプロセッサが実用に供せられている。命令キャッシュとは、マイクロプロセッサ内部に設けられた高速な記憶装置であるキャッシュメモリの一種であり、プログラムに含まれる命令を一時的に記憶する領域をいう。このような命令キャッシュを備えることにより、ＣＰＵは、高速にアクセスできるキャッシュメモリに使用頻度の高い命令を蓄積しておき、低速なメインメモリへのアクセスを減らすことができるので、ＣＰＵによるプログラムの実行が高速化される（たとえば、特許文献１を参照）。
【０００３】
ＣＰＵに必要な命令が命令キャッシュに存在する場合には、その命令は、メインメモリからではなく、命令キャッシュからＣＰＵに送られる。これをキャッシュヒットという。一方、ＣＰＵに必要な命令が命令キャッシュに存在しない場合には、その命令は、メインメモリからＣＰＵに転送される。これをキャッシュミスという。
【特許文献１】特開２００１−２７３１３７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ところで、命令キャッシュには、ＣＰＵによって実行された命令のみが格納されるので、キャッシュヒットするのは実行済みの命令についてだけである。したがって、未実行の命令については、常にキャッシュミスするため、低速なメインメモリからＣＰＵに転送しなくてはならず、ＣＰＵによるプログラムの実行が遅くなる。
【０００５】
それゆえに、本発明の目的は、未実行の命令と実行済みの命令の両方についてキャッシュヒットが可能なマイクロプロセッサを提供することである。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、本発明のマイクロプロセッサは、プログラムに含まれる命令を格納するメインメモリと、メインメモリからプリフェッチした命令を格納する循環バッファと、メインメモリから出力される命令の循環バッファへの書込みアドレスを指定する第１のポインタ、循環バッファから出力される命令の読出アドレスを指定する第２のポインタ、および循環バッファに格納されている最も古い有効な命令の格納アドレスを指定する第３のポインタを格納するレジスタと、第２のポインタに基づいて循環バッファから命令を読出して、解読し、実行するＣＰＵコアと、ＣＰＵコアで解読した命令が分岐命令の場合に、第１のポインタ、第２のポインタ、および第３のポインタに基づいて、分岐先の命令が循環バッファ内に存在するか否かを判定する制御部とを備え、制御部は、分岐先の命令が循環バッファ内に存在するときには、第２のポインタを分岐先の命令のアドレスを指定するように変更し、分岐先の命令が循環バッファ内に存在しないときには、第１のポインタ、第２のポインタ、および第３のポインタを初期値にリセットするとともに、分岐先の命令を循環バッファにプリフェッチさせる。
【０００７】
好ましくは、制御部は、第１のポインタと第２のポインタとの差分値、および第２のポインタで指定されるアドレスに読出される命令を起点とした分岐先の命令のアドレスを表わす相対アドレスに基づいて、分岐先の命令が実行済みの命令として循環バッファ内に存在するか否かを判定し、第２のポインタと第３のポインタとの差分値、および相対アドレスに基づいて、分岐先の命令が未実行の命令として循環バッファ内に存在するか否かを判定し、分岐先の命令が、実行済の命令としてまたは未実行の命令として循環バッファ内に存在するときに、分岐先の命令が循環バッファ内に存在すると判定する。
【０００８】
好ましくは、制御部は、第１のポインタと第２のポインタとの差分値が所定値以上の場合には、メインメモリからのプリフェッチを一時停止させる。
【０００９】
好ましくは、所定値は、循環バッファに格納可能な命令数の半分の値である。
【発明の効果】
【００１０】
本発明のマイクロプロセッサによれば、未実行の命令と実行済みの命令の両方についてキャッシュヒットが可能となる。
【発明を実施するための最良の形態】
【００１１】
以下、本発明に係る実施の形態について図面を参照して説明する。
（構成）
図１は、本発明の実施形態のマイクロプロセッサの構成を表わす図である。
【００１２】
図１を参照して、このマイクロプロセッサは、ＳＤＲＡＭ(Synchronous Dynamic Random Access Memory)２、ＳＤＲＡＭコントローラ４、プリフェッチバッファ６、第１のレジスタ１０、第２のレジスタ１２、第３のレジスタ１４、ＣＰＵ（Central Processing Unit）コア８、およびバッファ制御部１６を備える。
【００１３】
バッファ制御部１６は、第１の減算器１８、第２の減算器２２、加算器３０、バッファフル判定器２０、第１の比較器２４、第２の比較器２６、第３の比較器２８、およびヒット判定器３２を備える。
【００１４】
ＳＤＲＡＭ２は、複数個の命令からなるプログラムを記憶するメインメモリである。
プリフェッチバッファ６は、ＳＤＲＡＭ２からプリフェッチ（先読み）された命令を保持する。プリフェッチバッファ６は、２ポート式の循環バッファである。この実施形態では、プリフェッチバッファ６には、３２個の命令が格納可能であるものとして説明する。
【００１５】
第１のレジスタ１０は、トップポインタＴＯＰ＿Ｐを記憶する。トップポインタＴＯＰ＿Ｐは、ＳＤＲＡＭ２から出力される命令のプリフェッチバッファ６への書込みアドレスを指定する。より具体的には、トップポインタＴＯＰ＿Ｐの値をプリフェッチバッファ６に格納可能な命令数（３２）で割った剰余の値で指定されるプリフェッチバッファ６のアドレスの位置に命令が書込まれる。
【００１６】
第２のレジスタ１２は、リードポインタＲＤ＿Ｐを記憶する。リードポインタＲＤ＿Ｐは、プリフェッチバッファ６から出力される命令の読出アドレスを指定する。より具体的には、リードポインタＲＤ＿Ｐの値をプリフェッチバッファ６に格納可能な命令数（３２）で割った剰余の値で指定されるプリフェッチバッファ６のアドレスの位置から命令が読出される。
【００１７】
第３のレジスタ１４は、ボトムポインタＢＯＴ＿Ｐを記憶する。ボトムポインタＢＯＴ＿Ｐは、プリフェッチバッファ６に格納されている最も古い有効な命令の格納アドレスを指定する。より具体的には、プリフェッチバッファ６内の、ボトムポインタＢＯＴ＿Ｐをプリフェッチバッファ６に格納可能な命令数（３２）で割った剰余の値で指定されるアドレスから、トップポインタＴＯＰ＿Ｐより１だけ小さい値をプリフェッチバッファ６に格納可能な命令数（３２）で割った剰余の値で指定されるアドレスまでの間に有効な命令が循環的に記憶される。
【００１８】
ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２からプリフェッチバッファ６への命令のプリフェッチを行なう。具体的には、ＳＤＲＡＭコントローラ４は、トップポインタＴＯＰ＿Ｐの値をプリフェッチバッファ６に格納可能な命令数（３２）で割った剰余の値で指定されるプリフェッチバッファ６のアドレスの位置に命令を書込む。また、ＳＤＲＡＭコントローラ４は、プリフェッチバッファ６へ書込んだ命令の数だけトップポインタＴＯＰ＿Ｐをインクリメントする。たとえば、１命令ずつプリフェッチする場合には、トップポインタＴＯＰ＿Ｐは、１命令をプリフェッチするごとに、１だけインクリメントされる。
【００１９】
ＳＤＲＡＭコントローラ４は、バッファ制御部１６から出力される次命令要求信号nextcoderequestがＨレベルのときのみ、上述のプリフェッチを行なう。
【００２０】
ＳＤＲＡＭコントローラ４は、バッファ制御部１６から分岐先の命令の絶対アドレスＡ＿ＡＤＤ（後述する）と、Ｈレベルのキャッシュミス信号Ｍｉｓｓを受けた場合には、ＳＤＲＡＭ２内の絶対アドレスＡ＿ＡＤＤで指定される命令の読出しを行なう。ＳＤＲＡＭコントローラ４は、それ以外の場合には、ＳＤＲＡＭ２内の命令をアドレス順に読出す。
【００２１】
ＣＰＵコア８は、プリフェッチバッファ６から命令の読出し（フェッチ）を行なう。具体的には、ＣＰＵコア８は、リードポインタＲＤ＿Ｐの値をプリフェッチバッファ６に格納可能な命令数（３２）で割った剰余の値で指定されるプリフェッチバッファ６のアドレスの位置から命令を読出す。また、ＣＰＵコア８は、プリフェッチバッファ６から読出した命令の数だけリードポインタＲＤ＿Ｐをインクリメントする。たとえば、１命令ずつフェッチする場合には、リードポインタＲＤ＿Ｐは、１命令をフェッチするごとに、１だけインクリメントされる。
【００２２】
ＣＰＵコア８は、プリフェッチバッファ６から読出した命令を解読し、その後命令を実行する。ＣＰＵコア８は、解読した命令が分岐命令の場合には、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧをＨレベルに設定するともに、分岐先の命令の絶対アドレスＡ＿ＡＤＤを第１の比較器２４、第２の比較器２６およびＳＤＲＡＭコントローラ４へ出力し、分岐先の命令の相対アドレスＲ＿ＡＤＤをヒット判定器３２へ出力する。ここで、分岐命令とは、Ｂｒｅａｋ、Ｊｕｍｐ、Ｂｒａｎｃｈ、Ｃａｌｌ、Ｒｅｔｕｒｎなどの命令をいう。絶対アドレスＡ＿ＡＤＤとは、プログラムの先頭の命令を起点とした分岐先の命令のアドレスを表わす。相対アドレスＲ＿ＡＤＤとは、リードポインタＲＤ＿Ｐで指定されるアドレスに読出される命令を起点とした分岐先の命令のアドレスを表わす。分岐先の命令のアドレスが、リードポインタＲＤ＿Ｐで指定されるアドレスに読出される命令のアドレスよりも大きければ、相対アドレスＲ＿ＡＤＤは、正の値となる。一方、分岐先の命令のアドレスが、リードポインタＲＤ＿Ｐで指定されるアドレスに読出される命令のアドレスよりも小さければ、相対アドレスＲ＿ＡＤＤは、負の値となる。ＣＰＵコア８は、解読した命令が分岐命令以外の命令の場合には、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧをＬレベルに設定する。
【００２３】
第１の減算器１８は、トップポインタＴＯＰ＿ＰとリードポインタＲＤ＿Ｐとの差Ｄ１（＝ＴＯＰ＿Ｐ−ＲＤ＿Ｐ）を出力する。
【００２４】
第２の減算器２２は、ボトムポインタＢＯＴ＿ＰとリードポインタＲＤ＿Ｐとの差Ｄ２（＝ＢＯＴ＿Ｐ−ＲＤ＿Ｐ）を出力する。
【００２５】
加算器３０は、相対アドレスＲ＿ＡＤＤとリードポインタＲＤ＿Ｐの和Ｓ（＝Ｒ＿ＡＤＤ−ＲＤ＿Ｐ）を出力する。
【００２６】
第１の比較器２４は、トップポインタＴＯＰ＿ＰとリードポインタＲＤ＿Ｐとの差Ｄ１と定数値１６とを比較し、ＳＤＲＡＭコントローラ４へ次命令要求信号nextcoderequestを出力する。定数値１６は、プリフェッチバッファ６に格納可能な命令数（３２）の半分の値である。第１の比較器２４は、差Ｄ１が１６未満のときに、次命令要求信号nextcoderequestをＨレベルに設定する（次命令を要求する）。これにより、ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２からプリフェッチバッファ６への命令の読出し処理を続行する。第１の比較器２４は、差Ｄ１が１６以上のときに、次命令要求信号nextcoderequestをＬレベルに設定する（次命令を要求しない）。これにより、ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２からプリフェッチバッファ６への命令の読出し処理を停止する。
【００２７】
つまり、トップポインタＴＯＰ＿ＰとリードポインタＲＤ＿Ｐの差Ｄ１は、プリフェッチバッファ６内の未実行の命令の数を表わす。プリフェッチバッファ６内の未実行の命令の数が１６未満の場合には、ＳＤＲＡＭ２からプリフェッチバッファ６へ未実行の命令がプリフェッチされ、実行済みの命令が消去される。その結果、プリフェッチバッファ６内において、未実行の命令の数が増加し、実行済みの命令の数が減少する。一方、プリフェッチと同時に、ＣＰＵコア８による命令のフェッチによって、プリフェッチバッファ６内において、未実行の命令の数が減少し、実行済みの命令の数が増加する。通常では、プリフェッチの速度はフェッチの速度よりも早いので、トータルで考えると、プリフェッチによる効果が主要となり、プリフェッチバッファ６内において、未実行の命令の数が増加し、実行済の命令の数が減少する。一方、プリフェッチバッファ６内の未実行の命令の数が１６以上の場合には、ＳＤＲＡＭ２からプリフェッチバッファ６へ未実行の命令がプリフェッチされないので、実行済みの命令が消去されない。その結果、ＣＰＵコア８による命令のフェッチによって、プリフェッチバッファ６内において、未実行の命令の数が減少し、実行済みの命令の数が増加する。以上のような処理を繰返すによって、プリフェッチバッファ６内に未実行の命令と実行済みの命令とがほぼ均等に保持されることになり、未実行の命令と実行済みの命令とで、キャッシュのヒット率ができるだけ同等になるようにしている。
【００２８】
第２の比較器２６は、符号つき比較器である。第２の比較器２６は、トップポインタＴＯＰ＿ＰとリードポインタＲＤ＿Ｐとの差Ｄ１と、相対アドレスＲ＿ＡＤＤとを比較する。第２の比較器２６は、差Ｄ１が相対アドレスＲ＿ＡＤＤ未満のときには、Ｈレベルの第１の比較信号ＣＯＭ１をヒット判定器３２へ出力する。第２の比較器２６は、差Ｄ１が相対アドレスＲ＿ＡＤＤ以上のときには、Ｌレベルの第１の比較信号ＣＯＭ１をヒット判定器３２へ出力する。
【００２９】
第３の比較器２８は、符号つき比較器である。第３の比較器２８は、ボトムポインタＢＯＴ＿ＰとリードポインタＲＤ＿Ｐとの差Ｄ２と、相対アドレスＲ＿ＡＤＤとを比較する。第３の比較器２８は、差Ｄ２が相対アドレスＲ＿ＡＤＤ未満のときには、Ｈレベルの第２の比較信号ＣＯＭ２をヒット判定器３２へ出力する。第２の比較器２６は、差Ｄ２が相対アドレスＲ＿ＡＤＤ以上のときには、Ｌレベルの第２の比較信号ＣＯＭ２をヒット判定器３２へ出力する。
【００３０】
ヒット判定器３２は、第１の比較信号ＣＯＭ１、第２の比較信号ＣＯＭ２、およびアドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧを受けて、キャッシュヒット信号Ｈｉｔおよびキャッシュミス信号Ｍｉｓｓを出力する。ヒット判定器３２は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧがＨレベル、第１の比較信号ＣＯＭ１がＬレベル、かつ第２の比較信号ＣＯＭ２がＨレベルのときに限り、キャッシュヒット信号ＨｉｔをＨレベル、かつキャッシュミス信号ＭｉｓｓをＬレベルに設定する。ヒット判定器３２は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧがＨレベルで、かつ、第１の比較信号ＣＯＭ１がＨレベルまたは第２の比較信号ＣＯＭ２がＬレベルのときには、キャッシュヒット信号ＨｉｔをＬレベル、かつキャッシュミス信号ＭｉｓｓをＨレベルに設定する。また、ヒット判定器３２は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧがＬレベルのときには、キャッシュヒット信号ＨｉｔをＬレベル、かつキャッシュミス信号ＭｉｓｓをＬレベルに設定する。
【００３１】
ヒット判定器３２は、具体的には、第１の論理回路３４、第２の論理回路３６、および第３の論理回路３８によって構成される。
【００３２】
第１の論理回路３４は、第１の比較信号ＣＯＭ１および第２の比較信号ＣＯＭ２を受ける。第１の論理回路３４は、第１の比較信号ＣＯＭ１がＨレベルで、かつ第２の比較信号ＣＯＭ２がＬレベルのときに限り、Ｈレベルを出力する。
【００３３】
第２の論理回路３６は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧおよび第１の論理回路３４の出力を受ける。第２の論理回路３６は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧがＨレベルで、かつ、第１の論理回路３４の出力がＨレベル（つまり、第１の比較信号ＣＯＭ１がＨレベルで、かつ第２の比較信号ＣＯＭ２がＬレベル）のときに限り、Ｈレベルのキャッシュヒット信号Ｈｉｔを出力する。
【００３４】
第３の論理回路３８は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧおよび第１の論理回路３４の出力を受ける。第３の論理回路３８は、アドレス変更信号ＰＣ＿ＡＤＤ＿ＣＨＧがＨレベルで、かつ、第１の論理回路３４の出力がＬレベル（つまり、第１の比較信号ＣＯＭ１がＬレベル、または第２の比較信号ＣＯＭ２がＨレベル）のときに限り、Ｈレベルのキャッシュミス信号Ｍｉｓｓを出力する。
【００３５】
キャッシュヒット信号Ｈｉｔは、第２のレジスタ１２に送られる。キャッシュヒット信号ＨｉｔがＨレベルに設定されたときには、第２のレジスタ１２内のリードポインタＲＤ＿Ｐは、加算器３０から送られる和Ｓ（＝Ｒ＿ＡＤＤ＋ＲＤ＿Ｐ）に更新される。
【００３６】
一方、キャッシュミス信号Ｍｉｓｓは、第１のレジスタ１０、第２のレジスタ１２、第３のレジスタ１４およびＳＤＲＡＭコントローラ４へ送られる。キャッシュミス信号ＭｉｓｓがＨレベルに設定されたときには、第１のレジスタ１０内のトップポインタＴＯＰ＿Ｐ、第２のレジスタ１２内のリードポインタＲＤ＿Ｐ、および第３のレジスタ１４内のボトムポインタＢＯＴ＿Ｐが初期値０にリセットされ、ＳＤＲＡＭコントローラ４によって、絶対アドレスＡ＿ＡＤＤで指定されるＳＤＲＡＭ２内の位置を起点とした命令のプリフェッチが行なわれる。
【００３７】
バッファフル判定器２０は、プリフェッチバッファ６がフルに達したとき、すなわち、トップポインタＴＯＰ＿ＰとボトムポインタＢＯＴ＿Ｐの差がプリフェッチバッファ６に格納可能な命令数（３２）に達したときには、ボトムポインタＢＯＴ＿Ｐをインクリメントする。たとえば、１命令ずつプリフェッチする場合には、ボトムポインタＢＯＴ＿Ｐは、新たな１命令を格納するために、１だけインクリメントされる。バッファフル判定器２０は、減算器および比較器などの要素を含むが、ここでは構成の詳細な説明は省略する。
【００３８】
（動作）
次に、本発明の実施形態のマイクロプロセッサの動作を具体例を用いて説明する。
【００３９】
図２は、ＳＤＲＡＭ２に格納されているプログラムを表わす図である。
図２を参照して、プログラムは、命令ＯＰ０〜ＯＰｎで構成されており、命令ＯＰｉ（０〜ｎ）のアドレスは、ｉである。
【００４０】
図３は、プリフェッチバッファ６に格納されている命令と、トップポインタＴＯＰ＿Ｐ、リードポインタＲＤ＿ＰおよびボトムポインタＢＯＴ＿Ｐで指定されるアドレスを表わす図である。
【００４１】
図３（ａ）は、初期状態を表わす。初期状態では、トップポインタＴＯＰ＿Ｐ、リードポインタＲＤ＿Ｐ、およびボトムポインタＢＯＴ＿Ｐの値は０である。
【００４２】
図３（ｂ）は、６個の命令ＯＰ０〜ＯＰ５がプリフェッチバッファ６に書込まれ、２個の命令ＯＰ０、ＯＰ１がプリフェッチバッファ６から読出された状態を表わす。この状態では、トップポインタＴＯＰ＿Ｐが「６」であり、リードポインタＲＤ＿Ｐが「３」であり、ボトムポインタＢＯＴ＿Ｐが「０」である。したがって、トップポインタＴＯＰ＿Ｐ（＝「６」）を「３２」で割った剰余である「６」が次に命令を書込むアドレスとなる。また、リードポインタＲＤ＿Ｐ（＝「３」）を「３２」で割った剰余である「３」が次に命令を読出すアドレスとなる。また、ボトムポインタＢＯＴ＿Ｐ（＝「０」）を「３２」で割った剰余である「０」のアドレスから、トップポインタＴＯＰ＿Ｐ（＝「６」）より１だけ小さい値（＝「５」）を「３２」で割った剰余である「５」のアドレスまでに有効な命令が格納されている。具体的には、命令ＯＰ０〜ＯＰ５が有効な命令である。
【００４３】
図３（ｃ）は、２４個の命令ＯＰ０〜ＯＰ２３がプリフェッチバッファ６に書込まれ、９個の命令ＯＰ０〜ＯＰ７がプリフェッチバッファ６から読出された状態を表わす。この状態では、トップポインタＴＯＰ＿Ｐが「２４」であり、リードポインタＲＤ＿Ｐが「８」であり、ボトムポインタＢＯＴ＿Ｐが「０」である。トップポインタＴＯＰ＿ＰとリードポインタＲＤ＿Ｐの差が「１６」であるので、次命令要求信号nextcoderequestがＬレベルに設定される。これにより、ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２からプリフェッチバッファ６への命令の読出し処理を停止するので、プリフェッチバッファ６において、未実行の命令の数が減少し、実行済みの命令の数が増加する。その結果、トップポインタＴＯＰ＿ＰとリードポインタＲＤ＿Ｐの差が「１６」未満となり、次命令要求信号nextcoderequestがＨレベルに設定される。これにより、ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２からプリフェッチバッファ６への命令の読出し処理を再開し、プリフェッチバッファ６において、未実行の命令の数が増加し、実行済の命令の数が減少する。以上のような処理が繰返されることによって、プリフェッチバッファ６内に未実行の命令と実行済みの命令とがほぼ均等に保持される。
【００４４】
図３（ｄ）は、プリフェッチバッファ６が最初にフルに達した場合を表わす。３２個の命令ＯＰ０〜ＯＰ３１がプリフェッチバッファ６に書込まれている。命令ＯＰ３１の書込み後には、トップポインタＴＯＰ＿Ｐはインクリメントされて「３２」となる。バッファフル判定器２０は、トップポインタＴＯＰ＿Ｐ（＝「３２」）とボトムポインタＢＯＴ＿Ｐ（＝「０」）の差が「３２」のため、プリフェッチバッファ６がフルに達したと判断する。
【００４５】
その結果、図３（ｅ）に示すように、ボトムポインタＢＯＴ＿Ｐがインクリメントされて、「１」となる。この状態は、ボトムポインタＢＯＴ＿Ｐ（＝「１」）を「３２」で割った剰余である「１」のアドレスから、トップポインタＴＯＰ＿Ｐ（＝「３２」）より１だけ小さい値（＝「３１」）を「３２」で割った剰余である「３１」のアドレスまで間に有効な命令が記憶されている。具体的には、命令ＯＰ１〜ＯＰ３２が有効な命令である。
【００４６】
さらに、図３（ｆ）に示すように、次の命令ＯＰ３２は、トップポインタＴＯＰ＿Ｐ（＝「３２」）を「３２」で割った剰余の値「０」のアドレスに書込まれる。命令ＯＰ３２の書込み後には、トップポインタＴＯＰ＿Ｐはインクリメントされて「３３」となる。バッファフル判定器２０は、トップポインタＴＯＰ＿Ｐ（＝「３３」）とボトムポインタＢＯＴ＿Ｐ（＝「１」）の差が「３２」のため、プリフェッチバッファ６がフルに達したと判断する。
【００４７】
その結果、図３（ｇ）に示すように、ボトムポインタＢＯＴ＿Ｐがインクリメントされて「２」となる。この状態は、ボトムポインタＢＯＴ＿Ｐ（＝「２」）を「３２」で割った剰余である「２」のアドレスから、トップポインタＴＯＰ＿Ｐ（＝「３３」）より１だけ小さい値（＝「３２」）を「３２」で割った剰余である「０」のアドレスまでの間に有効な命令が循環的に記憶されている。具体的には、命令ＯＰ２〜ＯＰ３２が有効な命令である。
【００４８】
図４は、キャッシュヒットする場合とキャッシュミスする場合の例を説明するための図である。
【００４９】
図４（ａ）〜（ｄ）を参照して、プリフェッチバッファ６には、命令ＯＰ６７〜ＯＰ９８まで格納されている。トップポインタＴＯＰ＿Ｐは「９９」であり、リードポインタＲＤ＿Ｐは「８３」であり、ボトムポインタＢＯＴ＿Ｐは「６８」である。
【００５０】
この状態では、トップポインタＴＯＰ＿Ｐ（＝「９９」）を「３２」で割った剰余である「３」が次に命令を書込むアドレスとなる。また、リードポインタＲＤ＿Ｐ（＝「８３」）を「３２」で割った剰余である「１９」が次に命令を読出すアドレスとなる。また、ボトムポインタＢＯＴ＿Ｐ（＝「６８」）を「３２」で割った剰余である「４」のアドレスから、トップポインタＴＯＰ＿Ｐ（＝「９９」）より１だけ小さい値（＝「９８」）を「３２」で割った剰余である「２」のアドレスまでに有効な命令が循環的に格納されている。すなわち、命令ＯＰ６８〜ＯＰ９７が有効な命令である。
【００５１】
第１の減算器１８によって、トップポインタＴＯＰ＿ＰからリードポインタＲＤ＿Ｐを減算した値Ｄ１が「１６」に設定される。また、第２の減算器２２によって、リードポインタＲＤ＿ＰからボトムポインタＢＯＴ＿Ｐを減算した値Ｄ２が「−１５」に設定される。
【００５２】
図４（ａ）は、プリフェッチバッファ６に格納されている命令ＯＰ９６が分岐先の命令の場合を表わす。
【００５３】
この場合には、相対アドレスＲ＿ＡＤＤは「１３」（＝９６−８３）となる。
値Ｄ１（＝「１６」）は、相対アドレスＡＤＤ（＝「１３」）以上であるので、第２の比較器２６によって、第１の比較信号ＣＯＭ１は「Ｌ」レベルに設定される。また、値Ｄ２（＝「−１５」）は、相対アドレスＡＤＤ（＝「１３」）未満であるので、第３の比較器２８によって、第２の比較信号ＣＯＭ２は「Ｈ」レベルに設定される。その結果、ヒット判定器３２によって、キャッシュヒット信号Ｈｉｔが「Ｈ」レベルに設定され、キャッシュミス信号Ｍｉｓｓが「Ｌ」レベルに設定される。
【００５４】
キャッシュヒット信号Ｈｉｔが「Ｈ」レベルになると、第２のレジスタ１２内のリードポインタＲＤ＿Ｐは、加算器３０から送られる和Ｓ（＝「９６」）（＝Ｒ＿ＡＤＤ＋ＲＤ＿Ｐ）に更新される。その結果、ＣＰＵコア８によって、プリフェッチバッファ６内の命令ＯＰ９６が読出される。
【００５５】
図４（ｂ）は、プリフェッチバッファ６に格納されている命令ＯＰ７４が分岐先の命令の場合を表わす。
【００５６】
この場合には、相対アドレスＲ＿ＡＤＤは「−９」（＝７４−８３）となる。
値Ｄ１（＝「１６」）は、相対アドレスＡＤＤ（＝「−９」）以上であるので、第２の比較器２６によって、第１の比較信号ＣＯＭ１は「Ｌ」レベルに設定される。また、値Ｄ２（＝「−１５」）は、相対アドレスＡＤＤ（＝「−９」）未満であるので、第３の比較器２８によって、第２の比較信号ＣＯＭ２は「Ｈ」レベルに設定される。その結果、ヒット判定器３２によって、キャッシュヒット信号Ｈｉｔが「Ｈ」レベルに設定され、キャッシュミス信号Ｍｉｓｓが「Ｌ」レベルに設定される。
【００５７】
キャッシュヒット信号Ｈｉｔが「Ｈ」レベルになると、第２のレジスタ１２内のリードポインタＲＤ＿Ｐは、加算器３０から送られる和Ｓ（＝「７４」）（＝Ｒ＿ＡＤＤ＋ＲＤ＿Ｐ）に更新される。その結果、ＣＰＵコア８によって、プリフェッチバッファ６内の命令ＯＰ７４が読出される。
【００５８】
図４（ｃ）は、プリフェッチバッファ６に格納されていない命令ＯＰ１０４が分岐先の命令の場合を表わす。
【００５９】
この場合には、相対アドレスＲ＿ＡＤＤは「２１」（＝１０４−８３）となる。
値Ｄ１（＝「１６」）は、相対アドレスＡＤＤ（＝「２１」）未満であるので、第２の比較器２６によって、第１の比較信号ＣＯＭ１は「Ｈ」レベルに設定される。また、値Ｄ２（＝「−１５」）は、相対アドレスＡＤＤ（＝「２１」）未満であるので、第３の比較器２８によって、第２の比較信号ＣＯＭ２は「Ｈ」レベルに設定される。その結果、ヒット判定器３２によって、キャッシュヒット信号Ｈｉｔが「Ｌ」レベルに設定され、キャッシュミス信号Ｍｉｓｓが「Ｈ」レベルに設定される。
【００６０】
キャッシュミス信号Ｍｉｓｓが「Ｈ」レベルになると、第１のレジスタ１０内のトップポインタＴＯＰ＿Ｐ、第２のレジスタ１２内のリードポインタＲＤ＿Ｐ、および第３のレジスタ１４内のボトムポインタＢＯＴ＿Ｐが初期値０にリセットされる。また、ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２から絶対アドレスＡ＿ＡＤＤ（＝「１０４」）で指定される命令を読出して、プリフェッチバッファ６へ書込む。この場合、プリフェッチバッファ６のトップポインタＴＯＰ＿Ｐ（＝「０」）を「３２」で割った剰余である「０」のアドレスに命令が書込まれる。
【００６１】
図４（ｄ）は、プリフェッチバッファ６に格納されていない命令ＯＰ４２が分岐先の命令の場合を表わす。
【００６２】
この場合には、相対アドレスＲ＿ＡＤＤは「−４１」（＝４２−８３）となる。
値Ｄ１（＝「１６」）は、相対アドレスＡＤＤ（＝「−４１」）以上であるので、第２の比較器２６によって、第１の比較信号ＣＯＭ１は「Ｌ」レベルに設定される。また、値Ｄ２（＝「−１５」）は、相対アドレスＡＤＤ（＝「−４１」）以上であるので、第３の比較器２８によって、第２の比較信号ＣＯＭ２は「Ｌ」レベルに設定される。その結果、ヒット判定器３２によって、キャッシュヒット信号Ｈｉｔが「Ｌ」レベルに設定され、キャッシュミス信号Ｍｉｓｓが「Ｈ」レベルに設定される。
【００６３】
キャッシュミス信号Ｍｉｓｓが「Ｈ」レベルになると、第１のレジスタ１０内のトップポインタＴＯＰ＿Ｐ、第２のレジスタ１２内のリードポインタＲＤ＿Ｐ、および第３のレジスタ１４内のボトムポインタＢＯＴ＿Ｐが初期値０にリセットされる。また、ＳＤＲＡＭコントローラ４は、ＳＤＲＡＭ２内の絶対アドレスＡ＿ＡＤＤ（＝「４２」）で指定される命令を読出して、プリフェッチバッファ６へ書込む。この場合、プリフェッチバッファ６のトップポインタＴＯＰ＿Ｐ（＝「０」）を「３２」で割った剰余である「０」のアドレスに命令が書込まれる。
【００６４】
以上のように、本発明の実施形態のマイクロプロセッサによれば、トップポインタＴＯＰ＿ＰおよびリードポインタＲＤ＿Ｐに加えて、ボトムポインタＢＯＴ＿Ｐを用いることによって、プリフェッチバッファ６内に未実行の命令と実行済みの命令とを記憶させることができるので、未実行の命令と実行済みの命令の両方についてキャッシュヒットが可能となる。
【００６５】
（変形例）
本発明は、上記の実施の形態に限定されるものではなく、たとえば以下のような変形例を含む。
【００６６】
（１）  ポインタの更新
本発明の実施形態では、ボトムポインタＢＯＴ＿Ｐは、ＳＤＲＡＭからプリフェッチバッファへ命令をプリフェッチする前に更新したが、プリフェッチ後に更新することとしてもよい。
【００６７】
また、本発明の実施形態では、各ポインタの１回にインクリメントする幅を１としたが、これに限定するものではない。たとえば、Ｎ個の命令を連続してプリフェッチする場合には、トップポインタＴＯＰ＿ＰおよびボトムポインタＢＯＴ＿Ｐの１回にインクリメントする幅をＮとすればよい。また、Ｎ個の命令を連続してフェッチする場合には、リードポインタＲＤ＿Ｐの１回にインクリメントする幅をＮとすればよい。
【００６８】
（２）  パイプライン処理
本発明の実施形態では、ＣＰＵコアによる命令のパイプライン処理は省略して説明したが、ＣＰＵコアによってパイプライン処理が行なわれる場合には、たとえばパイプライン処理のフェッチと実行の間のステージ数に応じて、ポインタの値や相対アドレスなどを修正すればよい。
【００６９】
（３）  キャッシャメモリとの併用
本発明の実施形態では、実行済みの命令および未実行の命令のいずれについても、プリフェッチバッファに対して、ヒットするか否かを判定したが、これに限定するものではない。マイクロプロセッサがプリフェッチバッファとは別に実行済みの命令を格納するキャッシュメモリを備える場合には、実行済みの命令については、そのキャッシュメモリに対してヒットするか否かを調べ、未実行の命令に対しては、プリフェッチバッファに対してヒットするか否かを調べるものとしてもよい。この場合には、図１のマイクロプロセッサの構成要素のうち、ボトムポインタＢＯＴ＿Ｐに関連する構成要素は不要となる。
【００７０】
あるいは、実行済みの命令については、まずプリフェッチバッファに対してヒットするかどうかを調べ、ヒットしない場合にのみ、さらにキャッシュメモリに対してヒットするかどうかを調べるものとしてもよい。
【００７１】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【図面の簡単な説明】
【００７２】
【図１】本発明の実施形態のマイクロプロセッサの構成を表わす図である。
【図２】ＳＤＲＡＭに格納されているプログラムを表わす図である。
【図３】プリフェッチバッファに格納されている命令と、トップポインタＴＯＰ＿Ｐ、リードポインタＲＤ＿Ｐ、ボトムポインタＢＯＴ＿Ｐで指定されるアドレスを表わす図である。
【図４】キャッシュがヒットする場合とキャッシュがミスする場合の例を説明するための図である。
【符号の説明】
【００７３】
２  ＳＤＲＡＭ、４  ＳＤＲＡＭコントローラ、６  プリフェッチバッファ、８  ＣＰＵコア、１０  第１のレジスタ、１２  第２のレジスタ、１４  第３のレジスタ、１６  バッファ制御部、１８  第１の減算器、２０  バッファフル判定器、２２  第２の減算器、２４  第１の比較器、２６  第２の比較器、２８  第３の比較器、３０  加算器、３２  ヒット判定器、３４，３６，３８  論理回路。
【図１】
2008299790.tif 000003
【図２】
2008299790.tif 000004
【図３】
2008299790.tif 000005
【図４】
2008299790.tif 000006