図1は本発明のー実施形態の情報処理装置の全体図である。
本情報処理装置は、メモリ(1)、CPU(2)、先読みアドレス生成部(4)、先読みバッファ(7)、タグ(6)、リードデータ選択部(5)、制御部(3)から構成される。
メモリ(1)はプログラムを格納し、信号ライン11でメモリアドレス信号memadr[15:4]を、信号ライン12でメモリリード信号memrdを受け取り、信号ライン13でメモリリードデータ信号memdata[127:0]を出力する。
ここで、memadr[15:0]の表記は、memadr[15]、memadr[14]、・・・・、memadr[0]からなる16ビットの信号を表記上まとめて記述したものである。本明細書において、他の信号に関しても同様である。
なお、本実施形態では、メモリのアクセスレイテンシを2、読み出し幅を128ビットとする。
CPU(2)は、必要な命令コードをメモリ(1)などから読み出し、プログラムを実行する。図示しないが、メモリ等に格納されたデータに対して必要な数値演算、論理演算を行なうためのALU(算術演算ユニット)、プログラムカウンタ、アキュムレータ、汎用レジスタ等を備える演算部と、入力された命令をデコードすることによって前記演算部の動作制御信号を生成する動作制御部とを備える。
CPU(2)は、信号ライン14でCPU(2)がアクセスする対象である命令コードおよびデータのアドレスを示すCPUアドレス信号cpuadr[15:0]を、信号ライン16でCPUのアクセス種類を示すCPUコマンド信号cpucmd[1:0]を出力する。CPUコマンド信号の示すアクセスの種類は後述する。
CPU(2)は、さらに、信号ライン15でCPU(2)が現在実行している命令のアドレスを示すプログラムカウンタ信号pc[15:0]を先読みアドレス生成部(4)の演算用に出力する。先読みアドレス生成部(4)は、pc[15:0]と命令コード内の即値を用いて、分岐先のアドレスを得る。
CPU(2)には、さらに、cpuadr[15:0]が示すアドレスにある命令又はデータの読み出し値であるCPUリードデータ信号cpudata[15:0]が信号ライン17でリードデータ選択部(5)から入力される。
CPU(2)には、さらに、cpudata[15:0]が確定していない場合にCPUアクセスを停止するためのCPUウエイト信号cpuwaitが信号ライン18で制御部(3)から入力される。
なお、本実施形態では、CPU(2)の命令、データ幅、アドレス空間を、それぞれ、16ビットとする。
先読みアドレス生成部(4)は、先読みバッファ(7)に所定数の命令またはデータからなる命令列が格納されると、格納された命令列の中から分岐命令およびデータアクセス命令を、その命令が実行される前に検出し、それらの命令に従って次にアクセスするターゲットアドレスを演算し、そのターゲットアドレスが含まれる命令列をメモリ(1)から先読みバッファ(7)へ読み出す要求を生成する。
ここで、以後、本明細書中において、分岐命令およびデータアクセス命令を、要先読み命令と呼ぶ。また、要先読み命令に従って、次にアクセスするターゲットアドレスを演算し、そのターゲットアドレスが含まれる命令列をメモリ(1)から先読みバッファ(7)へ読み出す要求を先読み要求と呼ぶ。
先読みアドレス生成部(4)は、信号ライン19で要先読み命令のターゲットアドレスを示す先読みアドレス信号pfadr[15:0]を、信号ライン20で先読み要求が発生したことを示す信号である先読み要求信号pfreq[1:0]を制御部(3)に出力する。
先読みアドレス生成部(4)は、さらに、CPU(2)から、cpuadr[15:0]とpc[15:0]を、リードデータ選択部(5)から信号ライン21でヒットバッファ出力信号hbuf[127:0]を、制御部(3)から、信号ライン27で信号pfack、信号ライン28でhbuf[127:0]の入力タイミングを示す先読みアップデート信号pdupdを受け、pfadr[15:0]およびpfreq[1:0]の演算に用いる。pfackは、所定の命令列から抽出した要先読み命令に従って先読み要求を処理した後に、さらに同じ命令列内から要先読み命令を抽出して先読み要求を進める必要がある場合に出力される信号である。このpfackとhbufの詳細は、後述する。
先読みバッファ(7)は、CPU(2)が要先読み命令を実行する前に、当該要先読み命令のターゲットアドレスへのアクセスに備えて、当該要先読み命令のターゲットアドレスの命令またはデータをメモリ(1)から読み出して保持する。
先読みバッファ(7)は、信号ライン33で先読みバッファが保持している値の更新タイミングを示すバッファアップデート信号bufupd[4:0]の入力を受け、memdata[127:0]の信号を取りこむ。
また、先読みバッファ(7)は、信号ライン24でヒットしたバッファを示す先読みバッファ出力信号buf<4:0>[127:0]を出力する。ここで、buf<4:0>[127:0]は、buf4[127:0]、buf3[127:0]、..、buf0[127:0]の5本の信号を表記上まとめて記述したものである。
タグ(6)は、先読みバッファ(7)が保持する命令およびデータのアドレスを保持する。
タグ(6)は、信号ライン32でタグが保持している値を更新するタイミングを示すタグアップデート信号tagupd[4:0]の入力を受け、memadr[15:4]を取りこむ。
また、タグ(6)は、信号ライン23で先読みバッファが保持する命令およびデータのアドレスを示すタグ出力信号tag<4:0>[15:4]を出力する。ここで、tag<4:0>[15:4]は、tag4[15:4]、tag3[15:4]、..、tag0[15:4]の5本の信号を表記上まとめて記述したものである。
リードデータ選択部(5)は、先読みアドレス生成部(4)により先読み要求がなされた命令またはデータが、先読みバッファ(7)に保持されているか判定する。ここで、制御部(3)は、先読みアドレス生成部(4)により先読み要求がなされている場合、このリードデータ選択部(5)の判定に従って、先読みを実行するかどうか判断する。
また、リードデータ選択部(5)は、CPU(2)からアクセス要求のある命令またはデータが先読みバッファ(7)に保持されているか判定し、先読みバッファ(7)に保持されていれば、先読みバッファ(7)からCPUに出力する。
リードデータ選択部(5)は、tag<4:0>[127:0]とpfadr[15:0]の上位15〜4ビットであるpfadr[15:4]との比較結果を、信号ライン30で比較信号hit0[4:0]として、そして、tag<4:0>[127:0]とcpuadr[15:0]の上位15〜4ビットであるcpuadr[15:4]との比較結果を、信号ライン31で比較信号hit1[4:0]として出力する。これは、後述するように、15〜4ビットがエントリという命令およびデータを読み出す際の単位を指定するものであるためである。
リードデータ選択部(5)は、さらに、buf<4:0>[127:0]およびmemdata[127:0]の中から、先読みアドレス生成部(4)の演算に用いられるヒットバッファ出力信号hbuf[127:0]を、信号ライン21で先読みアドレス生成部(4)に出力する。
リードデータ選択部(5)は、さらに、buf<4:0>[127:0]およびmemdata[127:0]の中から、cpuadr[15:0]でアクセスを要求された命令およびデータを選択し、cpudata[15:0]に出力する。
制御部(3)は、CPU(2)、メモリ(1)、先読みアドレス生成部(4)、先読みバッファ(7)、タグ(6)、リードデータ選択部(5)と、制御信号を入出力することにより、CPU(2)とメモリ(1)との間の命令およびデータ転送に関わる制御を行なう。
具体的には、後述するように、各種の制御信号の入力を受けて、必要な制御信号を所定のタイミングでアサートすることにより、各部の処理を制御する。
次に、各構成の詳細を説明する。詳細の説明に先立ち、本実施形態において想定しているCPU(7)が実行するプログラムの一例、当該プログラムが、本実施形態においてメモリに格納される場合の配置、および、CPU(7)の動作について説明する。
図2に、CPU(1)が実行するプログラムの一例を示す。
本プログラムは、アドレス0から順にシーケンシャルに処理を行なう一般の命令と、所定のデータにアクセスすることを指示するデータアクセス命令と、条件が成立した場合に所定のアドレスに処理を移行する条件分岐命令と、無条件に所定のアドレスに処理を移行する無条件分岐命令とを有する。
本図において、一般の命令は「命令」、データアクセス命令は「MOV〜」、条件分岐命令は「BT〜」、無条件分岐命令は「BRA〜」と表す。
本図において、アドレス8の“MOV @(32,PC), R1”は、“この命令のアドレスに32を足したアドレスのデータをR1に転送する”という処理を実行させるデータアクセス命令を表し、この命令が実行されるとアドレス40にあるデータ20へのアクセスが発生する。同様に、アドレス22の“MOV @(20,PC), R1”が実行されると、アドレス42にあるデータ21へのアクセスが発生する。
アドレス18の“BT −18”は、“CPUのレジスタT=1の時、この命令のアドレスに(−18)を足したアドレスへ分岐する”という処理を実行させる条件分岐命令を表す。この命令が実行され、かつ、その時のCPUのレジスタT=1が成立している場合、アドレス0の命令へとプログラムの流れが移行する。
アドレス26の“BAR 102”は、“この命令のアドレスに102を足したアドレスへ分岐する”という処理を実行させる無条件分岐命令を表す、この命令が実行されると、無条件にアドレス128の命令へとプログラムの流れが移行する。
図3は、CPU(2)の動作を示すタイミングチャートである。
図3上段は、CPU(2)が実行する命令列の一例と、その命令列を処理する際のCPU(2)のパイプライン動作とを示したものである。
CPU(2)は、命令をメモリ(1)から読み込む命令フェッチ(IF)ステージ、命令をデコードする命令デコード(ID)ステージ、命令を実行する実行(EX)ステージ、メモリ(1)からデータを読み出すメモリアクセス(MA)ステージ、メモリ(1)への書きこみを行うライトバック(WB)ステージの5段パイプラインで1つの命令を処理する。
なお、メモリ(1)へのアクセスは、各命令のIFステージ、MAステージ、WBステージで発生する。また、IFステージ、IDステージ、EXステージは必ず実行されるが、MAステージ,WBステージは命令によって実行されない場合がある。本図においては、実行されない命令ステージは小文字で示している。
図3下段は、図3上段で示すパイプライン動作に対応して発生するCPU(2)の各入出力信号波形を示したものである。
本図において、サイクル0は、アドレス0の命令0のIFステージである。サイクル0では、CPU(2)からcpuadrに0が、またcpucmdに命令フェッチを示す信号(IF)が出力され、アドレス0にある命令へのアクセスが発生する。
なお、本実施形態では、CPU(2)のアクセス種類を示すCPUコマンド信号cpucmd[1:0]の出力値とアクセス種類との対応は、
2‘b00:アクセス無し(NOP)
2‘b01:命令フェッチ(IF)
2‘b10:メモリアクセス(MA)
と定義されている。
続くサイクル1で、サイクル0のアクセスに対するアドレス0の命令がcpudataからCPU(2)に入力される。
ここで、サイクル4は、アドレス2のデータアクセス命令“MOV @(14,PC), R1”のMAステージである。本命令は、アドレス16(=14+2)に格納されているデータをR1に転送するというものであるため、ここでは、CPU(2)からcpuadrに16が、また、cpucmdにMAが出力され、アドレス16にあるデータへのアクセスが発生する。
サイクル5は、サイクル4のアクセスに対するデータが、メモリの出力遅延等の要因で確定しない状況を示している。この時、制御部(3)は、cpuwaitをアサートし、CPU(2)に命令処理の中断を指示する。
続くサイクル6にてデータが確定し、cpuwaitのネゲートを受けて、CPU(2)は、処理を再開する。
サイクル8は、アドレス8の分岐命令“BRA 56”のEXステージであるとともに、分岐先のアドレス64にある命令32のIFステージである。本サイクルでは、CPU(2)からcpuadrに64が、またcpucmdにIFが出力され、アドレス64にある命令へのアクセスが発生する。
次に、図3のプログラムを実行する際の、メモリ(1)の動作を説明する。図4は、図3のプログラム実行時のメモリ(1)の動作を示すタイミングチャートである。
サイクル0にて、制御部(3)が、memadrに0を出力し、memrdをアサートすることで、メモリ(1)に対してアドレス0へのリード要求を出す。本実施形態では、メモリのアクセスレイテンシは2サイクルと設定されているため、このアクセスに対するデータは、サイクル2にて確定し、ここで、メモリ(1)は、memdataに命令またはデータを出力する。
要先読み命令を先読みする構成無しに、このようなアクセスレイテンシ2を持つメモリ(1)に,図2で示すプログラムを格納して実行すると、図12に示すように、メモリアクセス毎にCPUに対してcpuwaitを1サイクルアサートすることになり、性能が低下する。
図5は、本実施形態における図2で示したプログラムをメモリ(1)に格納する場合の、命令およびデータの配置を模式的に示したものである。
本図に示すように、プログラムを構成する命令およびデータは、アドレスの小さい順にビットの大きい側から順番に配置され、8の命令(またはデータ)単位で1エントリを構成する。以後、1エントリを構成する命令またはデータの列を命令列と呼ぶ。
なお、本実施形態においては、メモリ(1)へのアクセスは、エントリ単位で行われる。例えば、アドレス0,2,4,6、8、10、12、14に対するアクセスは、エントリ0へのアクセスとして同時に行なわれる。
このようなメモリ(1)に16ビット幅の命令あるいはデータを格納する場合、アドレスの各ビットは以下を区別する役割を持つ。
ビット15〜4:エントリ
ビット3〜1:同一エントリ内の命令あるいはデータの位置
ビット0:命令あるいはデータの上位8ビット、下位8ビット
次に、このようなプログラム、CPUの動作、メモリの命令およびデータの格納状況等を前提に、図1に基づいて説明した、タグ(6)、先読みバッファ(7)、リードデータ選択部(5)、および、先読みアドレス生成部(4)の詳細を以下に説明する。
図6は、タグ(6)および先読みバッファ(7)の詳細図である。本実施形態では、5つのバッファを先読みバッファ(7)として備える構成を例にあげ、説明する。もちろん、バッファ数はこれに限られない。
タグ(6)は、12ビット幅の記憶素子tagi0、tagi1、..、tagi4から構成される。
tagi0、tagi1、..、tagi4は、それぞれ、tagupd[0]、tagupd[1]、..、tagupd[4]のアサートタイミングでmemadr[15:4]の出力を取りこみ、取りこんだ値をtag0[15:4]、tag1[15:4]、..、tag4[15:4]に出力する。
先読みバッファ(7)は、128ビット幅の記憶素子bufi0、bufi1、..、bufi4から構成される。
bufi0、bufi1、..、bufi4は、それぞれ、bufupd[0]、bufupd[1]、..、bufupd[4]のアサートタイミングでmemdata[127:0]の出力を取りこみ、取りこんだ値をbuf0[127:0]、buf1[127:0]、..、buf4[127:0]に出力する。
tagi0、tagi1、..、tagi4は、それぞれ、bufi0、bufi1、..、bufi4に格納された命令列のエントリを記憶する。
図7は、リードデータ選択部(5)の詳細図である。
リードデータ選択部(5)は、比較器0(301)、比較器1(302)、3ビット記憶素子(305)、5ビット記憶素子(306)、セレクタ0(303)、および、セレクタ1(304)から構成される。
比較器0(301)はtag<4:0>[15:4]とpfadr[15:4]との比較を行い、その結果をhit0[4:0]に出力する。
hit0[4:0]の各ビットは以下の論理式で演算される。
hit0[$i]=(tag$i[15:4]==pfadr[15:4])
$i=0、1、2、3、4
hit0[4:0]は、リードデータ選択部(5)において、先読みアドレス生成部(4)から先読み要求のあるエントリが、先読みバッファ(7)に保持されているか否かを判定(先読みバッファヒット判定)した結果を示す信号である。以下、保持されている場合をバッファヒット、保持されていない場合をバッファミスヒットと呼ぶ。また、保持されている場合において、バッファn(n=0、1、2、3、4)に保持されているとき、先読みバッファnヒットと呼ぶ。
ここで、制御部(3)は、入力されたhit0[4:0]の結果により、先読みアドレス生成部(4)から受け付けた先読み要求に従って先読みを実行するかどうかを判断する。すなわち、制御部(3)は、バッファヒット時は、先読みを実行せず、バッファミスヒット時は先読みを実行するよう制御する。
例えば、hit0[0]=1の場合、先読みが要求されているエントリは既にbufi0に保持されていることを意味し(先読みバッファ0ヒット)、あらためて先読みの必要はない。
本実施形態においては、このように先読みの要求があるターゲットアドレスの先読みバッファヒット判定を行なう。すなわち、先読みを実際に行なう前に先読みバッファ(7)に当該アドレスの命令が含まれるエントリが既に格納されているか否か判定する。このような先読み制御により、無駄な先読みを抑止することができる。
比較器1(302)はtag<4:0>[15:4]とcpuadr[15:4]との比較を行い、その結果をhit1[4:0]に出力する。
hit1[4:0]の各ビットは以下の論理式で演算される。
hit1[$i]=(tag$i[15:4]
==cpuadr[15:4])
$i=0、1、2、3、4
hit1[4:0]は、リードデータ選択部(5)において、CPU(2)からアクセス要求がある命令またはデータを含むエントリが、先読みバッファ(7)に保持されているか否かを判定(先読みバッファヒット判定)した結果を示す信号である。バッファヒット、バッファミスヒット、先読みバッファnヒットの定義は、hit0[4:0]の場合と同様である。
制御部(3)は、入力されたhit1[4:0]の結果により、CPU(2)からのアクセス要求に対する命令またはデータを、先読みバッファ(7)から読み出すか、メモリ(1)から読み出すかを判断する。すなわち、制御部(3)は、バッファヒット時は、先読みバッファ(7)から読み出し、バッファミスヒット時はメモリ(1)から読み出すよう制御する。
例えば、hit1[0]=1(先読みバッファ0ヒット)の場合、アクセス要求がある命令またはデータを含むエントリはbufi0に保持されていることを意味する。この場合、制御部(3)は、bufi0の出力buf0[127:0]からアクセス対象である命令またはデータを選択してCPU(2)に出力する。
このように、本実施形態では、先読みバッファ(7)にアクセス対象が保持されていれば、そこからCPU(2)に命令またはデータを出力することにより、高速なアクセスを実現している。
以上に述べたようなバッファヒット時における先読みバッファ出力buf<4:0>[127:0]から命令またはデータを選択する処理は、3ビット記憶素子(305)、5ビット記憶素子(306)、セレクタ0(303)、セレクタ1(304)によって行われる。
3ビット記憶素子(305)は、CPU(2)のクロックと同期して動作するフリップフロップであり、cpuadr[3:1]の入力を受け、信号ライン310で信号cpuadr1[3:1]を出力する。
5ビット記憶素子(306)は、CPU(2)のクロックと同期して動作するフリップフロップであり、hit1[4:0]の入力を受け、信号ライン311で信号hit11[4:0]を出力する。
リードデータ選択部(5)では、3ビット記憶素子(305)および5ビット記憶素子(306)を用い、上記のようにcpuadr[3:1]、hit1[4:0]を一旦フリップフロップで受け、1サイクル後に同じ値をcpuadr1[3:1]、hit11[4:0]に出力することで、cpuadr1[3:1]、hit11[4:0]の出力を、CPUアクセスの1サイクル後であるリードデータ出力タイミングに同期させる。
セレクタ0(303)は、hit11[4:0]をセレクト信号とし、buf0[127:0]、buf2[127:0]、..、buf4[127:0]、および、memdata[127:0]から選択した信号をhbuf[127:0]に出力する。
ここで、hit11[4:0]の値と選択される信号との関係は、
5‘b00001:buf0[127:0]
5‘b00010:buf1[127:0]
5‘b00100:buf2[127:0]
5‘b01000:buf3[127:0]
5‘b10000:buf4[127:0]
上記以外 :memdata[127:0]
とする。
これにより、セレクタ0(303)において、バッファヒット時は、ヒットしたバッファの出力が、バッファミスヒット時は、memdata[127:0]が選択される。
セレクタ1(304)は、hbuf[127:0]が出力するエントリに含まれる命令列の中からcpuadr1[3:1]が指す命令またはデータの一つを選択し、cpudata[15:0]に出力する。
次に、先読みアドレス生成部(4)の詳細を説明する。図8は、先読みアドレス生成部(4)の詳細図である。
先読みアドレス生成部(4)は、入力された命令の種類をデコードする8つの命令種デコーダ、すなわち、命令種デコーダ0(200)、命令種デコーダ1(201)、..、命令種デコーダ7(207)と、8つのANDゲート、すなわち、ANDゲート0(250)、ANDゲート1(251)、..、ANDゲート7(257)と、8つの命令種フラグ、すなわち、命令種フラグ0(230)、命令種フラグ1(231)、..、命令種フラグ7(237)と、ターゲット命令選択部(280)と、アドレス演算部(270)と、アドレス記憶部(280)とを備える。
hbuf[127:0]は、16ビット毎に区切られ、それぞれ、命令種デコーダ0(200)、命令種デコーダ1(201)、..、命令種デコーダ7(207)に入力される。
例えば、命令種デコーダ0(200)には、hbuf[127:0]が出力するエントリの命令列における先頭アドレスの命令またはデータが入力される。命令種デコーダ0(200)は、入力された命令またはデータの種類をデコードして、その結果を信号ライン(210)で信号pd0[1:0]として出力する。
なお、出力信号pd0[1:0]の意味は、
2‘b01: アドレス演算部(270)で
ターゲットアドレスが演算可能なデータアクセス命令
2‘b10: アドレス演算部(270)で
ターゲットアドレスが演算可能な条件分岐命令
2‘b11: アドレス演算部(270)で
ターゲットアドレスが演算可能な無条件分岐命令
2‘b00:上記以外の命令またはデータ
と定義されている。
命令種デコーダ1(201)も同様に、hbuf[127:0]が出力するエントリの命令列における2番目の命令またはデータの種類をデコードして、結果を信号ライン(211)で信号pd1[1:0]として出力する。
さらに3番目、4番目、..、6番目の命令またはデータも同様にその種類がデコードされる。そして、命令種デコーダ7(207)も同様に、hbuf[127:0]が出力するエントリの命令列における8番目の命令またはデータの種類をデコードして、結果を信号ライン(217)で信号pd7[1:0]として出力する。
pd0[1:0]、pd1[1:0]、..、pd7[1:0]はそれぞれ命令種フラグ0(230)、命令種フラグ1(231)、..、命令種フラグ7(237)に、制御部(3)が出力するpdupd(23)がアサートされるタイミングで保持される。
命令種フラグ0(230)、命令種フラグ1(231)、..、命令種フラグ7(237)に保持された値は、それぞれ、信号ライン240で信号ifa0[1:0]として、信号ライン241で信号ifa1[1:0]として、..、また、信号ライン242で信号ifa7[1:0]として出力される。
ターゲット命令選択部(280)は、ifa0[1:0]、ifa1[1:0]、..、ifa7[1:0]、および、hbuf[127:0]の入力を受けて、入力された信号が示す命令種に従って、hbuf[127:0]が出力するエントリの命令列からターゲットアドレスを演算すべき要先読み命令を選択し、信号ライン260で信号tinst[15:0]として出力する。
例えば、図5のエントリ0の命令列が入力された場合は、命令4のデータアクセス命令が選択され、エントリ1の命令列が入力された場合は、命令9の分岐命令が選択される。
ターゲット命令選択部(280)は、さらに、入力されたpc[3:1]を用いて、CPU(2)が現在実行している命令のアドレスを得、選択する命令を現在実行している命令のアドレス以降のアドレスの命令に限定する。
ターゲット命令選択部(280)は、さらに、pfreq[1:0]として、選択した命令の種類を出力する。ここで、出力信号pfreq[1:0]の意味は、pd0[1:0]、pd1[1:0]、..、pd7[1:0]の意味と同じであり、2‘b00以外の値で先読みアドレス生成部(4)から先読み要求があることを示す。
ここで、制御部(3)は、先読みアドレス生成部(4)から入力されたpfreqの値に従い、pfackをアサートする。
制御部(3)におけるpfreqの値とpfackアサートの有無の関係は以下の通りである。
pfreq[1:0]=2‘b01:pfackをアサート。
pfreq[1:0]=2‘b10:pfackアサートなし。
pfreq[1:0]=2‘b11:pfackアサートなし。
pfreq[1:0]=2‘b01の場合、その時点で選択されている命令はデータアクセス命令である。従って、エントリ内のデータアクセス命令以降の命令は、必ず実行される。このため、エントリ内のこのデータアクセス命令以降の命令に関しても、要先読み命令の有無を判定し、あれば、先読み要求をする必要がある。
pfreq[1:0]=2‘b10の場合、その時点で選択されている命令は条件分岐命令である。従って、エントリ内のこの条件分岐命令以降の命令が実行されるか否かは、この条件分岐命令がCPU(2)において実行されなければ判断できない。すなわち、この条件分岐命令の次の命令のIDステージで分岐しなかったことが確定する。その時点では、PCの値がこの条件分岐命令の次の命令のアドレスとなり、後述するように、ターゲット命令選択部(280)において、その条件分岐命令はマスクされ、エントリ内の当該条件分岐命令以降の命令に対し、要先読み芽例の有無が判定される。
pfreq[1:0]=2‘b11の場合、その時点で選択されている命令は、無条件分岐命令である。従ってエントリ内のこの無条件分岐命令以降の命令は実行されない。このため、以降の命令に対して命令種を判定したり、先読みの要否の検討を行なう必要はない。
ターゲット命令選択部(280)は、さらに信号ライン261で選択した命令のエントリ内の位置を示す信号padec[7:0]を出力する。
ここで、padec[7:0]の意味は、
8‘b00000001:先頭の命令を選択
8‘b00000010:2番目の命令を選択
・・・・
8‘b10000000:8番目の命令を選択
と定義されている。
padec[7:0]の各ビットとpfackとの論理積をANDゲート0(250)、ANDゲート1(251)、..、ANDゲート7(257)を用いて生成し、信号ライン220で命令種フラグ0のクリア信号clr0を、信号ライン221で命令種フラグ1のクリア信号clr1を、..、信号ライン227で命令種フラグ7のクリア信号clr7を出力する。
このように、アサートされたpfackを用いて、現在選択している命令の命令種フラグをクリアし、以降のタイミングでその命令が選択されないようにすることができる。すなわち、同じエントリ内で現在選択している命令以降の命令から、その後の要先読み命令を選択できる。
アドレス記憶部(290)は、先読みアドレス生成部(4)が現在、演算の対象としている命令列を含むエントリ値を保持する。具体的には、アドレス記憶部(290)は、pdupdのアサートタイミングでcpuadr[15:4]の出力値を保持し、信号ライン(263)でその保持している値をアドレス信号adr[15:4]に出力する。
アドレス演算部(270)は、先読みアドレス生成部(4)が、現在、演算の対象としている命令列に含まれる要先読み命令のターゲットアドレスを演算して出力する。具体的には、アドレス演算部(270)は、入力されたpadec[7:0]と、tinst[15:0]と、adr[15:4]とから、先読みターゲットアドレス信号pfadr[15:4]を演算し出力する。pfadr[15:4]は、tinst[15:0]で出力されている要先読み命令のターゲットアドレスが含まれるエントリを示す。
次に、ターゲット命令選択部(280)の構成の詳細を説明し、先読みが必要な要先読み命令の選択方法を示す。図9はターゲット命令選択部(280)の詳細図である。
本図に示すように、pc[3:1]はデコーダ(562)により
3‘b000−>8’b11111111
3‘b001−>8’b11111110
3‘b010−>8’b11111100
3‘b011−>8’b11111000
3‘b100−>8’b11110000
3‘b101−>8’b11100000
3‘b110−>8’b11000000
3‘b111−>8’b10000000
と、8ビットにデコードされ、信号ライン570で選択マスク信号mask[7:0]として出力される。
そして、iaf0[1:0]の各ビットの論理和をmask[0]でマスクした結果は、複合ゲート0(500)を介して信号s[0]として出力される。iaf1[1:0]、..、iaf7[1:0]についても、iaf0[1:0]と同様に各ビットの論理和を、それぞれ、mask[1]、..、mask[7]でマスクした結果が複合ゲート1(501)、..、複合ゲート7(501)を介して信号s[1]、..、信号s[7]としてそれぞれ出力される。
出力された信号s[7:0]は優先順位判定回路(563)に入力され、予め定められた以下の対応関係に従い、padec[7:0]として出力される。
ここで、優先順位判定回路(563)の入力と出力の対応関係は以下のとおりである。
8‘b???????1−>8‘b00000001
8‘b??????10−>8‘b00000010
8‘b?????100−>8‘b00000100
8‘b????1000−>8‘b00001000
8‘b???10000−>8‘b00010000
8‘b??100000−>8‘b00100000
8‘b?1000000−>8‘b01000000
8‘b10000000−>8‘b10000000
上記以外 ―>8‘b00000000
なお“?”は“don‘t care”を意味する。すなわち、1、0どちらであってもよいという意味である。
この優先順位判定回路563により、エントリ内の1番最初に実行される要先読み命令がpadec[0]として出力される。また、本構成により、pc[3:1]によって示される現在CPU(2)において実行されている命令以前の命令は、mask[0]・・・mask[7]により信号sの出力が0となるため、この優先順位判定回路563において選択されない。
優先順位判定回路563から出力されたpadec[0]は、hbuf[127:112]をANDゲート00(540)においてマスクするために用いられ、その結果は、信号ライン550でtinst0[15:0]に出力される。
hbuf[111:96]、..、hbuf[15:0]、についても、hbuf[127:112]と同様に、padec[1]、..、padec[7]でマスクした結果を、ANDゲート01(541)、..、ANDゲート07(547)により、それぞれ、tinst1[15:0]、..、tinst7[15:0]に出力する。
iaf0[1:0]をpadec[0]でマスクした結果をANDゲート10(510)により信号ライン520でpfreq0[1:0]に出力する。
iaf1[1:0]、..、iaf7[1:0]、についても、iaf0[1:0]と同様に、padec[1]、..、padec[7]でマスクした結果を、ANDゲート11(511)、..、ANDゲート17(512)により、それぞれ、pfreq1[1:0]、..、pfreq7[1:0]に出力する。
tinst0[15:0]、..、tinst7[15:0]は、ORゲート0(560)により論理和が演算され、結果がtinst[15:0]に出力される。そして、pfreq0[1:0]、..、pfreq7[1:0]は、ORゲート1(561)により論理和が演算され、結果がpfreq[1:0]に出力される。
以上、図9を用いて説明した回路によりtinst[15:0]には、hbuf[127:0]が出力するエントリの命令列の中で、CPUが現在実行している命令以降のアドレスに格納され、かつ、最初に実行される要先読み命令が出力される。また、pfreq[1:0]には、tinst[15:0]に出力された命令の種類が出力される。
以上の構成により、先読みアドレス生成部(4)は、バッファに格納されたエントリに含まれる命令列から確実に実行される分岐命令およびデータアクセス命令を1サイクルで検出し、制御部(3)に対してそのターゲットアドレスの先読み要求を出力することができる。
具体的には、先読みアドレス生成部(4)はエントリに含まれる命令列の種類をデコードしそれぞれ命令種フラグ0(230)、..、命令種フラグ7(232)にセットする。実行している命令のアドレス信号を用いて既に実行が終わった命令種フラグの出力をマスクする。優先順位判定回路(563)はマスクされた命令種フラグの出力からターゲットアドレスの先読み要求を出す命令の位置を出力する。そして、制御部(3)からのpfack信号により、ターゲットアドレスへの先読み要求を出した命令に対応する命令種フラグをクリアする。
ここで、ターゲット命令選択部(280)で選択される命令は、命令種をデコードしているエントリのうち、現在実行している命令のアドレス以降の命令で、最初に実行される要先読み命令である。そして、選択された要先読み命令がデータアクセス命令の場合は、さらに当該命令以降の命令においても要先読み命令の有無を判定し、要先読み命令があれば、同様の手順で選択する。選択された要先読み命令が条件付分岐命令の場合は、当該選択された命令が実行され、分岐が行なわれず以降の命令が実行されることになった場合、当該以降の命令において同様に要先読み命令の有無を判定し、要先読み命令があれば、選択する。選択された要先読み命令が無条件分岐命令の場合、以降の命令に対しては、何も行なわない。
なお、最も先の分岐命令だけを解釈しそのターゲットアドレスが含まれるエントリのみを知る構成の場合、選択された命令がデータアクセス命令または条件付分岐命令の場合であっても、次の分岐またはデータアクセス命令まで解釈できない。
また、本実施形態においては、pfreqによって当該命令がデータアクセス命令と指定された場合、制御部(3)は、pfackを出力し、先読みアドレス生成部(4)内の命令種フラグ(230)〜(237)に保存されている結果を消去し、そのエントリ内の以降の命令のみを対象として要先読み命令の処理を行なうことができる。
本構成により、本実施形態の先読みアドレス生成部(4)は、同じエントリ内の要先読み命令による先読みアドレスを、必要十分なだけ効率的に生成することができる。
次に、ターゲット命令選択部(280)によって選択された要先読み命令のターゲットアドレスが含まれるエントリを抽出する演算について、以下に説明する。図10はアドレス演算部(270)の詳細図である。
アドレス加算値解読部(601)は、tinst[15:0]に出力された要先読み命令より、その命令自身のアドレスとターゲットアドレスとの相対値を示す即値を切りだし、信号ライン610で相対アドレス信号reladr[7:0]に出力する。なお、本実施形態で説明するCPUの要先読み命令の即値は8ビットとする。
エンコーダ(602)は、padec[7:0]を3ビットにエンコードし、信号ライン611にベースアドレス信号baseadr[3:1]を出力する。
ここで、エンコーダ(602)の入力と出力の関係は以下のとおりである。
8‘b00000001−>3’b000
8‘b00000010−>3’b001
8‘b00000100−>3’b010
8‘b00001000−>3’b011
8‘b00010000−>3’b100
8‘b00100000−>3’b101
8‘b01000000−>3’b110
8‘b10000000−>3’b111
上記以外−>3‘b000
加算器(603)は、
reladr[7:0]+baseadr[3:1]
+{adr[15:4]、4‘b0000}
の演算を行い、演算結果の15〜4ビットをpfadr[15:4]に出力する。
なお、pfadr[15:4]と、ターゲット命令選択部(280)から出力されるpfreq[1:0]とを受け取った制御部(3)は、その組み合わせに応じて以下の制御を行なう。
pfreq[1:0]=2‘b01:エントリpfadr[15:4]へのデータアクセスに備えた先読み要求を行なう。
pfreq[1:0]=2‘b10:エントリpfadr[15:4]の条件分岐に備えた先読み要求を行なう。
pfreq[1:0]=2‘b11:エントリpfadr[15:4]への無条件分岐に備えた先読み要求を行なう。
pfreq[1:0]=2‘b00:先読み要求なし。
次に、本実施形態の情報処理装置の動作を説明する。
図11は以上説明した本発明の実施形態における情報処理装置の動作を示すタイミングチャートである。ここで、本タイミングチャートは、図2に示すプログラムを、図5の通りにメモリに格納して実行した例である。
まずサイクル0において、CPU(2)は、アドレス0の命令0のフェッチを行う。この時点では先読みバッファ(7)には何も格納されていないので、リードデータ選択部(5)からのヒット信号hit1[4:0]はバッファミスを示す。
次にサイクル1において、バッファミスを示す信号を受けた制御部(3)は、memadrに“0”を出力するとともに、memrdをアサートし、メモリ(1)に対してエントリ0へのアクセスを開始する。同時に、cpuwaitをアサートし、データが確定するまでCPU(2)のメモリ(1)へのアクセスを停止する要求を出す。
次にサイクル2において、制御部(3)は、エントリ0の格納場所を先読みバッファ(7)のbufi0とし、対応するタグ(6)のtagi0にエントリ0を示す“0”を格納するため、引き続きmemadrに“0”を出力し、tagupdにtagi0を更新する信号を出力する。
次にサイクル3において、メモリ(1)はmemdataにエントリ0の命令とデータとを含む128ビット幅の命令列を出力する。リードデータ選択部(5)は、hbufにmemdataを選択し、エントリ0の命令列を出力する。さらに、リードデータ選択部(5)は、hbufからアドレス0の命令0を選択し、cpudataに出力する。
制御部(3)は、cpudataが確定したので、cpuwaitをネゲートし、CPU(2)にメモリ(1)へのアクセスの再開許可を伝達する。
さらに、制御部(3)は、memdataに出力されたエントリ0の命令列をbufi0に格納するため、bufupdにbufi0を更新する信号を出力する。
サイクル1−3にて説明したtagi0、bufi0への制御の通り、先読みバッファ(7)の更新はメモリ(1)へのアクセスと一体となって行われ、メモリ(1)へのアクセス、タグ(6)の更新、先読みバッファ(7)の更新の順に一連の動作が実行される。以降説明する先読みバッファ(7)の操作も同様の手順で行われる。
さらに、制御部(3)は、将来エントリ1がアクセスされることに備え、memadrに“1”を出力し、またmemrdをアサートし、メモリ(1)に対しエントリ1へのアクセスを開始する。
リードデータ選択部(5)は、エントリ0へのアクセスは次サイクルにおいてbufi0から出力することが可能であるので、ヒット信号hit1にバッファ0ヒットを出力する。
さらに、リードデータ選択部(5)は、memdataからアドレス0の命令0を選択し、cpudataに出力する。
CPU(2)は、アドレス0の命令0をcpudataから取りこむと同時に、アドレス2の命令1のフェッチを行う。
次にサイクル4において、リードデータ選択部(5)は、hbufにbuf0を選択し、bufi0に格納されているエントリ0の命令列を出力する。さらに、リードデータ選択部(5)は、hbufからアドレス2の命令1を選択し、cpudataに出力する。
CPU(2)は、アドレス2の命令1をcpudataから取りこむと同時に、アドレス2の命令1のフェッチを行う。
以降、サイクル10まで続くエントリ0にある命令の命令フェッチは、以上述べた命令1のフェッチと同様、bufi0を介してアクセスする。すなわち、必要な命令は、メモリ(1)からではなく、高速な先読みバッファ(7)から取得する。これにより、メモリ(1)のアクセスレイテンシによるアクセスの中断がなく、処理が高速に実行される。またこの間は、命令フェッチによるメモリ(1)へのアクセスが発生しないため、制御部(3)は、将来のアクセスに備えて、命令列の先読みを行うことができる。
ここで、制御部(3)は、バッファ0にあるエントリ0の要先読み命令の実行前にその命令のターゲットアドレスの演算を行うことを先読みアドレス生成部(4)に指示するため、pdupdをアサートする。
次にサイクル5において、先読みアドレス生成部(4)は、図8にて説明した回路によりアドレス8の命令“MOV @(32,PC)、R1”を検出し、ターゲットアドレスの先読みを要求する命令の種類がデータアクセスであることを示す“1”、およびターゲットアドレスが含まれるエントリを示す“5”を、pfreq、pfadrにそれぞれ出力する。
この時点で、先読みバッファ(7)にエントリ5は格納されていないので、リードデータ選択部(5)からのヒット信号hit0[4:0]は、バッファミスを示す。バッファミスを示す信号を受けた制御部(3)は、メモリ(1)に対しエントリ5へのアクセスを開始し、続くサイクル6、7において、bufi2にエントリ5の命令列を格納するため、tagupdおよびbufupdにtagi2、bufi2を更新する信号を出力する。
ここで、同サイクルでターゲットアドレスの先読みを要求する命令として選択されたアドレス8の命令は、データアクセス命令である。このため、制御部(3)は、エントリ0のアドレス8以降の要先読み命令のターゲットアドレスの先読み要求を先読みアドレス生成部(4)に指示するため、pfackをアサートする。
次にサイクル6において、先読みアドレス生成部(4)は、前サイクルのpfackのアサートを受けて、アドレス8の命令の種類を格納していた命令種フラグ4をクリアする。その結果、命令種フラグ0〜7の格納値は全て0となり、先読みアドレス生成部(4)は、pfadr、pfreqにそれぞれ0を出力する。
この結果、制御部(3)は、エントリ0のアドレス8以降には、要先読み命令はないことがわかる。
次にサイクル9において、CPU(2)は、アドレス8の命令“MOV @(32,PC)、R1”に伴うメモリアクセス(MA)をcpumdに出力する。このメモリアクセスに備えて、サイクル5においてエントリ5をbufi2に先読みしてあるため、CPU(2)は、メモリアクセスのレイテンシによるアクセスの中断なしに、次のサイクル10にてターゲットアドレスのアドレス40のデータ20にアクセスできる。
次にサイクル11において、CPU(2)はアドレス16の命令8のフェッチを行う。この命令フェッチに備えてサイクル2においてエントリ1をbufi1に先読みしてあるため、CPU(2)は、メモリアクセスのレイテンシによるアクセスの中断なしに、次のサイクル12にてターゲットアドレスのアドレス16の命令8にアクセスできる。
以降、サイクル16まで続くエントリ1にある命令の命令フェッチは、以上述べた命令8のフェッチと同様に、先読みバッファ(7)内のbufi1にアクセスすることにより、メモリ(1)のアクセスレイテンシによるアクセスの中断なしに、高速に実行することができる。またこの間、命令フェッチによるメモリ(1)へのアクセスが発生しないため、制御部(3)は、将来のアクセスに備えて先読みを行うことができる。
次にサイクル12において、制御部(3)は、バッファ1にあるエントリ1の要先読み命令の実行前にその命令のターゲットアドレスの演算を行うよう先読みアドレス生成部(4)に指示するため、pdupdをアサートする。
次にサイクル13において、先読みアドレス生成部(4)は、図8にて説明した回路によりアドレス18の命令“BT −18”を検出し、先読みを要求する命令が条件分岐命令であることを示す“2”、および、ターゲットアドレスのエントリ“0”をpfreq、pfadrにそれぞれ出力する。このとき、先読みバッファbufi0にエントリ0が格納されているので、エントリ0の先読み要求に対しリードデータ選択部(5)からのヒット信号hit0[4:0]は、バッファ0ヒットを示すものとなる。
バッファ0ヒットを示す信号を受け、制御部(3)は、このアドレス18の命令“BT −18”のターゲットアドレスの先読みを実行しない。
本実施形態では、制御部(3)は、前述のアルゴリズムに従い、先読み要求を受けたアドレス18の命令より以降の要先読み命令のターゲットアドレス先読み要求を先読みアドレス生成部(4)に指示するためのpfackのアサートを行わない。
次にサイクル14において、CPU(2)は、pcに“20”を出力する。これを受け、先読みアドレス生成部(4)は、図8および図9にて説明した回路によりアドレス18の命令“BT −18”に対応した命令種フラグの出力をマスクする。そして、次のデータアクセス命令であるアドレス22の命令“MOV @(20,PC)、R1”を検出し、先読み要求する命令がデータアクセス命令であることを示す“1”、およびターゲットアドレスのエントリ“5”をpfreq、pfadrにそれぞれ出力する。
ここで、先読みバッファbufi2にエントリ5は既に格納されているので、リードデータ選択部(5)からのヒット信号hit0[4:0]は、バッファ2ヒットを示すものが出力される。
バッファ2ヒットを示す信号を受け、制御部(3)は、この命令“MOV @(20,PC)、R1”のターゲットアドレスの先読みを実行しない。
さらに、制御部(3)は、同サイクルで先読みを要求するアドレス22の命令がデータアクセス命令であるため、それ以降の要先読み命令のターゲットアドレスの先読み要求を先読みアドレス生成部(4)に指示するため、pfackをアサートする。
次にサイクル15において、先読みアドレス生成部(4)は、図8にて説明した回路によりアドレス26の命令“BRA 102”を検出し、先読み要求する命令が無条件分岐命令であることを示す“3”、およびターゲットアドレスのエントリ“8”を、pfreq、pfadrにそれぞれ出力する。
この時点で、先読みバッファにエントリ8は格納されていないので、リードデータ選択部(5)からのヒット信号hit0[4:0]は、バッファミスを示すものが出力される。
バッファミスを示す信号を受けた制御部(3)は、メモリ(1)に対しエントリ8へのアクセスを開始し、続くサイクル16、17にてbufi4にエントリ8の命令列を格納するため、tagi4、bufi4を更新する信号を出力する。
次にサイクル17にて、CPU(2)は、アドレス22の命令“MOV @(20,PC)、R1”に伴うメモリアクセスを出力する。このメモリアクセスに備えてサイクル5においてエントリ5をbufi2に先読みしてあるため、メモリアクセスのレイテンシによるアクセスの中断なしに、CPU(2)は、次のサイクル18においてターゲットアドレスのデータ(アドレス42のデータ21)にアクセスできる。
次にサイクル18において、CPU(2)は、アドレス26の命令“BRA 102”に伴い、プログラムの流れをアドレス128に無条件に移行し、アドレス128の命令64のフェッチを行う。
この命令フェッチに備えてサイクル15においてエントリ8をbufi4に先読みしてあるため、CPU(2)は、メモリアクセスのレイテンシによるアクセスの中断なしに、次のサイクル19にてターゲットアドレスのデータ(アドレス128の命令64)にアクセスできる。
以上述べたように、本実施形態の情報処理装置では、プログラム実行サイクルが20となり、図12に示す本発明を使用しない場合の実行サイクル36と比較して、サイクル数において性能が80%向上している。
本実施形態によれば、1サイクルで先読みバッファ(7)に格納されたエントリに含まれる命令列から分岐命令およびデータアクセス命令を検出し、そのターゲットアドレスの先読みを行なうことができる。このため、先読みがターゲットアドレスへのアクセスに間に合わずバッファミスが発生し、性能が落ちることが少なくなる。
本実施形態によれば、ターゲットアドレスの先読みを行う命令の種類により、その命令より以降の分岐命令およびデータアクセス命令のターゲットアドレスの先読みを行うかどうかを制御している。また、現在実行している命令のアドレスを示す信号を用いて、既に実行が終わった分岐命令およびデータアクセス命令のターゲットアドレスの先読みを抑止し、今後実行される分岐命令およびデータアクセス命令に限定してターゲットアドレスの先読みを実施する。
このため、確実に実行される分岐命令およびデータアクセス命令に実行されるに限定して、しかも、適切な順序でターゲットアドレスの先読みを実施することができる。これにより、無駄な先読みのメモリアクセスにより必要なメモリアクセスが妨害されて性能が落ちることが少なくなる。
なお、本実施形態に記載した各種の回路構成は、本実施形態を説明するための一例に過ぎない。上記記載の入出力が可能ならば、本実施形態の回路構成に限られない。
以上より、本実施形態によれば、分岐命令およびデータアクセス命令の先読みを効果的に行い、高性能な情報処理装置を提供することが出来る。
1…メモリ、2…CPU、3…制御部、4…先読みアドレス生成部、5…リードデータ選択部、6…タグ、7…先読みバッファ、200〜207…命令種デコーダ、230〜237…命令種フラグ、270…アドレス演算部、280…ターゲット命令選択部、290…アドレス記憶部