パイプライン型コンピュータプロセッサの設計において、パイプラインストールとは、ハザードを解決するために命令の実行を遅延させることである。[ 1 ]
標準的な5段パイプラインでは、デコード段階で、制御ユニットは、デコードされた命令が、現在実行中の命令が書き込むレジスタから読み取られるかどうかを判断します。この条件が満たされる場合、制御ユニットは命令を1クロックサイクル停止させます。また、フェッチ段階でも命令を停止させ、その段階の命令がプログラムの次の命令によって上書きされるのを防ぎます。[ 2 ]
パイプラインで現在フェッチされている命令を決定するためにプログラムカウンタ(PC)レジスタを使用するフォン・ノイマン・アーキテクチャでは、デコード段階で命令が停止したときに新しい命令がフェッチされるのを防ぐために、 PCレジスタの値とフェッチ段階の命令が保持され、変更が防止されます。これらの値は、競合を引き起こしている命令が実行段階を通過するまで保持されます。[ 3 ] このようなイベントは、流体パイプ内の気泡になぞらえて、しばしばバブルと呼ばれます。
一部のアーキテクチャでは、パイプラインの実行ステージは、すべてのサイクルで常に何らかの処理を実行する必要があります。そのような場合、バブルは、実行ステージにNOP(「何もしない」)命令を送り込み、バブルが実行ステージを通過するまで処理を続けることで実装されます。
以下は、4段階パイプラインを通して同じ4つの命令を2回実行した結果ですが、何らかの理由で、サイクル#2で紫色の命令のフェッチが遅延し、バブルが発生して、その後のすべての命令も遅延します。
以下の例は、5つのステージ(IF = 命令フェッチ、ID = 命令デコード、EX = 実行、MEM = メモリアクセス、WB = レジスタライトバック)を持つ古典的なRISCパイプラインにバブルを挿入した例を示しています。この例では、最初の命令のMEMステージ(第4ステージ)の後に利用可能なデータが、2番目の命令のEXステージ(第3ステージ)への入力として必要となります。バブルがない場合、EXステージ(第3ステージ)は前のEXステージの出力にしかアクセスできません。したがって、バブルを追加することで、データを時間的に遡って伝播させる必要なく(これは不可能です)、時間依存性を解消できます。