パターソン&ヘネシーの本:
しかし、これをEXハザードとして扱うことはできません。
MEMステージで転送が行われるのはなぜですか?そしてどうやって?1つのストールで(2回目の追加では、次のEXでEXの結果が必要になります)?
パターソン&ヘネシーの本:
しかし、これをEXハザードとして扱うことはできません。
MEMステージで転送が行われるのはなぜですか?そしてどうやって?1つのストールで(2回目の追加では、次のEXでEXの結果が必要になります)?
使用したドキュメントhttp://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html
「ダブルデータハザード」(元のルール)を考慮する前に、EXおよびMEMハザード条件を書き直します(簡単にするために!= 0の部分を削除します)。
EXハザード
if (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRs) # =EX_h_Rs
) ForwardA = 10
if (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRt) # =EX_h_Rt
) ForwardB = 10
数式を短くするために、条件EX_h_RsとEX_h_Rtを呼び出します
MEMハザード(元の状態)
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd == ID/EX.RegisterRs)) ForwardA = 01
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd == ID/EX.RegisterRt)) ForwardB = 01
====
そして、同時に(1番目と3番目)と(2番目と3番目)の間の2つのタイプのハザードを同時に使用した例:
add $1, $1, $2
add $1, $1, $3
add $1, $1, $4
または(プロムレムサイクルは**
上下にマークされています)
**
add C+A -> A ... A
v ?
add B+A -> A
v
add C+ A -> A
**
私のリンクによると、二重のEX + MEMハザードを考慮した後:(!= 0および並べ替えられたブール項なしで)、MEMハザードのルールを更新しました:
「二重の」データハザードに対処するために、MEMハザードの転送条件を修正しましょう。
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRs) and
not (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRs))
)
ForwardA = 01
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRt) and
not (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRt))
)
ForwardB = 01
または、EX_h_*の短いレコードを使用して同じ
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRs) and
not ( EX_h_Rs )
)
ForwardA = 01
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRt) and
not ( EX_h_Rt )
)
ForwardB = 01
つまり:
MEM/WBからEXに転送してみてください。EX/MEMパイプラインレジスタから同じ入力オペランドへの転送がない場合。
または同じ
MEM/WBからEXに転送しようとさえしないでください。EX/MEMからのより最近の結果の転送がすでにある場合。
説明しようと思います:
add C+A -> A A'
v? (forwarding to 3rd instruction)
A -> A''
v?
add C+A -> A
したがって、3番目の命令の場合、元のルールではA'
、最初の命令とA''
2番目の命令の両方を転送する必要があると規定されています(ただし、マルチプレクサは一度に2つのソースから供給することはできません)。そして、MEMハザード条件の変更は、より最近A'
のアクティブな転送がある場合、転送を試みるべきではないと言っています。A''
それで; あなたの絵は正しいです、 2つのEXハザード転送があります; ただし、すでにアクティブなEXハザード転送がある場合は、MEMハザード転送を試行しないでください。
これは明らかに本の第4版の誤りです(たとえば、括弧は不均衡です)。不思議なことに、この本の最新版(第4版改訂版)では、欠落しているクロージング')'が追加されていますが、...それでも間違った状態になってしまいます:
私はこれが条件の正しいバージョンだと思います:
if (MEM/WB.RegWrite
and (MEM/WB.RegisterRd ≠ 0)
and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0)
and (EX/MEM.RegisterRd = ID/EX.RegisterRs))
and (MEM/WB.RegisterRd = ID/EX.RegisterRs)) Forward = 01
if (MEM/WB.RegWrite
and (MEM/WB.RegisterRd ≠ 0)
and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0)
and (EX/MEM.RegisterRd = ID/EX.RegisterRt))
and (MEM/WB.RegisterRd = ID/EX.RegisterRt)) Forward = 01