次の命令を正しく実行するには、何回のストールが必要ですか。私は自分がしたことに少し混乱しているので、専門家の回答を見るためにここにいます。
lw $1,0($2);
beq $1,$2,Label;
分岐が発生するかどうかのチェックは、デコード段階で行われることに注意してください。ただし、この場合 $1 である beq のソース レジスタ rs は、lw 命令のライトバック ステージの後に更新されます。そのため、新しいデータをメモリ ステージのメモリから beq 命令のデコード ステージに転送する必要があります。
ステージは次のようになります。
IF: 命令フェッチ。ID: 命令のデコード Ex: 実行/ALU ステージ MEM: メモリからのデータの読み取り WB: デスティネーション レジスタへのデータの格納
これは私がこれまで行ってきたことです。
lw が exec 段階で beq がデコード段階にあるとき、ストール条件が true になり、バブルが作成されます。現在、lw は Mem 段階にあり、beq はバブルのためにまだデコード段階にあります。再びストール状態が真になり、2 番目のストールが発生しました。現在、lw は WB (ライトバック) にあり、beq はデコード段階にありますが、値はまだです。 of $1 は WB ステージの最後に更新されますが、これは最終的に beq が間違った $1 の値で動作することを意味します。