以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、実施の形態を説明するための全図において、同一の機能を有する部材には原則として同一の符号を付し、その繰り返しの説明は省略する。
(実施の形態1)
本発明の実施の形態1を、図1〜図10に基づいて説明する。
図1は、本発明の実施の形態1の情報処理装置の全体を示す構成図である。
本実施の形態の情報処理装置は、CPU(1)、先読みアドレス生成部(2)、制御部(3)、メモリ(4)、キャッシュ(5)、セレクタ0(6)、データバッファ(7)、命令バッファ(8)、INTC(9)、セレクタ1(10)から構成される。この構成において、先読みアドレス生成部(2)は先読みアドレス生成手段として備えられ、またこの先読みアドレス生成部(2)を含む、制御部(3)、セレクタ0(6)、データバッファ(7)、命令バッファ(8)、およびセレクタ1(10)は先読み手段として備えられている。
メモリ(4)はプログラムを格納し、信号ライン22でメモリアドレス信号memadr[31:4]を、信号ライン23でメモリリード信号memreadを、それぞれ受け取り、信号ライン21でメモリリードデータ信号memrd[127:0]を出力する。
ここで、memadr[31:4]の表記は、memadr[31]、memadr[30]、・・・、memadr[4]からなる28ビットの信号を表記上まとめて記述したものである。本実施の形態の記載において、他の信号に関しても同様である。
なお、本実施の形態では、メモリのアクセスレイテンシを2、読み出し幅を128ビットとする。
CPU(1)は、必要な命令コードをメモリ(4)などから読み出し、プログラムを実行する。図示しないが、メモリ等に格納されたデータに対して必要な数値演算、論理演算を行なうためのALU(算術演算ユニット)、プログラムカウンタ、アキュムレータ、汎用レジスタ等を備える演算部と、入力された命令をデコードすることによって前記演算部の動作制御信号を生成する動作制御部とを備える。
CPU(1)は、信号ライン14でCPU(1)がアクセスする対象である命令コードおよびデータのアドレスを示すCPUアドレス信号cpuadr[31:0]を出力する。
CPU(1)は、さらに、信号ライン11でベクタテーブルの先頭アドレス信号vbr[31:0]を、信号ライン12で退避プログラムカウンタ信号spc[31:0]を、信号ライン13でspc[31:0]の有効タイミングを示す信号spcupdtを、それぞれ先読みアドレス生成部(2)の演算用に出力する。
CPU(1)には、さらに、cpuadr[31:0]が示すアドレスにある命令又はデータの読み出し値であるCPUリードデータ信号cpurd[31:0]が信号ライン15でセレクタ1(10)から入力される。
CPU(1)には、さらに、cpurd[31:0]が確定していない場合にCPUアクセスを停止するためのCPUウエイト信号cpuwaitが信号ライン35で制御部(3)から入力される。
CPU(1)は、さらに、信号ライン32で割り込み要求信号intreqを、信号ライン33で割り込み要因信号intvec[3:0]を、それぞれINTC(9)から入力し、信号ライン36で割り込み受け付け信号intackをINTC(9)に出力する。
なお、本実施の形態では、CPU(1)の命令幅を16ビット、データ幅、およびアドレス空間を32ビットとする。
先読みアドレス生成部(2)は、命令バッファ(8)に命令列が格納されると、格納された命令列の中から割り込み復帰命令を、その命令が実行される前に検出し、それらの命令に従って次にアクセスするアドレスを演算し、そのアドレスの命令が含まれる命令列をメモリ(4)から読み出す要求を生成する。
先読みアドレス生成部(2)は、さらに、信号ライン32で割り込み要求信号intreqを、信号ライン33で割り込み要因信号intvec[3:0]を、それぞれINTC(9)から入力し、信号ライン36で割り込み受け付け信号intackをCPU(1)から入力し、割り込みベクタテーブル、および割り込みルーチンをCPU(1)が読み込む前に、これらのターゲットアドレスを演算し、そのターゲットアドレスが含まれる命令列をメモリ(4)から読み出す要求を生成する。
以上の先読みのために、先読みアドレス生成部(2)は、信号ライン30で先読み命令のアドレスを示す先読みアドレス信号pfadr[31:0]を、信号ライン29で先読み要求が発生したことを示す信号である先読み要求信号pfreqを、それぞれ制御部(3)に出力する。
先読みアドレス生成部(2)は、さらに、CPU(1)からそれぞれ、vbr[31:0]、spc[31:0]、spcupdtを、命令バッファ(8)から信号ライン18で命令バッファ出力信号ibuf[127:0]を、データバッファ(7)から信号ライン19でデータバッファ出力信号dbuf[127:0]を、制御部(3)からそれぞれ、信号ライン31で信号pfack、信号ライン27でdbuf[127:0]の入力タイミングを示す先読みアップデート信号dbupdtを受け、pfadr[31:0]およびpfreqの演算に用いる。
キャッシュ(5)は、一度実行された命令、または一度参照されたデータ、先読みアドレス生成部(2)から先読み要求があった命令またはデータを格納しており、格納した命令またはデータは高速に読み出すことができる。
キャッシュ(5)からの命令の読み出しは、制御部(3)から信号ライン24でキャッシュ読み出しアドレス信号cacheadr[31:4]を、信号ライン25でキャッシュリード信号cachereadを、それぞれ入力することで行う。cacheadr[31:4]が示すアドレスの命令が格納されている場合、信号ライン26でキャッシュヒット信号chachehitをアサートし、同時に格納している命令をキャッシュリードデータcacherd[127:0](信号ライン20)として出力する。
実際は、キャッシュに格納している命令またはデータの更新を行う制御信号を、制御部(3)から入力するが、図1では詳細を省略し、メモリ(4)からの命令またはデータの読み出しと同時に適宜更新されるものとする。
命令バッファ(8)は、現在実行中の命令を含む命令列を保持し、それらは命令バッファ出力信号ibuf[127:0](信号ライン18)で出力する。
命令バッファ(8)は、信号ライン28で命令バッファが保持している値の更新タイミングを示す命令バッファアップデート信号ibupdtの入力を受け、cacherd[127:0]の信号を取り込む。
データバッファ(7)は、先読みアドレス生成部(2)から先読み要求があったベクタテーブルを保持し、それらはデータバッファ出力信号dbuf[127:0](信号ライン19)で出力する。データバッファ(7)は、信号ライン27でデータバッファが保持している値の更新タイミングを示すデータバッファアップデート信号dbupdtの入力を受け、memrd[127:0]の信号を取り込む。
セレクタ0(6)は、制御部(3)から信号ライン17で選択信号sel0[1:0]を入力し、dbuf[127:0]、cacherd[127:0]、memrd[127:0]から一つの信号を選択し、選択結果をselrd[127:0](信号ライン34)に出力する。sel0[1:0]の値と選択される信号は2:dbuf[127:0]、1:cacherd[127:0]、0:memrd[127:0]である。
セレクタ1(10)は、制御部(3)から信号ライン16で選択信号sel1[1:0]を入力し、selrd[127:0]から32ビットを選択し、選択結果をcpurd[31:0]に出力する。sel1[3:0]の値と選択される信号は0:selrd[127:96]、1:selrd[95:64]、2:selrd[63:32]、3:selrd[31:0]となる。
以上説明の、セレクタ0(6)、セレクタ1(10)への選択信号、sel0[1:0]、sel0[1:0]は、制御部(3)がCPU(1)からのアクセスに対応した命令またはデータを最も早く供給できる出力信号を適宜選択する。
INTC(9)は、割り込み要求信号intreq、および割り込み要因信号intvec[3:0]を出力し、割り込み要因に対応した割り込みルーチンへの分岐をCPU(1)に要求する。
INTC(9)は、CPU(1)から、割り込みが受け付けられたことを示す割り込み受け付け信号intackが入力されるまで、intreq、intvec[3:0]を出力する。
制御部(3)は、CPU(1)、先読みアドレス生成部(2)、メモリ(4)、キャッシュ(5)、セレクタ0(6)、データバッファ(7)、命令バッファ(8)、セレクタ1(10)と制御信号を入出力することにより、CPU(1)とメモリ(4)との間の命令およびデータ転送に関わる制御を行なう。
具体的には、後述するように、各種の制御信号の入力を受けて、必要な制御信号を所定のタイミングでアサートすることにより、各部の処理を制御する。
次に、各構成の詳細を説明する。詳細の説明に先立ち、本実施の形態において想定しているCPU(1)の動作、CPU(1)が実行するプログラムが、本実施の形態においてメモリに格納される場合の配置について説明する。
図2は、CPU(1)の動作を示すタイミングチャートである。
図2の上段は、CPU(1)が実行する命令列の一例と、その命令列を処理する際のCPU(1)のパイプライン動作とを示したものである。
CPU(1)は、命令をメモリ(4)から読み込む命令フェッチ(IF)ステージ、命令をデコードする命令デコード(ID)ステージ、命令を実行する実行(EX)ステージ、メモリ(4)からデータを読み出すメモリアクセス(MA)ステージ、メモリ(4)への書き込みを行うライトバック(WB)ステージの5段パイプラインで1つの命令を処理する。
なお、メモリ(4)へのアクセスは、各命令のIFステージ、MAステージ、WBステージで発生する。また、IFステージ、IDステージ、EXステージは必ず実行されるが、MAステージ、WBステージは命令によって実行されない場合がある。また32ビット幅のバスで16ビットの命令を2命令同時に読み込むため、命令の2回に1回はIFステージが実行されない。図2においては、実行されない命令ステージは小文字で示している。
図2の下段は、図2の上段で示すパイプライン動作に対応して発生するCPU(1)の各入出力信号波形を示したものである。
図2において、サイクル0は、アドレス128の命令64のIFステージである。サイクル0では、CPU(1)からcpuadrにアドレス128が出力され、アドレス128にある命令へのアクセスが発生する。
続くサイクル1は、サイクル1のアクセスに対するデータが、メモリの出力遅延等の要因で確定しない状況を示している。この時、制御部(3)は、cpuwaitをアサートし、CPU(1)に命令処理の中断を指示する。
続くサイクル2にてデータが確定し、cpuwaitのネゲートを受けて、CPU(1)は、処理を再開する。サイクル2では、サイクル0のアクセスに対するアドレス128の命令がcpurdからCPU(1)に入力される。
なお、図2においては、アドレス128のアドレス出力および、同アクセスに対して読み出された命令およびデータを「a128」の通り表記する。
サイクル3で、INTC(9)は、割り込み要求信号intreq、および割り込み要因信号intvec[3:0]に割り込み要因2を出力し、割り込み要因2に対応した割り込みルーチンへの分岐をCPU(1)に要求する。
サイクル4で、CPU(1)は割り込み要因2の割り込みの受け付けを、intackアサートにてINTC(9)に伝達し、次のサイクル5から割り込み要因2の割り込みルーチンへの分岐処理を開始する。
サイクル5で、CPU(1)は割り込みルーチンから復帰する時の復帰先アドレスを内蔵RAM等の記憶素子に退避するために、復帰先のアドレス130をspc[31:0]に出力し、spc[31:0]の有効タイミングを示す信号spcupdtをアサートする。なお、図1の全体構成図においては、内蔵RAM等の記憶素子、およびspc[31:0]、spcupdtとの接続は省略している。
サイクル6で、CPU(1)は割り込みベクタテーブルをメモリから読み込む。
ここで、割り込みベクタテーブルとは、割り込み要因に対応した割り込みルーチンの先頭アドレス(割り込みベクタ)を格納したテーブルで、vbr[31:0]が示すアドレスを先頭に、割り込み要因0から順に配置されている。本実施の形態の例ではvbr[31:0]=0に設定されており、割り込みベクタのアドレスは、割り込み要因0から順に0、4、8、・・・となる。
受け付けた割り込み要因2の割り込みベクタをメモリから読み込むために、アドレス8へのアクセスを行う。
サイクル7で、割り込み要因2の割り込みベクタが読み出される。本実施の形態の例では割り込み要因2の割り込みベクタ=512とする。
サイクル8から割り込み要因2の割り込みルーチンの先頭アドレス512へのアクセスを開始する。
サイクルnは、割り込みルーチンからの復帰命令RTEのIFステージである。RTEのID、EXステージを経て、サイクルn+3、n+4にて内蔵RAM等の記憶素子に退避した復帰先のアドレス132を読み込む。なお、図1において、退避した復帰先アドレスをCPU(1)が読み込むための信号は省略している。
サイクルn+5で復帰先アドレスの命令がアクセスされ、以降メインルーチンの命令処理が続く。
図3は、プログラムをメモリ(4)に格納する場合の、アドレスとビット、エントリの関係を示す説明図である。
図3に示すように、プログラムを構成する命令およびデータは、アドレスの小さい順にビットの大きい側から順番に配置され、8の命令(またはデータ)単位で1エントリを構成する。以後、1エントリを構成する命令またはデータの列を命令列と呼ぶ。
なお、本実施の形態においては、メモリ(4)へのアクセスは、エントリ単位で行われる。例えば、アドレス0、2、4、6、8、10、12、14に対するアクセスは、エントリ0へのアクセスとして同時に行なわれる。また図3に示すエントリ0、エントリ8、エントリ32、エントリ50は、それぞれ、割り込みベクタ、メインルーチン、割り込み要因2に対応する割り込みルーチンの先頭命令、RTE命令、とを格納する。
このようなメモリ(1)に16ビット幅の命令あるいはデータを格納する場合、アドレスの各ビットは、
ビット15〜4:エントリ
ビット3〜1:同一エントリ内の命令あるいはデータの位置
ビット0:命令あるいはデータの上位8ビット、下位8ビット
の以上を区別する役割を持つ。
次に、メモリ(4)の動作を説明する。図4は、メモリ(4)の動作を示すタイミングチャートである。
サイクル0にて、制御部(3)が、memadrにエントリ0を出力し、memreadをアサートすることで、メモリ(4)に対してエントリ0へのリード要求を出す。なお、図4においては、エントリ0のアドレス出力および、同アクセスに対して読み出された命令およびデータを「e0」の通り表記する。
本実施の形態では、メモリのアクセスレイテンシは2サイクルと設定されているため、このアクセスに対するデータは、サイクル2にて確定し、ここで、メモリ(4)は、memrdに命令またはデータを出力する。
このようなアクセスレイテンシ2を持つメモリ(4)と、連続する命令のみをキャッシュに先読みする構成にてプログラムを実行した場合のタイミングチャートを図5に示す。
なお、実行する命令、割り込み要求のタイミング、割り込み要因、は、前述した図2にて説明の動作と同一のものとする。
図5に示す様に、CPUのアクセスが不連続となる、割り込みベクタへのアクセス(サイクル6)、割り込みルーチン先頭命令へのアクセス(サイクル10)、割り込み復帰先の先頭命令へのアクセス(サイクルn+5)、においてキャッシュミスが発生し、アクセス先の命令またはデータが確定するまでの間CPUの処理が中断し、性能が低下する。
次に、先読みアドレス生成部(2)の詳細を説明する。図6は、先読みアドレス生成部(2)の詳細を示す構成図である。
先読みアドレス生成部(2)は、入力された命令がRTE命令であるかをデコードする8つの命令種プリデコーダ、すなわち、命令プリデコーダ0(210)、命令プリデコーダ1(211)、・・・、命令プリデコーダ7(217)と、ORゲート(203)、先読み要求ステートマシン(201)、アドレス演算部(202)とを備える。
ibuf[127:0]は、16ビット毎に区切られ、それぞれ、命令プリデコーダ0(210)、命令プリデコーダ1(211)、・・・、命令プリデコーダ7(217)とに入力される。
例えば、命令プリデコーダ0(210)には、ibuf[127:0]が出力するエントリの命令列における先頭アドレスの命令が入力される。命令プリデコーダ0(210)は、入力された命令がRTE命令であった場合、信号ライン220にデコードした命令がRTE命令であることを示す信号rtn0をアサートする。
命令プリデコーダ1(211)も同様に、ibuf[127:0]が出力するエントリの命令列における2番目の命令をデコードして、結果を信号ライン221で信号rtn1として出力する。
さらに3番目、4番目、・・・、6番目の命令またはデータも同様にその種類がデコードされる。そして、命令プリデコーダ7(217)も同様に、ibuf[127:0]が出力するエントリの命令列における8番目の命令をデコードして、結果を信号ライン227で信号rtn7として出力する。
rtn0、rtn0、・・・、rtn7はORゲート(203)により論理和が演算され、結果を信号ライン204で信号rtnとして出力する。以上に述べた構成により、ibuf[127:0]が出力するエントリの命令列の中に一つでもRTE命令が存在すればrtnがアサートされる。
rtn(204)、dbupdt(27)、pfack(31)、intreq(32)は先読み要求ステートマシン(201)の、ステート遷移の条件として入力される。また先読み要求ステートマシン(201)は現在のステートをデコードして、結果をpfreq(29)、pftype(205)として出力する。
ステートとステート間遷移条件、ステートに対応した出力については、後述する図7、図8にて詳細を説明する。
アドレス演算部(202)は、pftype(205)、dbuf[127:0](19)、intvec[8:0](33)、vbr[31:0](11)、spc[31:0](12)、spcupdt(13)、intack(36)を入力し先読みをするアドレスを演算し、信号ライン30で先読み命令のターゲットアドレスを示す先読みアドレス信号pfadr[31:0]を出力する。アドレス演算部(202)の詳細は、後述する図9にて説明する。
図7は、先読み要求ステートマシン(201)のステート遷移を示す説明図である。
先読み要求ステートマシン(201)の状態は、何も要求を出さないIDLEステート、割り込みベクタの先読みを行うVECF0ステート、VECF1ステート、割り込みルーチン先頭アドレスの先読みを行うJMP0ステート、JMP1ステート、割り込みからの復帰先アドレスの先読みを行うRTNステート、の6ステートから構成される。初期状態はIDLEステートである。
IDLEステートは、intreq=0で同状態に、intreq=1でVECF0ステートに、rtn=1でRTNステートに、それぞれ遷移する。
VECF0ステートは、pfack=0で同状態に、pfack=1でVECF1ステートに、それぞれ遷移する。
VECF1ステートは、dbupdt=0で同状態に、dbupdt=1でJMP0ステートに、それぞれ遷移する。
JMP0ステートは、無条件でJMP1ステートに遷移する。
JMP1ステートは、pfack=0で同状態に、pfack=1でIDLEステートに、それぞれ遷移する。
RTNステートは、pfack=0で同状態に、pfack=1でIDLEステートに、それぞれ遷移する。
図8は、前述した図7に示した各ステートに対応した出力pfreq(29)、pftype(205)を示す説明図である。図示するように、VECF0ステート、JMP1ステート、RTNステートで制御部(3)に先読み要求pfreqをアサートし、先読みの種類pftypeをアドレス演算部(202)に出力する。ここでpftypeの意味は、
0:先読みなし
1:割り込みベクタの先読みを要求
2:割り込みルーチン先頭命令先読みを要求
3:割り込み復帰先命令先読みを要求
と定義されている。
図9は、アドレス演算部(202)の詳細を示す構成図である。アドレス演算部(202)は、INTVEC保持レジスタ(412)、2ビット左シフタ(401)、加算器(402)、セレクタ0(403)、退避PC保持レジスタ(404)、セレクタ1(405)から構成される。
INTVEC保持レジスタ(412)は、intack(36)のアサートで、intvec[3:0](33)の値を取り込み、保持している値を信号ライン413で信号intvec1[3:0](413)として出力する。
2ビット左シフタ(401)は、intvec1[3:0](413)を2ビット左シフトし、最下位ビット2ビット0を追加する演算、すなわち入力を4倍する演算を行い、結果を信号ライン405でベクタオフセット信号vecofst[5:0]として出力する。
加算器(402)は、vbr[31:0](11)とvecofst[5:0](405)を加算し、結果を信号ライン411でベクタアドレス信号vecadr[31:0]として出力する。
セレクタ0(403)は、intvec1[3:0](413)の下位2ビットintvec1[1:0]を選択信号として入力し、dbuf[127:0](19)から32ビットを選択し、信号ライン406で割り込みルーチン先頭アドレス信号jmpadr[31:0]として出力する。intvec1[3:0]と選択されるビットとの関係は0:dbuf[127:96]、1:dbuf[95:64]、2:dbuf[63:32]、3:dbuf[31:0]である。
退避PC保持レジスタ(404)は、spcupdt(13)のアサートで、spc[31:0](12)の値を取り込み、保持している値を信号ライン407で復帰先アドレス信号rtnadr[31:0]として出力する。
セレクタ1(405)は、pftype[1:0](205)を選択信号として入力し、32ビット0固定値、vecadr[31:0](411)、jmpadr[31:0](406)、rtnadr[31:0](407)から一つを選択し、結果を先読みアドレス信号pfadr[31:0](30)に出力する。pftype[1:0]と選択される信号との対応は0:固定値、1:vecadr[31:0]、2:jmpadr[31:0]、3:rtnadr[31:0]である。なお、本実施の形態の例では、pftype[1:0]=0の場合、32ビット0固定値を選択するとしたが、先読み要求を出していないので、値は32ビット0固定値に限らず任意の値でも良い。
次に、本実施の形態の情報処理装置の動作を説明する。
図10は、以上説明した本実施の形態における情報処理装置の動作を示すタイミングチャートである。なお、実行する命令、割り込み要求のタイミング、割り込み要因は、前述した図5にて説明の動作と同一のものとする。
サイクル3で、INTC(9)は、割り込み要求信号intreq、および割り込み要因信号intvec[8:0]に割り込み要因2を出力し、割り込み要因2に対応した割り込みルーチンへの分岐をCPU(1)に要求する。同サイクルで、先読み要求ステートマシン(201)のステートが、VECF0ステートへと遷移し、pfreqをアサートする。さらに、割り込み要因2の割り込みベクタのアドレスを、アドレス演算部(202)にて演算しアドレス8をpfadr[31:0]に出力する。
次に、サイクル4で制御部(3)は、アドレス8の先読み要求を受け、memadrにエントリ0を出力、memreadをアサートし、メモリ(4)に対してエントリ0へのリード要求を出す。同サイクルで、制御部(3)からのpfackアサートを受け、先読み要求ステートマシン(201)のステートが、VECF1へ遷移する。
サイクル5で、CPU(1)は割り込みルーチンから復帰する場合の復帰先のアドレスを内蔵RAM等の記憶素子に退避するために、復帰先のアドレス130をspc[31:0]に出力し、spc[31:0]の有効タイミングを示す信号spcupdtをアサートする。同サイクルで、アドレス演算部(202)は、退避PC保持レジスタ(404)に復帰先のアドレスを保持し、復帰先のアドレスの先読みに使用する。
次に、サイクル6で、CPU(1)は受け付けた割り込み要因2の割り込みベクタをメモリから読み込むために、アドレス8へのアクセスを行う。
さらに同サイクルで、サイクル4にて先読みを行ったエントリ8のリードデータがメモリ(4)からmemrd[127:0]に出力され、制御部(3)はmemrd[127:0]をデータバッファ(7)に取り込むためdbupdtをアサートする。
さらに同サイクルで、dbupdtのアサートを受け先読み要求ステートマシン(201)のステートが、JMP0へ遷移する。
次に、サイクル7で、割り込み要因2の割り込みベクタが読み出される。サイクル3〜6にて予め割り込み要因2の割り込みベクタの先読みを行っていたので、メモリアクセスのレイテンシによるアクセスの中断が発生しない。
さらに同サイクルで、先読み要求ステートマシン(201)のステートが、JMP1へ遷移し、pfreqをアサートする。さらに、アドレス演算部(202)は、割り込みベクタが格納されたdbuf[127:0]から割り込み要因2の割り込みルーチンの先頭アドレスを選択し、アドレス512をpfadr[31:0]に出力する。
次に、サイクル8で、割り込み要因2の割り込みルーチンの先頭アドレス512へのアクセスを開始する。さらに同サイクルで、制御部(3)は、アドレス512の先読み要求を受け、memadrにエントリ32を出力、memreadをアサートし、メモリ(4)に対してエントリ32へのリード要求を出す。
さらに同サイクルで、制御部(3)からのpfackアサートを受け、先読み要求ステートマシン(201)のステートが、IDLEへ遷移する。
次に、サイクル10で、割り込み要因2の割り込みルーチン先頭命令が読み出される。サイクル7〜10にて予め割り込み要因2の割り込みルーチン先頭命令の先読みを行っていたので、メモリアクセスのレイテンシによるアクセスの中断が1サイクルに収まる。
なお、本実施の形態の例では、サイクル7より割り込み要因2の割り込みルーチン先頭命令の先読みを行っているが、先読みアドレス生成部(2)を、割り込みベクタが格納されたmemrd[127:0]から割り込みルーチン先頭命令のアドレスを選択する構成とすることで、サイクル6で先読みを開始することも可能である。その場合、メモリアクセスのレイテンシによるアクセスの中断はなくなる。
次に、サイクルn−2でエントリ50が最初にヒットし、制御部は、命令バッファ(8)にエントリ50を格納するため、ibupdtをアサートする。
次に、サイクルn−1で、先読みアドレス生成部(2)にてibuf[127:0]からRTE命令がデコードされ、先読み要求ステートマシン(201)のステートが、RTNへ遷移し、pfreqをアサートする。さらに、アドレス演算部(202)にて、サイクル5で退避PC保持レジスタ(404)に保持していた割り込み復帰先のアドレスを選択し、アドレス132をpfadr[31:0]に出力する。
次に、サイクルnで制御部(3)は、アドレス132の先読み要求を受け、memadrにエントリ8を出力、memreadをアサートし、メモリ(4)に対してエントリ8へのリード要求を出す。同サイクルで、制御部(3)からのpfackアサートを受け、先読み要求ステートマシン(201)のステートが、IDLEへ遷移する。
次に、サイクルn+4で復帰先アドレスの命令がアクセスされ、続くサイクルn+5で、復帰先アドレスの命令が読み出される。サイクルn−1〜n+2にて予め復帰先アドレスの命令の先読みを行っていたので、メモリアクセスのレイテンシによるアクセスの中断が発生しない。
ここで、本実施の形態の例では先読みアドレス生成部(2)にて、割り込みルーチンからの復帰命令RTE命令をデコードし、復帰先のアドレスの先読みを行ったが、サブルーチンからの復帰命令等の、退避した復帰先のアドレスに分岐する命令をすべてデコードし、復帰先の先読みを行う形態でも良い。
以上より、本実施の形態によれば、割り込みの多いアプリケーションにおいても、効果的な先読みを行い、高性能で高いリアルタイム性を持つ情報処理技術を提供することができる。
(実施の形態2)
本発明の実施の形態2を、図11〜図21に基づいて説明する。
図11は、本発明の実施の形態2の情報処理装置の全体を示す構成図である。
本実施の形態の情報処理装置は、CPU(1)、メモリ(4)、キャッシュ(5)、セレクタ0(6)、セレクタ1(10)、先読みアドレス生成部(1101)、サブルーチン復帰命令バッファ(1102)、命令バッファ(1103)、制御部(1111)から構成される。
CPU(1)、メモリ(4)、キャッシュ(5)、セレクタ0(6)、セレクタ1(10)の機能は、前記実施の形態1と同様であり、図1にて説明しているので、ここでの説明は省略する。
先読みアドレス生成部(1101)は、命令バッファ(1103)に命令列が格納されると、格納された命令列の中から分岐命令列を検出し、それらの命令に従って次にアクセスするアドレスを演算し、そのアドレスの命令が含まれる命令列をメモリ(4)から読み出す要求を生成する。分岐命令列の例は図15にて後述する。
以上の先読みのために、先読みアドレス生成部(1101)は、信号ライン30で先読み命令のアドレスを示す先読みアドレス信号pfadr[31:0]を、信号ライン29で先読み要求が発生したことを示す信号である先読み要求信号pfreqを、それぞれ制御部(1111)に出力する。
先読みアドレス生成部(1101)は、さらに、命令バッファ(1103)から、信号ライン1104で命令バッファ出力信号ibuf[175:0]を、信号ライン1108で命令バッファ上位ビット有効信号ibvhを、制御部(1111)から、信号ライン31で信号pfackを、それぞれ受け、pfadr[31:0]およびpfreqの演算に用いる。
また先読みアドレス生成部(1101)は、命令バッファ(1103)に命令列が格納されると、格納された命令列の中からサブルーチン分岐命令を検出し、それに伴い信号ライン1105でサブルーチン復帰命令更新信号rtsupdtをアサートする。
命令バッファ(1103)は、現在CPUがアクセス中の命令を含む命令列、および前回CPUがアクセスしていた命令列を保持し、それらは命令バッファ出力信号ibuf[175:0](信号ライン1104)で出力する。ibuf[175:0]の上位ビットibuf[175:128]の有効を、命令バッファ上位ビット有効信号ibvh(信号ライン1108)で出力する。また、命令バッファ(1103)が保持している命令列のアドレスをitag[31:4](信号ライン1109)で出力する。
命令バッファ(1103)は、信号ライン28で命令バッファが保持している命令列の更新タイミングを示す命令バッファアップデート信号ibufupdの入力を受け、cacheadr[31:4]、およびcacherd[127:0]を取り込む。
サブルーチン復帰命令バッファ(1102)には、サブルーチン分岐命令を含む命令列を複数組退避する。cacheadr[31:4]、cachereadを入力し、同信号が示すキャッシュ(5)に対するリードに対して、退避された複数組の命令列のヒット判定を行い、ヒットしている場合、サブルーチン復帰命令バッファヒット信号rtshit(信号ライン1106)をアサートし、ヒットしている命令列をサブルーチン復帰命令バッファリードデータrtsbufrd[127:0](信号ライン1107)に出力する。
サブルーチン復帰命令バッファ(1102)は、信号ライン1105でサブルーチン復帰命令バッファが保持している命令列の更新タイミングを示すサブルーチン復帰命令バッファアップデート信号rtsupdtの入力を受け、itag[31:4]、およびibuf[127:0]を取り込む。
制御部(1111)は、メモリ(4)、CPU(1)、先読みアドレス生成部(1101)、キャッシュ(5)、セレクタ0(6)、セレクタ1(10)、命令バッファ(1103)、サブルーチン復帰命令バッファ(1102)と制御信号を入出力することにより、CPU(1)とメモリ(4)との間の命令およびデータ転送に関わる制御を行う。
具体的には、後述するように、各種の制御信号の入力を受けて、必要な制御信号を所定のタイミングでアサートすることにより、各部の処理を制御する。
次に、各構成の詳細を説明する。
図12は、命令バッファ(1103)の詳細を示す構成図である。
命令バッファ(1103)は、フリップフロップ(1220)、現命令タグ(1203)、現命令バッファ(1201)、前命令タグ(1204)、前命令バッファ(1202)、加算器(1205)、比較器(1208)、ドライバ(1221)、ドライバ(1206)、ドライバ(1207)を備える。
フリップフロップ(1220)は、cacheadr[31:4](24)を入力し、1サイクル後に入力値をcacheadr1[31:4](信号ライン1214)に出力する。
現命令タグ(1203)は、現命令バッファ(1201)が格納する命令列のアドレスを保持する。ibupdt(28)のアサートで、cacheadr1[31:4](1214)の値を取り込み、保持している値をitag0[31:4](信号ライン1210)に出力する。
現命令バッファ(1201)は、ibupdt(28)のアサートで、cacherd[127:0](20)の値を取り込み、保持している値をibuf0[127:0](信号ライン1211)に出力する。
前命令タグ(1204)は、前命令バッファ(1202)が格納する命令列のアドレスを保持する。ibupdt(28)のアサートで、itag0[31:4](1210)の値を取り込み、保持している値をitag1[31:4](信号ライン1212)に出力する。
前命令バッファ(1202)は、ibupdt(28)のアサートで、ibuf0[127:0](1211)のうちibuf0[47:0]を取り込み、保持している値をibuf1[47:0](信号ライン1213)に出力する。
加算器(1205)は、itag1[31:4](1212)に1を足した演算結果をitag2[31:4](信号ライン1214)に出力する。
比較器(1208)は、itag0[31:4](1210)とitag2[31:4](1214)とを比較し、一致する場合、信号ライン1108で命令バッファ上位ビット有効信号ibvhをアサートする。ibvh(1108)アサートはすなわち、現命令バッファ(1201)が格納する命令列と前命令バッファ(1202)が格納する命令列が連続することを意味する。
ドライバ(1221)は、itag0[31:4](1210)を入力し、入力した値をitag[31:4](信号ライン1109)に出力する。
ドライバ(1206)、およびドライバ(1207)は、ibuf0[127:0](1211)、ibuf1[47:0](1213)をそれぞれ入力し、入力した値を、ibuf[175:0](1104)のうちibuf[127:0]に、ibuf[175:0](1104)のうちibuf[175:128]に、それぞれ出力する。ibvh(1108)アサート時、ibuf[175:0](1104)は連続する11命令を出力する。
図13は、サブルーチン復帰命令バッファ(1102)の詳細を示す構成図である。
サブルーチン復帰命令バッファ(1102)は、ANDゲート(1305)、RTSタグ0(1300)、有効ビット0(1301)、ヒットビット0(1302)、RTSバッファ0(1303)、比較器0(1304)、ANDゲート(1325)、RTSタグ1(1320)、有効ビット1(1321)、ヒットビット1(1322)、RTSバッファ1(1323)、比較器1(1324)、ORゲート(1340)、ANDゲート(1343)、セレクタ(1341)、フリップフロップ(1344)、RTS更新ポインタ生成回路(1342)を備える。
なお、本実施の形態では、サブルーチン復帰命令バッファ(1102)は、RTSバッファ0(1303)、およびRTSバッファ1(1323)に最大2つのエントリを保持する。
ANDゲート(1305)は、サブルーチン復帰命令バッファアップデート信号rtsupdt(1105)とrtspnt[0]との論理積を、RTSバッファ0更新信号rstupdt0(信号ライン1314)に出力する。なお、rtspnt[0]は、更新するRTSバッファを示すRTS更新ポインタ信号rtspnt[1:0](信号ライン1352)のビット0である。
RTSタグ0(1300)は、RTSバッファ0(1303)が格納する命令列のアドレスを保持する。rstupdt0(1314)のアサートで、itag[31:4](1109)の値を取り込み、保持している値をrtstag0[31:4](信号ライン1310)に出力する。
有効ビット0(1301)は、RTSバッファ0(1303)が格納する命令列の有効、無効の状態(1:有効、0:無効)を格納し、格納した値をv0(信号ライン1311)に出力する。有効ビット0(1301)の初期値は0で、rstupdt0(1314)のアサートで1にセットされる。
RTSバッファ0(1303)は、rstupdt0(1314)のアサートで、ibuf[127:0](1104)の値を取り込み、保持している値をrtsbuf0[127:0](信号ライン1315)に出力する。
比較器0(1304)は、cacheadr[31:4](24)とrtstag0[31:4](1310)とv0(1311)とを入力し、cacheadr[31:4](24)とrtstag0[31:4](1310)が一致し、かつv0(1311)が1の場合、信号ライン1313でRTSバッファ0ヒット信号rtshit0をアサートする。rtshit0アサートは、すなわち、cacheadr[31:4](24)で示すアドレスの命令列をRTSバッファ0(1301)が格納し、RTSバッファ0(1303)がその命令列を出力できること(RTSバッファ0ヒット)を意味する。
ヒットビット0(1302)は、RTSバッファ0(1303)が格納する命令列のヒット有無(1:ヒット有、0:ヒット無し)を格納し、格納した値をhit0(信号ライン1312)に出力する。ヒットビット0(1302)の初期値は0で、rsthit0(1313)のアサートでセット、rstupdt0(1314)のアサートでリセットされる。
ANDゲート(1325)は、サブルーチン復帰命令バッファアップデート信号rtsupdt(1105)とrtspnt[1]との論理積を、RTSバッファ1更新信号rstupdt1(信号ライン1334)に出力する。
RTSタグ1(1320)は、RTSバッファ1(1323)が格納する命令列のアドレスを保持する。rstupdt1(1334)のアサートで、itag[31:4](1109)の値を取り込み、保持している値をrtstag1[31:4](信号ライン1330)に出力する。
有効ビット1(1321)は、RTSバッファ1(1323)が格納する命令列の有効、無効の状態(1:有効、0:無効)を格納し、格納した値をv1(信号ライン1331)に出力する。有効ビット1(1321)の初期値は0で、rstupdt1(1334)のアサートで1にセットされる。
RTSバッファ1(1323)は、rstupdt1(1334)のアサートで、ibuf[127:0](1104)の値を取り込み、保持している値をrtsbuf1[127:0](信号ライン1335)に出力する。
比較器1(1324)は、cacheadr[31:4](24)とrtstag1[31:4](1330)とv1(1331)とを入力し、cacheadr[31:4](24)とrtstag1[31:4](1330)が一致し、かつv1(1331)が1の場合、信号ライン1333でRTSバッファ1ヒット信号rtshit1をアサートする。rtshit1アサートはすなわち、cacheadr[31:4](24)で示すアドレスの命令列をRTSバッファ1(1323)が格納し、RTSバッファ1(1323)がその命令列を出力できること(RTSバッファ1ヒット)を意味する。
ヒットビット1(1322)は、RTSバッファ1(1323)が格納する命令列のヒット有無(1:ヒット有、0:ヒット無し)を格納し、格納した値をhit1(信号ライン1332)に出力する。ヒットビット1(1332)の初期値は0で、rsthit1(1333)のアサートでセット、rstupdt1(1334)のアサートでリセットされる。
ORゲート(1340)は、rtshit0(1313)とrtshit1(1333)の論理和をrtshitor(信号ライン1350)に出力する。
ANDゲート(1343)は、rtshitor(1351)とcacheread(25)の論理積をサブルーチン復帰命令バッファヒット信号rtshit(信号ライン1106)に出力する。
rtshit(1106)アサートは、cacheadr[31:4](24)のエントリに対する、cacheread(25)アサートが示すキャッシュのリード要求に対して、RTSバッファ0(1303)、またはRTSバッファ1(1323)からリードデータを取り出せることを意味する。
セレクタ(1341)は、rtshit0(1313)、rtshit1(1333)を選択信号として入力し、rtsbuf0[127:0](1315)、rtsbuf1[127:0](1335)から1つを選択してrtsbufslctd(信号ライン1351)に出力する。rtshit0(1313)、rtshit1(1333)の値と選択される信号の関係は、
{rtshit0、rtshit1}=10:rtsbuf0[127:0]
{rtshit0、rtshit1}=01:rtsbuf1[127:0]
である。すなわち、セレクタ(1341)は、RTSバッファ0、RTSバッファ1のうち、ヒットしているRTSバッファの出力を選択する。
フリップフロップ(1344)は、rtsbufslctd(1351)を入力し、1サイクル後に入力値をサブルーチン復帰命令バッファリードデータrtsbufrd[127:0](信号ライン1107)に出力する。
RTS更新ポインタ生成回路(1342)は、hit1(1332)、hit0(1312)、v1(1331)、v0(1311)、を入力し、更新するRTSバッファを示すRTS更新ポインタ信号rtspnt[1:0](信号ライン1352)に出力する。なお、RTS更新ポインタ信号rtspnt[1:0](1352)の値と対応する意味は、
01:RTSバッファ0を更新
10:RTSバッファ1を更新
である。
RTS更新ポインタ生成回路(1342)の入力hit1(1332)、hit0(1312)、v1(1331)、v0(1311)と出力rtspnt[1:0](1352)との関係は、
{hit1、hit0、v1、v0}=1???→rtspnt[1:0]=10
{hit1、hit0、v1、v0}=01??→rtspnt[1:0]=01
{hit1、hit0、v1、v0}=000?→rtspnt[1:0]=10
{hit1、hit0、v1、v0}=0000→rtspnt[1:0]=01
上記以外 →rtspnt[1:0]=00
となる。なお、“?”は“don‘t care”を意味する。すなわち、まずヒットしているバッファを探し、ヒットしているバッファがない場合、次に無効なバッファを探すというアルゴリズムで更新するバッファを選択する。
図14における先読みアドレス生成部(1101)の詳細な説明に先立ち、先読みアドレス生成部(1101)が解読する分岐命令列について、図15を用いて説明する。
図15は、本実施の形態において想定しているNo.1〜No.3の3命令からなる分岐命令列である。なお、No.1の命令は32ビット命令であるため、16ビット命令換算だと4命令に相当する。
No.1に示す“MOVIS20 #imm20、Rn”は、20ビットの即値(命令コードの23〜16、11〜0ビット)を8ビット左シフトしてレジスタRnに格納する命令である。なお、Rnのnはレジスタ番号で、命令コードの26〜23ビットで示す。また、本実施の形態において想定するCPUが備えるレジスタは16本とし、レジスタ番号nの範囲は0〜15である。
No.2に示す“ADD #imm8、Rn”は、8ビットの即値(命令コードの7〜0ビット)をレジスタRnが格納する値と足し合わせ、その結果をRnに格納する命令である。
No.3に示す“JSR @Rn”は、サブルーチンへの分岐命令で、分岐先アドレスはレジスタRnに格納された値である。
No.1〜No.3の命令順かつ、各命令のレジスタ番号が一致する場合、28ビット範囲の任意のアドレスへのサブルーチン分岐が実行される。このような条件を満たす分岐命令列を「有効な分岐命令列」と定義する。
図14は、先読みアドレス生成部(1101)の詳細を示す構成図である。
先読みアドレス生成部(1101)は、命令プリデコーダ0(1400)、命令プリデコーダ1(1401)、・・・、命令プリデコーダ7(1407)と、ORゲート(1431)、プライオリティーエンコーダ(1410)、セレクタ(1411)、命令順判定回路(1412)、レジスタ番号一致判定回路(1413)、先読み要求生成回路(1415)、即値抽出回路(1414)、加算器(1416)、ORゲート(1433)、立ち上がりエッジ検出回路(1418)とを備える。
ibuf[127:0]は、16ビット毎に区切られ、それぞれ、命令プリデコーダ0(1400)、命令プリデコーダ1(1401)、・・・、命令プリデコーダ7(1407)とに入力される。
命令プリデコーダ0(1400)には、ibuf[127:0]が出力するエントリの命令列における先頭アドレスの命令が入力される。命令プリデコーダ0(1400)は、入力された命令がJSR命令であった場合、jsr[7:0](信号ライン1420)のうちのjsr[0]をアサートする。
命令プリデコーダ1(1401)も同様に、ibuf[127:0]が出力するエントリの命令列における2番目の命令をデコードして、結果をjsr[1]に出力する。
さらに3番目、4番目、・・・、6番目の命令またはデータも同様にその種類がデコードされる。
そして、命令プリデコーダ7(1407)も同様に、ibuf[127:0]が出力するエントリの命令列における8番目の命令をデコードして、結果をjsr[7]に出力する。
ORゲート(1431)は、jsr[7:0]の各ビットの論理和を演算し、結果をjsror70(信号ライン1430)に出力する。以上に述べた構成により、ibuf[127:0]が出力するエントリの命令列の中に一つでもJSR命令が存在すれば、jsror70がアサートされる。
ORゲート(1433)は、jsr[7:1]の各ビットの論理和を演算し、結果をjsror71(信号ライン1432)に出力する。
立ち上がりエッジ検出回路(1418)は、jsror71(1432)の立ち上がりエッジを検出し、立ち上がりエッジ検出と同じタイミングで1サイクル間サブルーチン復帰バッファ更新信号rtsupdt(1105)をアサートする。
以上に述べた構成により、ibuf[127:0]が出力するエントリの命令列の先頭から、7番目の命令中に一つでもJSR命令が存在すれば、サブルーチンからの復帰に備え、復帰先の命令を含む命令列をサブルーチン復帰命令バッファに退避すべく、サブルーチン復帰バッファ更新信号rtsupdt(1105)をアサートする。なお、ibuf[127:0]が出力するエントリの命令列の最後の命令がJSR命令だった場合、その命令列に復帰先の命令は含まれないため、復帰に備えた退避は意味がない。以上の理由から、ibuf[127:0]が出力するエントリの命令列の先頭から、7番目の命令中にJSR命令が存在すれば、rtsupdt(1105)をアサートする。
プライオリティーエンコーダ(1410)は、jsr[7:0](1420)をエンコードした結果をinst_sel[2:0](信号ライン1421)に出力する。プライオリティーエンコーダ(1410)の入力と出力との関係は、
10000000→000
?1000000→001
??100000→010
???10000→011
????1000→100
?????100→101
??????10→110
???????1→111
上記以外 →000
である。なお、“?”は“don‘t care”を意味する。
セレクタ(1411)は、inst_sel[2:0](1421)を選択信号として入力し、ibuf[175:0]から64ビットを選択した結果をibuf_slctd[63:0](信号ライン1422)に出力する。inst_sel[2:0](1421)の値と選択されるibuf[175:0]のビットの関係は、
inst_sel[2:0]=000:ibuf[63:0]
inst_sel[2:0]=001:ibuf[79:16]
inst_sel[2:0]=010:ibuf[95:32]
inst_sel[2:0]=011:ibuf[111:48]
inst_sel[2:0]=100:ibuf[127:64]
inst_sel[2:0]=101:ibuf[143:80]
inst_sel[2:0]=110:ibuf[159:96]
inst_sel[2:0]=111:ibuf[175:112]
である。
以上述べた、命令プリデコーダ0(1400)、命令プリデコーダ1(1401)、・・・、命令プリデコーダ7(1407)、プライオリティーエンコーダ(1410)、セレクタ(1411)の構成により、ibuf[175:0]に格納される命令列から、JSR命令を最後とする連続4命令を選択し、ibuf_slctd[63:0](1422)に出力する。また、ibuf[175:0]にJSR命令が複数存在する場合は、先頭に近い方のJSR命令を含む4連続命令が選択される。
命令順判定回路(1412)は、ibuf_slctd[63:0](1422)に出力された命令列が、前述した図15で説明した分岐命令列の命令順を満たしているかを検出し、命令順を満たしている場合、order_hit(信号ライン1423)をアサートする。
レジスタ番号一致判定回路(1413)は、ibuf_slctd[63:0](1422)に出力された命令列から、図15で説明した分岐命令列の命令順を想定して、3命令のレジスタ番号をそれぞれ抽出し、レジスタ番号がすべて一致した場合index_hit(信号ライン1424)をアサートする。
即値抽出回路(1414)は、ibuf_slctd[63:0](1422)に出力された命令列から、図15で説明した分岐命令列の命令順を想定して、“MOVIS20 #imm20、Rn”の即値を抽出後、8ビット左シフト、上位ビット0拡張を施し、結果をimm0[31:0](信号ライン1425)に出力する。また同様に“ADD #imm8、Rn”の即値を抽出後、上位ビット0拡張を施し、結果をimm1[31:0](信号ライン1426)に出力する。
加算器(1416)は、imm0[31:0](1425)とimm1[31:0](1426)とを加算し、演算結果を先読み命令のアドレスを示す先読みアドレス信号pfadr[31:0](信号ライン30)に出力する。
先読み要求生成回路(1415)は、先読み要求を受け付けたことを示すpfack(31)、命令バッファ上位ビット有効信号ibvh(1108)、jsror70(1430)、inst_sel[2:0](1421)、order_hit(1423)、index_hit(1424)を入力し、先読み要求信号pfreq(29)のアサート、ネゲートを行う。pfreq(29)のアサート、ネゲートの条件を以下に示す。
アサート条件は、
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=1_111_1_1_1‥(1)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=1_110_1_1_1‥(2)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=1_101_1_1_1‥(3)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=?_100_1_1_1‥(4)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=?_011_1_1_1‥(5)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=?_010_1_1_1‥(6)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=?_001_1_1_1‥(7)
{ibvh、inst_sel[2:0]、jsror70、order_hit、index_hit}=?_000_1_1_1‥(8)
である。
ネゲート条件は、
pfack=1
である。
なお、“?”は“don‘t care”を意味する。アサート条件(1)〜(3)は、分岐命令列の一部がibuf[175:127]に含まれる場合、命令バッファ上位ビット有効信号ibvh(1108)が1、すなわち、ibuf[175:0]が連続した11命令を含むことをアサート条件とすることで、誤った先読み要求を抑止するためのものである。
以上述べた構成により、先読みアドレス生成部(1101)は、ibuf[175:0]に出力される命令列から有効な分岐命令列を検出し、分岐先アドレスの先読み要求を制御部(1111)に出力する。
次に、本実施の形態の情報処理装置の動作を説明する。
図16は、以上説明した本発明の実施形態における情報処理装置の動作を示すタイミングチャートである。図17は、メモリ上のプログラム配置の例を示したものである。エントリ8に有効な分岐命令列が存在し、またエントリ100にはサブルーチン復帰命令(RTS命令)が存在する。図16で示すタイミングチャートは、図17で示すプログラムを実行する情報処理装置の動作である。
サイクル1で、エントリ8が最初にヒットし、それを受け続くサイクル2にて、制御部(1111)は、命令バッファ(1103)にエントリ8を格納するため、ibufupdtをアサートする。
次に、サイクル3で、先読みアドレス生成部(1101)は、ibuf[127:0]からエントリ8に存在する有効な分岐命令列を検出、pfreqをアサートし、先読みアドレス1008をfpadr[31:0]に出力する。また同サイクルで、サブルーチンからの復帰に備えて、現在ヒットしている分岐命令を含むエントリをサブルーチン復帰命令バッファに退避するべく、rtsupdt信号をアサートする。ここで現在ヒットしている分岐命令を含むエントリをサブルーチン復帰命令バッファに退避することで、サブルーチン実行によりキャッシュが更新され、復帰先のエントリがキャッシュにない場合でも、サブルーチン復帰命令バッファから命令列を読み出すことができる。
次に、サイクル4で制御部(1111)は、アドレス1008の先読み要求を受け、memadrにエントリ63を出力、memreadをアサートし、メモリ(4)に対してエントリ63へのリード要求を出す。同サイクルで、制御部(3)からのpfackアサートを受け、pfreqをネゲートする。また同サイクルで、rtsupdtを受け、サブルーチン復帰命令バッファにおける、RTSタグ1にエントリ0が、RTSバッファ1にエントリ0の命令列が格納される。
次に、サイクル6にて、サイクル4にて先読みを行ったエントリ63のリードデータがメモリ(4)からmemrd[127:0]に出力され、信号は記載していないが、制御部(1111)はmemrd[127:0]をキャッシュに格納する制御信号を出力し、次サイクルでエントリ63がキャッシュに格納される。
次に、サイクル7で、エントリ8に存在するサブルーチンへの分岐命令の分岐先アドレス1008へのアクセスが発生するが、サイクル4にてアドレス1008を先読みしていたため、キャッシュミスによるペナルティーが発生しない。
引き続きサブルーチンのプログラムが実行され、サイクルnの時点では、サブルーチンがキャッシュに登録され、エントリ8は既にキャッシュには存在していないものとする。
次に、サイクルn+2で、エントリ100に存在するRTS命令が実行され、アドレス138へのアクセスが発生するが、サイクル4にて復帰先エントリをRTSバッファ1に退避していたため、RTSバッファ1がヒットし、キャッシュミスによるペナルティーは発生しない。
図18は、有効な分岐命令列が2つのエントリをまたがり存在するケースの、先読みアドレス生成部(1101)の動作を示すタイミングチャートである。図19は、有効な分岐命令列がエントリ8とエントリ9にまたがり存在するプログラム配置例を示したものである。図18で示すタイミングチャートは、図19で示すプログラムを実行する場合の、先読みアドレス生成部(1101)の動作である。
サイクル1で、エントリ8が最初にヒットし、それを受け、続くサイクル2にて、制御部(1111)は、命令バッファ(1103)にエントリ8を格納するため、ibufupdtをアサートする。
次に、ibufupdtアサートを受け、サイクル3にて、現命令タグにエントリ8が、現命令バッファにエントリ8の命令列が格納される。
プログラムが進み、サイクル7で、エントリ9が最初にヒットし、それを受け続くサイクル8にて、制御部(1111)は、命令バッファ(1103)にエントリ9を格納するため、ibufupdtをアサートする。
次に、ibufupdtアサートを受け、サイクル10にて、現命令タグにエントリ9が、現命令バッファにエントリ9の命令列が格納される。また同サイクルにて、前命令タグにエントリ8が、前命令バッファにエントリ8の命令列が格納される。このように、連続するエントリが、バッファ0とバッファ1にそれぞれ格納された結果、ibuf[175:0]に連続する11命令が出力され、ibvhがアサートされる。そして、先読みアドレス生成部(1101)は、ibuf[175:0]からエントリ8とエントリ9にまたがって存在する有効な分岐命令列を検出、pfreqをアサートし、先読みアドレス1008をfpadr[31:0]に出力する。
以上説明の通り、先読みアドレス生成部(1101)は2つのエントリにまたがる有効な分岐命令列を解読し、先読み要求を実行することができる。
図20は、プログラムの流れの例を示したもので、後に図21の説明に用いる。図20に示すプログラムは、メインルーチン→サブルーチン1→サブルーチン2→サブルーチン1→サブルーチン3→サブルーチン1→メインルーチンの順で実行される。
図20に示す直線の端点は、メインルーチン先頭、サブルーチンへの分岐命令、サブルーチンからの復帰命令、サブルーチンからの復帰先命令、メインルーチン終了を示し、端点近傍の一部には図21の説明で使用する対応アドレス(エントリ)を記載している。
図21は、図20で説明のプログラムの流れにおける、RTS命令バッファ更新の動作を示すタイミングチャートである。
まず、サイクル1からメインルーチンが開始される。メインルーチンが進み、サイクルm−2にてサブルーチン1への分岐命令を検出し、RTSバッファ更新信号rtsupdtがアサートされる。ここでRTS更新ポインタは“10”であるため、サイクルm−1にてRTSバッファ1にエントリ6の命令列が格納される。また同サイクルにて、有効ビット1に1がセットされ、RTSポインタの値が“01”となる。
次に、サイクルmからサブルーチン1が開始される。サブルーチン1が進み、サイクルn−2にてサブルーチン2への分岐命令を検出し、RTSバッファ更新信号rtsupdtがアサートされる。ここでRTS更新ポインタは“01”であるため、サイクルn−1にてRTSバッファ0にエントリ105の命令列が格納される。また同サイクルで、有効ビット0に1がセットされ、RTSポインタの値が“10”となる。
次に、サイクルnからサブルーチン2が開始される。サブルーチン2が進み、サイクルo−1にてRTS命令が実行される。
次に、サイクルoからサブルーチン1に復帰し、同サイクルで、RTSバッファ0がヒットする。続くサイクルo+1にて、ヒットビット0に1がセットされ、RTSポインタの値が“01”となる。
サブルーチン1が進み、サイクルp−2にてサブルーチン3への分岐命令を検出し、RTSバッファ更新信号rtsupdtがアサートされる。ここでRTS更新ポインタは“01”であるため、サイクルp−1にてRTSバッファ0にエントリ107の命令列が格納される。また同サイクルで、有効ビット0に1が、またヒットビット0に0がセットされRTSポインタの値が“10”となる。
次に、サイクルpからサブルーチン3が開始される。サブルーチン3が進み、サイクルq−1にてRTS命令が実行される。
次に、サイクルqからサブルーチン1に復帰する。同サイクルで、RTSバッファ0がヒットする。続くサイクルq+1にて、ヒットビット0に1がセットされ、RTSポインタの値が“01”となる。
次に、サイクルrからメインルーチンに復帰する。同サイクルで、RTSバッファ1がヒットする。続くサイクルr+1にて、ヒットビット1に1がセットされ、RTSポインタの値が“10”となる。
以上説明のRTS更新アルゴリズムでは、更新したRTSバッファは必ずヒットし、またヒットしたRTSバッファは再利用されない、というRTSバッファの特性に合わせた効率の良いRTSの更新を行う。
以上より、本実施の形態によれば、少量のハードウエアで効果的な分岐命令先読み、およびサブルーチン復帰に備えた命令バッファの更新を実現し、高性能な情報処理技術を低価格で提供することができる。
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
1…CPU、2…先読みアドレス生成部、3…制御部、4…メモリ、5…キャッシュ、6…セレクタ0、7…データバッファ、8…命令バッファ、9…INTC、10…セレクタ1、201…先読み要求ステートマシン、202…アドレス演算部、203…ORゲート、210〜217…命令プリデコーダ0〜命令プリデコーダ7、401…2ビット左シフタ、402…加算器、403…セレクタ0、404…退避PC保持レジスタ、405…セレクタ1、401…INTVEC保持レジスタ、1101…先読みアドレス生成部、1102…サブルーチン復帰命令バッファ、1103…命令バッファ、1111…制御部、1201…現命令バッファ、1202…前命令バッファ、1203…現命令タグ、1204…前命令タグ、1205…加算器、1206,1207,1221…ドライバ、1208…比較器、1220…フリップフロップ、1300…RTSタグ0、1301…有効ビット0、1302…ヒットビット0、1303…RTSバッファ0、1304…比較器0、1305…ANDゲート、1320…RTSタグ1、1321…有効ビット1、1322…ヒットビット1、1323…RTSバッファ1、1324…比較器1、1325…ANDゲート、1340…ORゲート、1341…セレクタ、1342…RTS更新ポインタ生成回路、1343…ANDゲート、1344…フリップフロップ、1400…命令プリデコーダ0、1401〜1407…命令プリデコーダ1〜命令プリデコーダ7、1410…プライオリティーエンコーダ、1411…セレクタ、1412…命令順判定回路、1413…レジスタ番号一致判定回路、1414…即値抽出回路、1415…先読み要求生成回路、1416…加算器、1418…立ち上がりエッジ検出回路、1431…ORゲート、1433…ORゲート。