MIPS管道转发(双重数据危险)

时间:2011-11-17 02:25:32

标签: mips pipeline computer-architecture

在Patterson&轩尼诗书:

但这不能作为EX危险处理:

为什么在MEM阶段完成转发?如何?有1档(对于第2档,我需要在下一个EX中使用EX的结果)?

2 个答案:

答案 0 :(得分:7)

使用的文件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)之间和(第二和第三)同时:

add $1, $1, $2 
add $1, $1, $3 
add $1, $1, $4

或(promlem循环在顶部和底部标有**

                **   
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          

因此,对于第三条指令,原始规则会说第一条指令的A'和第二条指令的A''都应该转发(但是mux不能在一个时刻从两个源传送)。修改MEM危险情况表示,如果有A'更新的主动转发,则不应尝试转发A''

因此; 你的图纸是对的, 会有2个EX危害转发;但是,如果已经有活动的EX危险转发,则不应尝试MEM危险转发。

答案 1 :(得分:2)

这显然是本书第4版中的一个错误(括号是不平衡的,一个)。奇怪的是,这本书的最新版本(第4版修订版)增加了一个缺失的结束')'但......最终的条件不正确仍然

enter image description here

我认为这是条件的正确版本:

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