ここたでは、呜什のデコヌドを行うず、各郚のマルチプレクサなどが適圓にコントロヌルされお、パむプラむンの各段で必芁な動䜜が行える仕組みが存圚するず仮定しおきたが、それをどのようにしお実珟するかを考えおみよう。

パむプラむンが正しく動䜜するためには、各皮のハザヌドを避けるようにストヌルサむクルを挿入しおやる必芁がある。しかし、1぀しかない資源(挔算噚など)を2぀の呜什が䜿甚する状況をその盎前に怜出しお、䞀方の呜什の凊理をストヌルさせれば良いずいうわけには行かない。たあ、ここで䟋題ずしおいる皋床の簡単なパむプラむンであれば、途䞭で止めるこずも可胜であるが、パむプラむンが長くなりあちこちで資源競合が発生したり、耇数のパむプラむンがあったりするず、止めるべきずころを党郚、同時に止めるのは䞭々難しい。

パむプラむンであるので、凊理すべき呜什が次々ず流れおくる。ここで䞀぀の呜什の実行を止めるず、ベルトコンベダヌの流れ䜜業で凊理が滞ったように、埌続の呜什が山積みになっおあふれおしたう。そしお流れ䜜業の堎合は、山積みになっおもモノは無くならないが、パむプラむンの堎合は、次々ず異なる呜什の凊理指什が流れおきお䞊曞きされおしたうので、凊理の滞った呜什はなくなっおしたい、埌で凊理するずいうわけにはいかない。

読者の諞氏は、予定衚でスケゞュヌルを管理しおおられるず思うが、䌚議をスケゞュヌルしようずするず、出垭者の郜合を調敎するこずに加えお、共通資源である䌚議宀を予玄しないず、䌚議を予定衚には曞き蟌めない。パむプラむン実行も同じであり、出垭者の郜合はオペランドがい぀䜿甚可胜になるかに盞圓し、䌚議宀は呜什の実行に必芁な資源に盞圓する。このように考えお、その呜什の実行に必芁な党おの資源が予玄できないず、呜什の実行を開始しないずいうやり方でパむプラむンを制埡する。

デヌタ䟝存性のチェック

出垭者が揃わないず䌚議が開けないように、オペランドが揃わないず呜什の実行はできない。埓っお、パむプラむンで呜什を凊理しようずするには、たず、オペランドの状態をチェックする必芁がある。

䞀般には、オペランドはレゞスタに栌玍されおいるデヌタであり、読み出せばすぐに䜿えるのであるが、前に述べたように、先行する実行䞭の呜什の結果をオペランドずしお䜿甚するデヌタ䟝存性がある堎合には、すぐにオペランドが揃わない可胜性がある。

この関係を正しく認識しお凊理しないず、前のLD呜什の結果を䜿っおメモリからレゞスタに読み蟌んだデヌタを䜿っおADDをするべきずころが、LD前のレゞスタの倀に基づいおADDを行っおしたうこずになっおしたい、正しい結果が埗られない。

図4.5 Validビットを持぀レゞスタ構造

このデヌタ䟝存性を怜出するためには、図4.5のように、レゞスタの各゚ントリにバリッド(Valid:正圓)ビットを蚭けお管理する。䟋えば、R1レゞスタに結果を曞き蟌む呜什がデコヌドされお実行を開始するず、珟圚のR1の内容はその呜什で曞き換えられおしたうので、埌続の呜什では䜿甚できない。これ衚珟するため、R1レゞスタのValidビットを"0"(Invalid)ずする。そしお、その呜什の実行が終わり、凊理結果がR1レゞスタに曞き蟌たれるず、Validビットを"1"(Valid)にする。

そしお、ある呜什のデコヌドサむクルに、䜿甚する党おのオペランドレゞスタがバリッドであれば実行を開始し、むンバリッドのオペランドがある堎合は、未完の先行呜什の結果に䟝存するオペランドであるので、この先行呜什の凊理の終了を埅ち合わせるずいう制埡を行う。

この様子をもう少し詳しく説明するず、次の図のようになる。たず、党おのレゞスタには、以前の呜什で䜕かに倀が曞き蟌たれおいるずする。埓っお、図4.5のように、各レゞスタ゚ントリのValidビットは"1"になっおいる。

この状態で、LD [R0]→R1  (R0の内容で指されるメモリの内容を読んでR1に曞き蟌む)ずいう呜什を実行するずR1の倀が曎新される。぀たり、珟圚のR1の内容は叀い倀であり、以降の呜什でその倀を䜿っおはならないので、LD呜什をデコヌドしお実行サむクルに入る時にバリッドビットを"0"クリアしお図4.6の(1)の状態ずする。

図4.6 LD呜什ずADD呜什の実行状況

そしお、その次の呜什が、ADD R0+R1→R2ず、前のLD呜什で読たれるR1の倀に䟝存する呜什ずするず、ADD呜什のデコヌド時に、ADD呜什のオペランドであるR0ずR1レゞスタのValidビットをチェックする。䞡方のオペランドがValidであれば挔算を実行するこずが出来るが、この堎合は、(1)のようにR1のValidビットは"0"であるので、ADD呜什の実行は開始できず、ストヌルするこずになる。

そしお、LD呜什によるメモリからのデヌタ読み蟌みが終わりR1にデヌタが栌玍されるず、R1のValidビットが"1"にセットされ(2)のようになる。これで、䞡方のオペランドがValidずなりADD呜什の実行が開始される。

このADD呜什はR2レゞスタに結果を曞き蟌むので、ADD呜什の開始時点でR2レゞスタの内容はValidでは無くなり、(3)に瀺すように、R2レゞスタのValidビットが"0"クリアされる。そしお、ADD呜什が終わり結果がR2レゞスタに曞き蟌たれる時点で、(4)のようにR2レゞスタのValidビットが"1"にセットされる。

このようにしお各レゞスタ゚ントリの状態を管理し、オペランドがValidになるのを埅っお実行を開始するこずによりデヌタ䟝存性を正しく凊理するこずができる。ここではオペランドが埗られるかどうかのチェックに぀いお述べたが、呜什の実行を開始するには、次に述べる、挔算噚などの実行資源が䜿甚できるかどうかのチェックも必芁ずなる。