2011年2月5日土曜日

CPUの設計 2

先のblogに書いたように、instruction queueは2 stage FIFOが元になっている。
下図で左側が2 stage FIFOの概略を示している。このFIFOはpipeline型の構造に
なっており、instruction queueではstg1の入力部にdecorderを追加している。



stg1出力のridx1,2,3はregister 番号で命令のREG1,2,3である。opcは命令の
operation code (bit31~28)の値、xx_opcは各命令のsub operation code
だ。tadrは現在出力している命令の番地であり、命令のtagとして使用してい
て、exec unitのPC (program counter)の値と常に比較されている。分岐命
令実行等でPCの値が更新された場合は、tadrとの比較結果が不一致になる。
tadrとPCの不一致が検出されるとinstruction queueの内容は破棄されると
共にaddress counterにPCの値がloadされ、IBUSのその番地の命令が
instruction queueにreadされる。つまり、refillが行われる。instruction
queueのrefillが完了するまでexec unitは待ち状態になる。f_xxxはone hot
のflag情報であり、f_regは演算対象がregisterであることを示す。f_r1pr3,
 f_r2pr3はridx1またはridx2が直前の命令のridx3と同じ場合に1になる。
exec unitのALU部を下図に示す。各演算の結果をそのままregister fileへの
入力とすると、組合せ論理が深くなりtimingをmetさせるのが厳しくなって
しまうため、F/Fで受けて、その出力をregister fileの入力としている。



この場合、latencyが2に増加してしまうため、例えば

   add r3,r2,r1
   add r5,r4,r3

のように直前の演算結果を次の命令で使用するような場合に不都合がでてしまう。
f_r1pr3, f_r2pr3はその様な場合に使用される信号で上図に示すとおり、信号が1
の場合、register fileのr1v, (r2v)ではなく、演算結果F/Fの値をr1v(r2v)として
ALUの入力に戻す。f_r1pc, f_r2pcはridx1またはridx2がPCを指している事を示
す信号である。通常動作ではPCとtadrの値は一致しているのでf_r1pcまたは
f_r2pcの値が1の場合はPCの代わりにtadrの値をr1vまたはr2vに出力するように
して、PCのfanoutを増加させないようにしている。

PC (program counter)
zumi32はおそらく世の中の全てのCPUがそうであるように命令空間の番地の小さ
い方から大きい方へと命令を実行していく、つまりPCの値は連続して単調増加する。
BR等命令で明示的にPCの値を書換える場合や、外部からの割込みやaddress error
等の例外時は不連続な値になる。割込みの場合は現在実行中の命令は破棄され、
PCの現在値がEPC registerに転送されPCはinterrupt vector address値に更新さ
れる。割込み処理を行うsoftwareは処理の最後でPCにEPCの値を戻すことで、
zumi32は破棄された番地から処理を再開する。こう書くと簡単な感じがするが、
実行中の命令がPCの値を更新するような命令だったり、load/store系の命令だった
り、分岐の遅延slotの命令実行時だったりした場合は、単純に行かない。例えば、
load/store系で、DBUS空間内に何らかの要因を表すstatus registerがあり、
それをreadすることで要因が0に解除されるような仕様の場合、そのregisterの
load命令実行中の割込み時、zumi32はその命令を破棄するとは言っても、DBUSで
はそのregisterに対するread transactionは実行されているため割込みから復帰
して処理を再開した時点では要因は既に解除されてしまっているといったことに
なる恐れがある。遅延slotの命令実行中の割込みも厄介だ。遅延slotの命令は言
わば幻のようなもので、その時点でPCの値は分岐先に更新されているから、ここ
で割込みを受け付けてしまうと、割込みからの復帰は分岐先であり破棄された命
令の再実行は果たせない。
以上の理由から、実行中の命令がPCの値を更新するような命令だったり、load/
store系の命令だったり、分岐の遅延slotの命令実行時だったりする場合は割込み
を受け付けないようにしている。これは割込み要求信号をmaskするのではなくて、
PCの記述でinterrupt vector addressの代入部の優先順位を他よりも低くすること
で実現している。















0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...