Last update $Id$
(c) 2007 BakaOyaji

パイプライン実行の検討2

もう少し,パイプライン処理の挙動を考えることにしましょう.今度は割り込みの場合です.例によって,PICmicro Mid-Range MCU Family Reference Manual(文書番号33023A)を参考にします.11.4 TMR0 InterruptのFigure 11-4: TMR0 Interrupt Timingがだいぶ 判りやすく書かれています.本物のPIC16は4相クロックですが,しぶとく単相クロックで動作させることを考えると,下のFig5みたいになるでしょ う.
Pipeline処理その2
ちなみに,信号名と意味は下表のようになります。

信号名
 意味
int_in 割り込み入力
gie_N 割り込みのイネーブル
interrupt_N
上記2つの信号のAND(CPUへの割り込み信号)
sample_N interrupt_Xのサンプリングポイント
pc_N ProgramCounter
Fetched_N フェッチされた命令
Executed_N 実行される命令

まずは、Fig.5-1 の通常の命令(分岐命令以外)での、割り込み応答サイクルで す。注目は,CYCLE=2であらわしているサイクルです.このサイクルは割り込み応答サイクルと考えられるでしょう.割り込み応答サイクルで行うべきこ とは、割り込みのイネーブル信号gieのリセットとISR(割り込みサービスルーチン)へのサブルーチンコールです.サブルーチンコールなので,PCの値 もスタックに退避しておかなければなりません.また,プログラムカウンタは,順調にインクリメントされるわけで,インストラクションレジスタの 「Flush」が必要です.Fig5では,PICのデータブックにあわせ,「Dummy」としていますが,要は,分岐の際の処理と同じ,と考えれて強制NOPを実行するようにすればよいはずで す.
プログラムカウンタの値は,PC→ PC+1→ PC+1→0004(ISRのベクタ)と変化して生きます.PC+1→ PC+1のところは,割り込みとかがなければ,PC+1→ PC+2と変化するはずですので,PC+1 → PC+1を、GOTO $と同様に、「分岐」していると考えれば(ちょっとこじつけっぽいですね),分岐したときは,つぎのサイクルは,強制NOPという前のページに書いたのと同じ処理で,CYCLE=2,3のDummyサイクルを実現できそ うです.

次に、分岐命令と割り込みが同時に起きた場合です。Inst(PC) が分岐命令の場合が,Fig5-2になります.CYCLE=1で分岐命令が実行されるので,CYCLE=2でのプログラムカウンタの値は,分岐先になり, 割り込み処理ルーチンからの復帰の際はこのアドレスに戻ってこなければなりません.この図では、GOTO命令ですが、CALL命令でもCALLの復帰アド レスをスタックに積む動作は、CYCLE=1のところで実行されるはずなので問題はなさそうです。

割り込みの発生と,割り込みをマスクをする命令の実行が重なった場合, 気をつけなければならないです.Fig.5-3のように動作すればいいと思います.この場合は,割り込みルーチンへの分岐は起きませんが,1Cycle のダミーサイクルが挿入されます.たぶん,実際のPICでも同じだと思うのですがちょっと調べようがありません.

次に,SKIP系の命令の場合を考えます.
Sikpと割り込みSKIP 命令の動作は,命令のフェッチに関しては,通常の命令とまったく変わらず,SKIPする場合は,フェッチした命令を破棄する(強制的にNOPにする)こと で実現しています.このとき同時にインタラプトが起きると注意が必要 です。
割り込みが起きた場合は,ISR処理が終了し,元のスレッドに復帰してくるときに,元スレッドでスキップしなかった場合は,(割り込みが起きた時のPC) +1に,元スレッドでスキップした場合は,(割り込みが起きた時のPC)+2に復帰しなくてはなりません.スキップの条件を,復帰するときまで保存してお いて、ISRからの復帰時にPC+1に戻るかPC+2に戻るか決める方法もありますが、あまりよいやり方とは思えないので,割り込み処理ルーチンに分岐す る際に,スタックに積むリターンアドレスをPC+1またはPC+2に変えてやるようにします。
具体的には,Fig5-4,5-5のように動作すればよさそうです.PC+2の「+2」のために特別にハードウェアを用意するのはもったいない(実は+1 と共用できますが)ので,CYCLE=2のとき,プログラムカウンタの値をホールドするのをやめ,普通にインクリメントさせます。ISRにサブルーチン コールする際にスタックに積むリターンアドレスは、CYCLE=2の時のアドレスですのでこれで望むアドレスになりそうです。

これで,パイプラインの挙動に対する考察はだいたい終わりだと思います.プログラムカウンタ,インストラクションレジスタ,インタラプトコントローラもだ いたいどんな機能を持たせるかもだいたい決まりました.

なお、このページの波形表示はVeritakを使って、Verilog-HDLのソースコードをシミュレーションしたものです。ソースコードと Veritakプロジェクトを置いておきます。まあ、本流の使い方ではないですが、Verilogでこんな使い方もあるということで・・・
右クリックで、「ターゲットをセーブ」




<<前に戻る   Index へ  次へ>>