(57)【要約】【課題】  ＣＰＵによる分岐命令の実行時における分岐ペナルティを低減させることが可能な回路規模の小さいメモリ制御回路を提供する。【解決手段】  分岐先バッファ１は、ＣＰＵ１０により実行された分岐命令による分岐先命令とその命令アドレスをキャッシュし、その後にＣＰＵ１０により分岐命令が実行された際に、ＣＰＵ１０が出力する分岐先の命令アドレスと分岐先バッファ１内の命令アドレスとが一致した場合に、分岐先バッファ１内の分岐先命令をＣＰＵ１０に供給する。分岐命令が実行された場合には、アドレス比較回路２では、分岐先の命令アドレスと分岐元の命令アドレスとが比較され、バッファ更新制御回路３は、アドレス比較回路２による比較結果に基づき、命令の分岐により命令アドレスの値がマイナス方向に変化した場合にのみ、分岐先バッファ１のデータを分岐先命令で更新する。【選択図】  図１
2006072926.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵにフェッチされる命令のメモリからの読み出しを制御し、命令のプリフェッチ機能を備えたメモリ制御回路において、
分岐命令によって前記ＣＰＵの出力する命令アドレスが不連続となったときの分岐先命令とその命令アドレスとをキャッシュし、前記ＣＰＵの出力した命令アドレスとキャッシュした命令アドレスとが一致した場合に、対応する分岐先命令を前記ＣＰＵに対して出力する分岐先バッファと、
前記分岐命令による分岐先の命令アドレスと分岐元の命令アドレスとを比較するアドレス比較回路と、
前記アドレス比較回路による比較結果に基づき、命令アドレスの値がマイナス方向に変化した場合にのみ、前記分岐先バッファのデータを分岐先命令で更新するバッファ更新制御回路と、
を有することを特徴とするメモリ制御回路。
【請求項２】
前記分岐命令による分岐元の命令アドレスと分岐先の命令アドレスとの差分値と所定の基準値とを比較する差分値比較回路をさらに有し、
前記バッファ更新制御回路は、命令アドレスの値がマイナス方向に変化し、かつ、前記差分値比較回路により前記差分値が前記基準値以下であると判別された場合にのみ、前記分岐先バッファのデータを更新することを特徴とする請求項１記載のメモリ制御回路。
【請求項３】
前記バッファ更新制御回路は、前記アドレス比較回路による比較結果に基づき、命令アドレスの値がマイナス方向に変化したとき、サブルーチンのコール命令およびリターン命令の実行を通知するサブルーチン分岐通知信号を前記ＣＰＵから受信した場合には、前記分岐先バッファのデータを更新させないことを特徴とする請求項１記載のメモリ制御回路。
【請求項４】
前記アドレス比較回路は、前記分岐命令の実行を通知する分岐信号を前記ＣＰＵから受信したとき、当該分岐命令による分岐先の命令アドレスと分岐元の命令アドレスとを比較することを特徴とする請求項１記載のメモリ制御回路。
【請求項５】
前記ＣＰＵからの命令アドレスを前記ＣＰＵの動作クロックの受信タイミングでラッチして、直前に指定された命令アドレスを常時保持するアドレスラッチ回路をさらに有し、
前記アドレス比較回路は、前記分岐信号を受信すると、前記ＣＰＵからの分岐先命令の命令アドレスと、前記アドレスラッチ回路の保持する命令アドレスとを比較することを特徴とする請求項４記載のメモリ制御回路。
【請求項６】
ＣＰＵに供給する命令をメモリからプリフェッチする機能を備えたマイクロプロセッサシステムにおいて、
命令アドレスを不連続にさせる分岐命令が前記ＣＰＵにより実行されたことを通知する分岐信号を出力する分岐信号出力回路と、
前記分岐命令による分岐先命令とその命令アドレスとをキャッシュし、前記ＣＰＵの出力した命令アドレスとキャッシュした命令アドレスとが一致した場合に、対応する分岐先命令を前記ＣＰＵに対して出力する分岐先バッファと、
前記分岐信号を受信すると、実行された分岐命令による分岐先の命令アドレスと分岐元の命令アドレスとを比較するアドレス比較回路と、
前記アドレス比較回路による比較結果に基づき、命令アドレスの値がマイナス方向に変化した場合にのみ、前記分岐先バッファのデータを分岐先命令で更新するバッファ更新制御回路と、
を有することを特徴とするマイクロプロセッサシステム。
【請求項７】
ＣＰＵに供給する命令をメモリからプリフェッチする機能を備えたマイクロプロセッサシステムにおいて、
分岐命令によって前記ＣＰＵの出力する命令アドレスが不連続となったときの分岐先命令とその命令アドレスとをキャッシュし、前記ＣＰＵの出力した命令アドレスとキャッシュした命令アドレスとが一致した場合に、対応する分岐先命令を前記ＣＰＵに対して出力する分岐先バッファと、
サブルーチンのコール命令およびリターン命令が前記ＣＰＵにより実行されたことを通知するサブルーチン分岐通知信号を出力するサブルーチン分岐通知回路と、
前記分岐命令による分岐先の命令アドレスと分岐元の命令アドレスとを比較するアドレス比較回路と、
前記アドレス比較回路による比較結果に基づき、命令アドレスの値がマイナス方向に変化したと判別し、かつ、前記サブルーチン分岐通知信号を受信していない場合にのみ、前記分岐先バッファのデータを分岐先命令で更新するバッファ更新制御回路と、
を有することを特徴とするマイクロプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＣＰＵにフェッチされる命令のメモリからの読み出しを制御し、命令のプリフェッチ機能を備えたメモリ制御回路、およびこれを含むマイクロプロセッサシステムに関し、特に、分岐命令の実行時におけるペナルティサイクルの発生率が低減されたメモリ制御回路およびマイクロプロセッサシステムに関する。
【背景技術】
【０００２】
従来から、パイプライン制御を利用したマイクロプロセッサシステムでは、命令のプリフェッチ機能によりメインメモリから命令データを先読みしてバッファしておくことで、ＣＰＵに対する命令供給を滞らせないようにすることが知られている。しかし、このようなシステムにおいて、命令の分岐が発生した場合には、プリフェッチによって先読みした命令データが使用できなくなり、この場合にはプリフェッチバッファをクリアして、あらためて分岐先の命令をフェッチする必要が生じる。このため、データがＣＰＵに届くまでの間、パイプラインの流れが停止して処理性能が低下するという問題がある。
【０００３】
従来では、この問題を解決するために、高速なアクセスが可能な命令用のキャッシュメモリを用意し、キャッシュメモリ内に分岐先の命令がある場合にはペナルティサイクルのない命令の実行を可能にしていた。しかし、この場合でも、分岐先の命令がキャッシュされていない場合には同様にあらためて命令のフェッチを行うので、パイプラインの流れが停止して処理性能が低下する。また、命令キャッシュのヒット率を向上させるには、命令キャッシュのデータ容量を大きくすればよいが、これにより回路規模や製造コストが増大してしまう。
【０００４】
これに対して、ＣＰＵと命令キャッシュとの間に、命令キャッシュのエントリ数を初期値としたカウンタを設け、命令キャッシュへのアクセスのたびにカウンタをディクリメントし、サブルーチンコールまたはマイナス方向への分岐が成立するごとにカウンタを初期化することにより、命令キャッシュにデータが満たされるとその機能を停止させるようにしたマイクロプロセッサシステムがあった（例えば、特許文献１参照）。これにより、サブルーチンコールまたはマイナス方向への分岐が実行された場合の命令キャッシュのヒット率を向上させることができる。
【０００５】
なお、従来の関連技術として、主記憶装置とＣＰＵとの間のバッファストレージと、命令プリフェッチ回路および命令バッファを有し、命令プリフェッチ要求によるムーブインでバッファストレージに転送されてきたブロックの中に分岐先の命令が含まれているか否かを判定回路により判定して、その判定結果に基づいて、命令プリフェッチ要求の有効またはキャンセルの制御を行うようにした命令プリフェッチ方法があった（例えば、特許文献２参照）。
【特許文献１】特開平９−３０５４９０号公報（段落番号〔０００８〕〜〔００１１〕、図１）
【特許文献２】特開平５−２１６６６５号公報（段落番号〔００１６〕〜〔００２０〕、図１）
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、上記の特許文献１に開示されたシステムでは、命令キャッシュの利用数をカウントするカウンタが設けられているため、回路規模や製造コストが大きくなるという問題がある。特に、命令キャッシュのエントリ数を大きくすることで、分岐命令の実行時における命令キャッシュのヒット率を高めることができるが、これにより命令キャッシュおよびカウンタを含めた回路規模や製造コストが増大してしまうことが問題となる。
【０００７】
本発明はこのような点に鑑みてなされたものであり、ＣＰＵによる分岐命令の実行時における分岐ペナルティを低減させることが可能な回路規模の小さいメモリ制御回路を提供することを目的とする。
【０００８】
また、本発明の他の目的は、ＣＰＵによる分岐命令の実行時における分岐ペナルティを低減させることが可能な回路規模の小さいマイクロプロセッサシステムを提供することである。
【課題を解決するための手段】
【０００９】
本発明では上記課題を解決するために、図１に示すような、ＣＰＵ１０にフェッチされる命令のメモリ２０からの読み出しを制御し、命令のプリフェッチ機能を備えたメモリ制御回路３０が提供される。このメモリ制御回路３０は、分岐命令によって前記ＣＰＵ１０の出力する命令アドレスが不連続となったときの分岐命令による分岐先命令とその命令アドレスとをキャッシュし、前記ＣＰＵ１０の出力した命令アドレスとキャッシュした命令アドレスとが一致した場合に、対応する分岐先命令を前記ＣＰＵ１０に対して出力する分岐先バッファ１と、前記分岐命令による分岐先の命令アドレスと分岐元の命令アドレスとを比較するアドレス比較回路２と、前記アドレス比較回路２による比較結果に基づき、命令アドレスの値がマイナス方向に変化した場合にのみ、前記分岐先バッファ１のデータを分岐先命令で更新するバッファ更新制御回路３とを有することを特徴とする。
【００１０】
このようなメモリ制御回路３０では、ＣＰＵ１０により実行された分岐命令による分岐先命令とその命令アドレスが分岐先バッファ１にキャッシュされ、その後にＣＰＵ１０により分岐命令が実行された際に、ＣＰＵ１０が出力する分岐先の命令アドレスと分岐先バッファ１内の命令アドレスとが一致した場合に、メモリ２０にアクセスすることなく、分岐先バッファ１内の分岐先命令がＣＰＵ１０に供給される。また、分岐命令が実行された場合には、アドレス比較回路２では、分岐先の命令アドレスと分岐元の命令アドレスとが比較され、バッファ更新制御回路３は、アドレス比較回路２による比較結果に基づき、命令の分岐により命令アドレスの値がマイナス方向に変化した場合にのみ、分岐先バッファ１のデータを分岐先命令で更新する。
【発明の効果】
【００１１】
本発明によれば、バッファ更新制御回路の制御により、命令の分岐により命令アドレスの値がマイナス方向に変化した場合にのみ、分岐先バッファのデータが分岐先命令で更新されるので、分岐先バッファには、そのバッファ段数が少ない場合でも、プログラム中のループの先頭の命令がキャッシュされる確率が高くなり、ループ実行時の分岐ペナルティの発生率が低下する。従って、回路規模を増大させることなく、パイプライン制御を用いた処理性能を向上させることができる。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施の形態を図面を参照して詳細に説明する。
図１は、実施の形態に係るマイクロプロセッサシステムの概要を示す図である。
図１に示すマイクロプロセッサシステムは、パイプライン制御方法を採るシステムであり、命令をフェッチし、その命令に従って動作するＣＰＵ１０と、命令などのデータが格納されたメモリ２０と、ＣＰＵ１０にフェッチされる命令のメモリ２０からの読み出しを制御するメモリ制御回路３０を具備する。
【００１３】
ＣＰＵ１０は、命令のフェッチ処理部、フェッチした命令をデコードするデコーダ、デコード結果に応じて各種演算を行う演算器などを具備し、命令のデコード結果に応じて必要な演算を行うとともに、メモリ制御回路３０に対して命令を読み出すための命令アドレスを指定して、それに応じて出力された命令データをメモリ制御回路３０を通じて取得し、デコードする。
【００１４】
メモリ２０は、命令や、演算に必要な各種データを保持する、いわゆる主記憶装置である。このメモリ２０は、メモリ制御回路３０を通じてメモリアドレスの指定を受けて、命令のデータを読み出してメモリ制御回路３０に供給する。なお、このメモリ２０は、１階層または複数階層のキャッシュメモリを備えていてもよい。
【００１５】
メモリ制御回路３０は、ＣＰＵ１０にフェッチされる命令のメモリ２０からの読み出しを制御する。このメモリ制御回路３０は、図示しないが、ＣＰＵ１０の命令フェッチ時におけるメモリ２０へのアクセス回数を低減するための命令のプリフェッチ機能を備えており、これによりパイプライン制御が可能となっている。
【００１６】
これとともに、メモリ制御回路３０は、分岐命令の実行時におけるメモリ２０へのアクセス回数を低減するための機能として、分岐先バッファ１、アドレス比較回路２、およびバッファ更新制御回路３を具備している。ここで、分岐命令は、ＣＰＵ１０から出力される命令アドレスが不連続に変化するような命令であり、例えば、条件分岐命令、無条件分岐命令、サブルーチンのコール命令およびリターン命令などを含む。
【００１７】
分岐先バッファ１は、バッファ更新制御回路３による制御の下で、分岐命令が実行された場合に、その分岐先とされた命令（分岐先命令）をキャッシュする。そして、その後にＣＰＵ１０により分岐命令が実行された際に、ＣＰＵ１０が出力する分岐先の命令アドレスと分岐先バッファ１内の命令アドレスとが一致した場合に、対応する分岐先命令を読み出してＣＰＵ１０に供給する。
【００１８】
アドレス比較回路２は、分岐命令による分岐先の命令アドレスと分岐元の命令アドレスとを比較し、比較結果をバッファ更新制御回路３に通知する。アドレス比較回路２は、例えば、直前にＣＰＵ１０から出力された命令アドレスを分岐元アドレス２ａとして随時保持しておき、次にＣＰＵ１０から出力された命令アドレスと、保持していた分岐元アドレス２ａとを比較するようにしてもよい。
【００１９】
バッファ更新制御回路３は、アドレス比較回路２の比較結果に基づき、命令の分岐により命令アドレスの値がマイナス方向に変化した場合にのみ、分岐先バッファ１のデータを分岐先命令で更新する。
【００２０】
このメモリ制御回路３０では、命令の分岐が発生した場合に、その分岐先の命令アドレスと命令データを分岐先バッファ１にキャッシュしておき、その後に同じ分岐命令が実行されたときに利用するようにしている。ここで例えば、単なる命令キャッシュを設けた場合には、分岐などでアドレスがマイナス方向に変化するような命令の遷移が生じたときに、キャッシュにヒットして処理を高速化することができるが、そのヒット率を向上させるためには、命令キャッシュのエントリ数を増加させる必要があり、キャッシュメモリの回路規模や製造コストが増大してしまう。
【００２１】
これに対して、分岐先専用の分岐先バッファ１を設けることで、そのエントリ数に相当するバッファ段数が少ない場合にも、命令分岐時のプリフェッチペナルティの発生回数を低減することができる。しかし、この場合にも、プログラム内のループ構造の中に存在する分岐の数以上にバッファ段数を用意しないと、分岐先バッファ１にある命令を再び実行する前に、別の分岐命令が実行されて分岐先バッファ１が更新されてしまい、再度同じ分岐命令を実行する時点では分岐先バッファ１がヒットしない。従って、分岐先バッファ１を用意しても、そのバッファ段数が少ない場合には性能向上の効果は小さい。
【００２２】
そこで、図１に示すメモリ制御回路３０には、バッファ更新制御回路３の制御により、命令アドレスがマイナス方向に変化するような分岐が発生した場合のみ、分岐先バッファ１を更新するようにしている。一般に、ループ中に存在する条件分岐などの分岐命令では、分岐先命令が命令アドレスを増加させた方向のメモリ空間に配置されることが多いので、分岐先バッファ１では、このような分岐命令の実行時にはデータ更新が行われず、ループ先頭の命令が保持され続ける可能性が高くなり、バッファ段数が少ない場合でも、ループ実行時の分岐先バッファ１のヒット率が向上して、ペナルティサイクルの発生率が低減される。従って、パイプライン制御を用いた処理性能の向上と、回路規模や製造コストの縮小とを両立させることができる。
【００２３】
なお、命令アドレスがマイナス方向に変化したことだけでは、ループ先頭への分岐を確実に判別することができない。例えばこの場合には、サブルーチンのコール命令やリターン命令も含まれてしまう。そこで、分岐命令の実行時に、命令アドレスがマイナス方向に変化し、かつ、分岐先の命令アドレスと分岐元の命令アドレスとの差分が、所定の基準値以下の場合のみ、分岐先バッファ１を更新するようにしてもよい。一般にサブルーチンのプログラムは、メインプログラムから離れたメモリ空間に記述されることが多いので、アドレス差分値が大きい場合には、サブルーチンによる分岐であることを判別して、分岐先バッファ１を更新させないようにすることができる。
【００２４】
あるいは、ＣＰＵ１０が、デコードした命令がサブルーチンのコール命令およびリターン命令である場合に、このことを通知するサブルーチン分岐通知信号を出力させて、バッファ更新制御回路３は、このサブルーチン分岐通知信号を基にサブルーチンによる分岐時のバッファ更新を回避するようにしてもよい。
【００２５】
次に、上記のマイクロプロセッサシステムの具体的な構成例について説明する。
〔第１の実施の形態〕
図２は、第１の実施の形態に係るマイクロプロセッサシステムの要部構成を示す図である。
【００２６】
図２に示すマイクロプロセッサシステムは、例えばいわゆるシングルチップ・マイクロコントローラなどに適用されるものである。このシステムでは、メモリ２０に対するアクセスにはＣＰＵクロックの２サイクル分の期間が必要であるが、そのデータアクセスのためのバス幅を命令コードの２倍とし、命令データのプリフェッチ機能を利用することで、１サイクル単位でのＣＰＵ１０への命令供給を可能としている。ここでは例として、命令アドレスおよび命令データのバス幅を３２ビット、１命令分のデータ幅を１６ビットとし、ＣＰＵ１０は、ＣＰＵクロックの２サイクルに１回、２命令を一度にフェッチできるものとする。また、メモリ２０のアクセスサイクルはＣＰＵクロックの２サイクル分であるとする。
【００２７】
このマイクロプロセッサシステムにおいて、ＣＰＵ１０は、フェッチする命令の命令アドレス５０１、命令フェッチ時のアクセス状態を示すアクセス制御信号６０１を出力して、メモリ制御回路３０に対して命令のフェッチを要求し、命令データ５０２を取得する。また、ＣＰＵ１０は、通常の命令実行時には、命令アドレス５０１をシーケンシャルに増加させて命令をフェッチするが、命令アドレス５０１が不連続に変化した場合には、分岐信号６０２をアサートしてメモリ制御回路３０に対して出力する。さらに、ＣＰＵ１０は、メモリ制御回路３０からのウェイト信号６０３がアサートされている間、命令フェッチ要求を停止する。
【００２８】
メモリ制御回路３０は、ＣＰＵ１０からの命令アドレス５０１、アクセス制御信号６０１、分岐信号６０２による命令フェッチの要求に対して、命令アドレス５０１に対応するメモリ２０のデータ（メモリデータ５０３）を読み出して、命令データ５０２としてＣＰＵ１０に出力する。また、メモリ制御回路３０は、ＣＰＵ１０からの要求のある前に、メモリ２０に対して次に要求されるメモリデータ５０３へのアクセスを開始するプリフェッチ機能や、分岐命令により分岐された先の命令およびアドレスをキャッシュする機能を有している。
【００２９】
このメモリ制御回路３０は、状態制御部３１、メモリアドレス生成部３２、アドレス比較部３３、分岐先バッファ制御部３４、分岐先バッファ部３５、プリフェッチバッファ部３６、および出力データ制御部３７を具備する。
【００３０】
状態制御部３１は、メモリ制御回路３０の全体を統括的に制御するブロックであり、回路内の各部からの信号に応じて、分岐先バッファ制御部３４やプリフェッチバッファ部３６、出力データ制御部３７に対して後述する各種制御信号を出力する。
【００３１】
メモリアドレス生成部３２は、ＣＰＵ１０からの命令アドレス５０１に基づき、ＣＰＵ１０からのアクセス制御信号６０１や分岐信号６０２、状態制御部３１からのメモリ状態信号６０４、分岐先バッファ部３５からの分岐先バッファヒット信号６０５に基づくステートに応じて、メモリ２０へのアクセスのためのアドレス信号（メモリアドレス５０４）を生成する。また、出力するメモリアドレス５０４をＣＰＵクロックでラッチした命令アドレスラッチ信号６０６を、分岐先バッファ制御部３４に対して出力する。
【００３２】
アドレス比較部３３は、ＣＰＵ１０からの命令アドレス５０１と、メモリアドレス生成部３２によって生成されたメモリアドレス５０４とを比較し、一致した場合にプリフェッチヒット信号６０７を出力データ制御部３７に対して出力する。
【００３３】
分岐先バッファ制御部３４は、ＣＰＵ１０からの分岐信号６０２、状態制御部３１からのメモリ状態信号６０４、メモリアドレス生成部３２からの命令アドレスラッチ信号６０６を基に、アドレスがマイナス方向に変化する分岐が発生したか否かを検出する。そして、マイナス方向への分岐が発生した場合に、分岐先バッファ部３５に対する分岐先バッファ更新信号６０８をアサートする。
【００３４】
分岐先バッファ部３５は、分岐先バッファ制御部３４からの分岐先バッファ更新信号６０８がアサートされたとき、メモリアドレス生成部３２から出力するメモリアドレス５０４に応じてメモリ２０から読み出された命令データ（メモリデータ５０３）と、そのメモリアドレス５０４とを取り込み、記憶データを更新する。また、メモリアドレス生成部３２からのメモリアドレス５０４と、分岐先バッファ部３５に記憶されたメモリアドレスとが一致した場合には、分岐先バッファヒット信号６０５をアサートするとともに、そのメモリアドレスに対応する命令データ（分岐先バッファデータ５０５）を出力データ制御部３７に対して出力する。
【００３５】
プリフェッチバッファ部３６は、状態制御部３１からのプリフェッチバッファ制御信号６０９に応じて、メモリ２０が出力するプリフェッチによるメモリデータ５０３を読み込む。また、バッファ内のデータがＦｕｌｌ状態である場合に、状態制御部３１に対するプリフェッチバッファ状態信号６１０をアサートする。これにより状態制御部３１は、プリフェッチバッファ部３６がＦｕｌｌ状態でない場合のみ、ＣＰＵ１０からの要求より前に、メモリ状態信号６０４を用いてメモリアドレス生成部３２にメモリアドレス５０４をインクリメントさせるとともに、プリフェッチバッファ制御信号６０９をアサートして、プリフェッチを実行させる。
【００３６】
また、プリフェッチバッファ部３６は、ＣＰＵ１０により指定された命令アドレス５０１に対応する命令データをバッファ内に保持している場合に、出力データ制御部３７に対するプリフェッチバッファヒット信号６１１をアサートし、その命令データ（プリフェッチバッファデータ５０６）を出力データ制御部３７に出力する。
【００３７】
出力データ制御部３７は、アドレス比較部３３からのプリフェッチヒット信号６０７、分岐先バッファ部３５からの分岐先バッファヒット信号６０５、プリフェッチバッファ部３６からのプリフェッチバッファヒット信号６１１のうち、アサートされた信号に対応するデータを選択する。プリフェッチヒット信号６０７がアサートされた場合は、状態制御部３１からのメモリ状態信号６０４に基づき、メモリデータ５０３がメモリ２０から出力されるタイミングで、そのデータを命令データ５０２としてＣＰＵ１０に対して出力する。また、分岐先バッファヒット信号６０５およびプリフェッチバッファヒット信号６１１がアサートされた場合は、そのアサートのタイミングで、ヒットしたデータ（それぞれ分岐先バッファデータ５０５およびプリフェッチバッファデータ５０６）を命令データ５０２としてＣＰＵ１０に対して出力する。
【００３８】
また、各信号のアサート時には、状態制御部３１に対するデータ一致信号６１２をアサートして、状態制御部３１からＣＰＵ１０へのウェイト信号６０３の出力を抑止する。これにより、状態制御部３１は、ＣＰＵ１０からの命令フェッチの要求を受けたとき、メモリデータ５０３、分岐先バッファデータ５０５およびプリフェッチバッファデータ５０６のいずれもヒットしなかった場合に、ＣＰＵ１０に対するウェイト信号６０３をアサートして、ＣＰＵ１０からの命令フェッチ要求を停止させる。
【００３９】
以上の構成により、このマイクロプロセッサシステムでは、メモリ制御回路３０の制御により、メモリ２０の命令データを先読みしてＣＰＵ１０に供給し、パイプライン制御を行うことができる。また、分岐先バッファ部３５には、分岐命令による分岐先の命令データおよびアドレスがキャッシュされ、命令が分岐した場合のペナルティ発生率が低減される。
【００４０】
ＣＰＵ１０からの命令アドレス５０１が、単純増加とならず、不連続に変化すると、ＣＰＵ１０からの分岐信号６０２がアサートされて、メモリ制御回路３０に対して、現在の命令アドレス５０１が分岐先のものであることが通知される。なお、このような分岐が発生される命令には、例えば、条件分岐命令、無条件分岐命令、サブルーチンコール命令およびそのリターン命令などが含まれる。
【００４１】
分岐信号６０２のアサートとともに、ＣＰＵ１０からは分岐先の命令アドレス５０１が出力される。このとき、分岐先バッファ部３５にキャッシュされているアドレスと、ＣＰＵ１０からの命令アドレス５０１とが一致した場合には、分岐先バッファ部３５からの分岐先バッファヒット信号６０５がアサートされ、ヒットしたアドレスに対応する命令データが分岐先バッファ部３５から出力されて、出力データ制御部３７を介してＣＰＵ１０に供給される。これと同時に、次に実行する命令をプリフェッチするためのメモリ２０へのアクセスが開始される。
【００４２】
また、分岐信号６０２のアサート時に分岐先バッファヒット信号６０５がアサートされない場合、すなわち記憶データにヒットしなかった場合には、メモリ２０からの分岐先のアドレスのデータフェッチが終了するまでの期間、状態制御部３１からＣＰＵ１０へのウェイト信号６０３がアサートされて、ＣＰＵ１０への命令供給が停止される。このように分岐先の命令がメモリ２０からあらためて読み出される期間がペナルティサイクルとなる。
【００４３】
さらに、分岐先バッファ部３５においてヒットしなかった場合には、以下のような分岐先バッファ制御部３４の制御により、ペナルティサイクル発生率のさらなる低減が図られている。分岐先バッファ制御部３４は、メモリアドレス生成部３２からの命令アドレスラッチ信号６０６の供給を受けて、この信号値を基に分岐元および分岐先のアドレスを比較し、そのアドレスがマイナス方向に変化している場合のみ、分岐先バッファ部３５に対する分岐先バッファ更新信号６０８をアサートして、データを更新させる。これにより、特にプログラム内にループが含まれている場合に、ヒット率を高めることが可能となる。
【００４４】
図３は、第１の実施の形態に係る分岐先バッファ制御部３４の内部構成を示す図である。
図３に示すように、分岐先バッファ制御部３４は、分岐元アドレスラッチ部３４１、タイミング制御部３４２、アドレス比較部３４３、および更新信号出力部３４４を具備している。
【００４５】
分岐元アドレスラッチ部３４１は、メモリアドレス生成部３２からの命令アドレスラッチ信号６０６を、ＣＰＵクロック７０１の入力タイミングでラッチし、ラッチした値をアドレス比較部３４３に出力する。すなわち、分岐元アドレスラッチ部３４１は、直前のクロックサイクルにＣＰＵ１０から供給された命令アドレス５０１を常時保持し、アドレス比較部３４３に供給する。
【００４６】
タイミング制御部３４２は、アドレス比較部３４３および更新信号出力部３４４の動作タイミングを制御する。具体的には、ＣＰＵ１０からの分岐信号６０２がアサートされたとき、アドレス比較部３４３に演算を実行させ、その後のＣＰＵクロック７０１の入力タイミングで、状態制御部３１からのメモリ状態信号６０４がメモリ２０からのデータ読み出しを示していたときに、更新信号出力部３４４に動作の開始タイミングを与える。
【００４７】
アドレス比較部３４３は、タイミング制御部３４２からのタイミング制御に応じて、メモリアドレス生成部３２からの命令アドレスラッチ信号６０６の値から、分岐元アドレスラッチ部３４１からの入力値を減算し、減算結果が０未満となった場合に更新信号出力部３４４に通知する。なお、アドレス比較部３４３は、分岐信号６０２がアサートされたときにのみ演算を実行するので、回路の消費電力が低減される。また、アドレス比較部３４３は、単に入力された各アドレスの大小を比較する回路であってもよい。
【００４８】
更新信号出力部３４４は、アドレス比較部３４３からアドレスの減算値が０未満であることの通知を受けると、命令アドレス５０１がマイナス方向に変化したと判断して、内部データである分岐バッファ更新フラグを立てる。そして、タイミング制御部３４２から動作タイミングを与えられると、分岐バッファ更新フラグの値に応じた分岐先バッファ更新信号６０８を分岐先バッファ部３５に出力する。
【００４９】
このような分岐先バッファ制御部３４では、ＣＰＵ１０からの分岐信号６０２がアサートされると、アドレス比較部３４３には、メモリアドレス生成部３２からの分岐先の命令アドレスと、分岐元アドレスラッチ部３４１からの分岐元の命令アドレスとが供給される。アドレス比較部３４３は、これらのアドレスの差分を演算し、アドレスの変化がマイナス方向の場合に更新信号出力部３４４に通知し、更新信号出力部３４４は、次のメモリ２０からのデータ読み出しタイミングで分岐先バッファ更新信号６０８をアサートして、分岐先バッファ部３５のデータを更新させる。
【００５０】
ここで、具体的な処理の流れを例示して、このマイクロプロセッサシステムの動作について詳しく説明する。
図４は、ループ内に条件分岐が存在するプログラムの一例を示すフローチャートである。
【００５１】
図４では、ステップＳ１１〜Ｓ１７までの各処理コードが、この順番でＣＰＵ１０から見て連続したメモリ空間に格納されているものとする。また、ステップＳ１２およびＳ１３の条件分岐で、それぞれステップＳ１７，Ｓ１５への分岐した場合を“分岐Ａ”“分岐Ｂ”とし、ステップＳ１４からステップＳ１６への無条件分岐、ステップＳ１６からステップＳ１１への無条件分岐をそれぞれ“分岐Ｃ”“分岐Ｄ”としている。そして、各分岐のうち“分岐Ｄ”のみが、命令アドレス５０１がマイナス方向へ変化する分岐となっている。
【００５２】
ここで、本実施の形態との差異を明確にするために、分岐命令が出現するたびに（すなわち分岐信号がアサートされるたびに）、分岐先バッファ部３５のデータが更新される場合を従来例として説明する。
【００５３】
図５は、上記プログラム実行時における従来例の動作を示すタイミングチャートである。
例えば分岐先バッファ部３５のエントリ数が１段の場合を考えると、図４においてステップＳ１１〜Ｓ１６までのループが繰り返されると、“分岐Ｂ”または“分岐Ｃ”と“分岐Ｄ”とが交互に繰り返される。この場合、従来例では分岐先バッファ部３５が上記の分岐ごとに分岐先命令で更新されてしまい、全くヒットしない。
【００５４】
図５では例として、ステップＳ１１，Ｓ１２，Ｓ１３，Ｓ１５，Ｓ１６，Ｓ１１の順でプログラムが実行された場合の動作を示している。このうち、ステップＳ１１，Ｓ１２，Ｓ１３およびＳ１５を実行するためのＣＰＵ１０からのフェッチ要求が、クロックステートＴ２，Ｔ５，Ｔ７，Ｔ９でそれぞれ行われている。ここで、“分岐Ｂ”の成立後のステップＳ１５の命令フェッチ時には、分岐先バッファ部３５およびプリフェッチバッファ部３６の各記憶データにヒットしないので、メモリ２０からの命令（メモリデータ５０３）の取り込みが行われ、その期間であるクロックステートＴ１１〜Ｔ１２がペナルティサイクルＰＣとなる。このとき、分岐先バッファ部３５は、フェッチされたステップＳ１５に相当する分岐先命令で更新される（クロックステートＴ１３）。
【００５５】
その後、ステップＳ１６およびＳ１１のフェッチ要求が、クロックステートＴ１３およびＴ１５でそれぞれ行われるが、“分岐Ｄ”の出現後のステップＳ１１の命令フェッチ時には、同様に分岐先バッファ部３５の記憶データにヒットしないので、再びメモリ２０からの命令の取り込みが行われ、クロックステートＴ１７〜Ｔ１８がペナルティサイクルＰＣとなる。またこのとき、分岐先バッファ部３５の記憶データが更新される。
【００５６】
このように、分岐の出現ごとに分岐先バッファ部３５のデータを更新した場合には、“分岐Ｄ”の分岐先であるステップＳ１１の再実行時には、分岐先バッファ部３５は“分岐Ｂ”あるいは“分岐Ｃ”による分岐先の命令を保持することになるので、全くヒットしない。“分岐Ｄ”での分岐先バッファ部３５のヒット率を向上させるためには、このループ内の分岐数以上のバッファ段数を用意する必要がある。
【００５７】
これに対して、図６は、本実施の形態の動作を示すタイミングチャートである。
図６では、図５と同様のステップ順でプログラムが実行された場合の動作を示している。この図６において、“分岐Ｂ”の成立後のステップＳ１５の命令フェッチがクロックステートＴ２９でＣＰＵ１０から要求されると、その直後のクロックステートＴ３０において、分岐先バッファ制御部３４のアドレス比較部３４３では、分岐元のアドレス（０８）と分岐先のアドレス（２０）との差分が演算される。この演算結果によりアドレスがプラス方向に変化する分岐と判別されるので、更新信号出力部３４４は分岐先バッファ更新信号６０８をアサートせず、分岐先バッファ部３５を更新させない。従って、分岐先バッファ部３５には、ステップＳ１１に相当する命令およびアドレスが保持される。
【００５８】
そして、その後に“分岐Ｄ”が出現して分岐先の命令フェッチが要求されると（クロックステートＴ３６）、分岐先バッファ部３５がヒットして分岐先バッファヒット信号６０５がアサートされ、分岐先バッファ部３５の記憶データが命令データ５０２としてＣＰＵ１０に供給される。従って、ペナルティサイクルは発生しない。
【００５９】
なお、フェッチ要求直後のクロックステートＴ３７では、分岐先バッファ制御部３４のアドレス比較部３４３において、分岐元のアドレス（２４）と分岐先のアドレス（００）との差分が演算されて、命令アドレス５０１がマイナス方向に変化する分岐と判別され、更新信号出力部３４４からの分岐先バッファ更新信号６０８がアサートされる。しかし、分岐先バッファ部３５は、同じ分岐先命令をすでに保持しているので、データの更新を行う必要はない。
【００６０】
以上のように、分岐先バッファ制御部３４の制御により、命令アドレス５０１がマイナス方向に変化する分岐の出現時のみ分岐先バッファ部３５を更新するようにしたことで、特にループを含むプログラムの実行時において、分岐先バッファ部３５のバッファ段数が少ない場合にも、ループの先頭に戻ったときにその命令が分岐先バッファ部３５に残っている可能性が高くなる。このため、分岐先バッファ部３５のヒット率を向上させることができ、回路規模や製造コストを増大させることなく、パイプライン制御の処理性能を一層向上させることができる。
【００６１】
また、分岐先バッファ部３５を更新するか否かを判断するために、分岐先バッファ制御部３４ではアドレスの比較回路（または減算回路）を用いているので、例えばこのようなバッファにエントリ可能な数をカウンタを用いて管理し、バッファ更新の要否を判断する方法を用いた場合と比較して、回路構成が単純になり、回路規模や製造コストを縮小することができる。従って、パイプライン制御を用いた処理性能の向上と、回路規模や製造コストの縮小とを両立させることができる。
【００６２】
〔第２の実施の形態〕
ところで、上述した第１の実施の形態のように、分岐先命令のアドレスがマイナス方向に変化したことを判別するだけでは、例えばループ内部にサブルーチンや割り込み処理が存在した場合に、判別の本来の目的であるプログラムのループの先頭への分岐なのか、あるいはサブルーチンのコール命令やリターン命令による分岐なのかを判別できないという問題がある。
【００６３】
図７は、ループ内にサブルーチン処理が存在するプログラムの一例を示すフローチャートである。
図７でも、図４と同様に、ステップＳ２１〜Ｓ２３までの各処理コードが、この順番でＣＰＵ１０から見て連続したメモリ空間に格納されているものとする。また、ステップＳ２３はサブルーチン処理となっている。
【００６４】
この図において、ステップＳ２５からステップＳ２３への“分岐Ｅ”、およびステップＳ２３からステップＳ２１への“分岐Ｆ”は、ともに命令アドレス５０１がマイナス方向に変化する分岐となっている。従って、第１の実施の形態では、“分岐Ｅ”“分岐Ｆ”ともに分岐先バッファ部３５が更新されてしまうので、“分岐Ｆ”によりループ先頭（ステップＳ２１）に戻ったときには、分岐先バッファ部３５はステップＳ２３に相当する命令に更新されてしまっており、ヒットしない。
【００６５】
サブルーチン処理が存在する場合、そのプログラムがどこに配置されていても、サブルーチン処理への分岐（コール命令）か、サブルーチンから戻るための分岐（リターン命令）のいずれか１つが、アドレスがマイナス方向に変化する分岐となるため、ループ先頭への分岐の際には分岐先バッファ部３５は必ずヒットしないことになり、処理速度が低下してしまう。
【００６６】
このような問題を解決するために、以下の第２の実施の形態では、命令アドレス５０１がマイナス方向に変化する分岐の出現時に、分岐元の命令アドレスと分岐先の命令アドレスとの差分値が一定値以下である場合にのみ、分岐先バッファ部３５を更新するようにする。
【００６７】
図８は、第２の実施の形態に係る分岐先バッファ制御部３４の内部構成を示す図である。なお、図８では、図３に対応するブロックには同じ符号を付して示しており、その説明は省略する。
【００６８】
図８に示す分岐先バッファ制御部３４は、第１の実施の形態の構成に加えて、分岐先範囲指定部３４５および分岐先範囲比較部３４６を具備している。また、アドレス比較部３４３の代わりに、メモリアドレス生成部３２からの命令アドレスラッチ信号６０６から、分岐元アドレスラッチ部３４１からのアドレスを減算するアドレス減算部３４３ａが設けられている。
【００６９】
分岐先範囲指定部３４５は、アドレス減算部３４３ａによる演算結果を基にループ先頭への分岐であるか否かを判別するための基準値を指定する。分岐先範囲比較部３４６は、アドレス減算部３４３ａによって求められた減算値の絶対値と、分岐先範囲指定部３４５からの基準値とを比較して、入力された減算値が０未満であり、かつその絶対値が基準値以内である場合に、ループ先頭への分岐と判断してその旨を更新信号出力部３４４に通知する。ループ先頭への分岐であることの通知を受けた更新信号出力部３４４は、分岐先バッファ部３５への分岐先バッファ更新信号６０８をアサートして、分岐先バッファ部３５を更新させる。これにより、アドレスがマイナス方向に変化し、その変化量が基準値以下である場合に、分岐先バッファ部３５が更新される。
【００７０】
サブルーチンコールによる分岐先のプログラムは、メインプログラムとは別にライブラリとして用意されていることが多く、このために、サブルーチンコールでの分岐先が、現在実行している命令のアドレスに対して十分離れたメモリ空間に配置されていることが多い。あるいは、サブルーチンのプログラムをユーザが作成する場合では、個別にコーディングされるため、この場合でも最終的には、呼び出しを行うコール命令とは十分離れたメモリ空間に配置されることが多い。
【００７１】
逆に、例えばＣ言語などのプログラム言語でループ構造を記述する場合、ソースプログラムの可読性を優先するために、ループ内の記述を少なくし、複雑な処理が必要な場合は、処理ごとに関数（サブルーチン）を用意しておき、ループ内では必要な関数を呼び出すように記述することが多い。このため、ループされるプログラムの記述範囲は比較的小さくなることが多い。
【００７２】
このような特性から、分岐先範囲指定部３４５の出力する基準値を適切な値に設定することで、命令アドレスがマイナス方向に変化する分岐が、サブルーチンのコールまたはリターンによるものであるか否かを判別することができるので、サブルーチンによる分岐の際に分岐先バッファ部３５が更新される事態が回避され、ループ先頭の命令のみが分岐先バッファ部３５にキャッシュされるようになる。従って、バッファ段数を多くして回路規模や製造コストを増大させることなく、ループ処理時のペナルティサイクルの発生率を低減して処理を高速化することができる。
【００７３】
〔第３の実施の形態〕
図９は、第３の実施の形態に係るマイクロプロセッサシステムの構成を示す図である。なお、図９では、図２に対応するブロックには同じ符号を付して示しており、その説明は省略する。
【００７４】
上記の第２の実施の形態では、分岐先バッファ制御部３４において、サブルーチンによる分岐であるか否かを判別していたが、本実施の形態では、ＣＰＵ１０からサブルーチン分岐通知信号６１３の供給を受けて判別するようにしている。ＣＰＵ１０は、サブルーチンのコール命令およびリターン命令をデコードしたとき、サブルーチン分岐通知信号６１３をアサートして、サブルーチンによる分岐であることをメモリ制御回路３０の分岐先バッファ制御部３４に対して通知する。
【００７５】
図１０は、第３の実施の形態に係る分岐先バッファ制御部３４の内部構成を示す図である。なお、図１０では、図３に対応するブロックには同じ符号を付して示しており、その説明は省略する。
【００７６】
図１０に示す分岐先バッファ制御部３４は、第１の実施の形態の構成に加えて、信号出力制御部３４７を具備している。アドレス比較部３４３の演算により、命令アドレス５０１がマイナス方向に変化する分岐が出現した場合には、その旨を示す信号が信号出力制御部３４７を介して更新信号出力部３４４に出力される。このとき、信号出力制御部３４７は、ＣＰＵ１０からのサブルーチン分岐通知信号６１３がアサートされている場合には、更新信号出力部３４４への信号出力を抑止する。これにより、サブルーチンによる分岐の出現時には、分岐先バッファ部３５は確実に更新されないようになるので、バッファ段数を多くして回路規模や製造コストを増大させることなく、ループ処理時のペナルティサイクルの発生率をより低減することができる。
【図面の簡単な説明】
【００７７】
【図１】実施の形態に係るマイクロプロセッサシステムの概要を示す図である。
【図２】第１の実施の形態に係るマイクロプロセッサシステムの要部構成を示す図である。
【図３】第１の実施の形態に係る分岐先バッファ制御部の内部構成を示す図である。
【図４】ループ内に条件分岐が存在するプログラムの一例を示すフローチャートである。
【図５】図４のプログラムの実行時における従来例の動作を示すタイミングチャートである。
【図６】図４のプログラムの実行時における第１の実施の形態の動作を示すタイミングチャートである。
【図７】ループ内にサブルーチン処理が存在するプログラムの一例を示すフローチャートである。
【図８】第２の実施の形態に係る分岐先バッファ制御部の内部構成を示す図である。
【図９】第３の実施の形態に係るマイクロプロセッサシステムの構成を示す図である。
【図１０】第３の実施の形態に係る分岐先バッファ制御部の内部構成を示す図である。
【符号の説明】
【００７８】
１  分岐先バッファ
２  アドレス比較回路
２ａ  分岐元アドレス
３  バッファ更新制御回路
１０  ＣＰＵ
２０  メモリ
３０  メモリ制御回路
【図１】
2006072926.tif 000003
【図２】
2006072926.tif 000004
【図３】
2006072926.tif 000005
【図４】
2006072926.tif 000006
【図５】
2006072926.tif 000007
【図６】
2006072926.tif 000008
【図７】
2006072926.tif 000009
【図８】
2006072926.tif 000010
【図９】
2006072926.tif 000011
【図１０】
2006072926.tif 000012