6

次の命令を正しく実行するには、何回のストールが必要ですか。私は自分がしたことに少し混乱しているので、専門家の回答を見るためにここにいます。

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 の値で動作することを意味します。

4

1 に答える 1

2

デコードする前にレジスタをレジスタファイルに書き戻すか、ライトバックステージからデコードステージにデータを転送できるようにするために、3番目のストールが必要になるようです。いずれにせよ、書き込まれるレジスタが に等しい場合、これを実行する必要がありますrs

デコード段階の早い段階で分岐が検出されるため、ストールが多すぎるように思われます。これは、とにかくフラッシュされる不要な命令のフェッチを節約できるため、良いことですが、それに伴う適切なハザード検出が必要です。

于 2012-12-30T18:47:44.440 に答える