Используемый документ http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html
Я перепишу условия опасности EX и MEM (отбрасывание! = 0 часть для простоты), прежде чем мы примем во внимание «двойную опасность данных» ( оригинальные правила ):
EX Hazard
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 Hazard (исходное состояние)
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) одновременно:
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 Hazard :
Давайте пересмотрим условия пересылки для опасности 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
так, для третьей инструкции исходные правила скажут, что оба A'
из первой инструкции и A''
из второй инструкции должны быть переданы (но мультиплексирование не может быть подано из двух источников в один момент времени). И изменение условия опасности MEM говорит о том, что A'
не следует пытаться пересылать, если существует активная переадресация A''
, которая более поздняя.
Итак, ваш рисунок прав, будет 2 EX Hazards forwarding ; Но перенаправление MEM-опасностей не следует пытаться, если уже есть активное перенаправление EX Hazard.