2011-11-17 12 views
6

Trong Patterson & Hennessy Sách:MIPS đường ống Forwarding (double dữ liệu nguy hiểm)

Nhưng không thể này được xử lý như một mối nguy hiểm EX:

Tại sao quá trình chuyển tiếp được thực hiện trong giai đoạn MEM? Và làm thế nào? Với 1 gian hàng (cho lần thứ 2, tôi sẽ cần kết quả từ EX trong EX tiếp theo)?

+0

PS, liên kết cuối cùng của tôi, http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html nói điều gì đó về lỗi chính tả trong sách: "* Lưu ý rằng điều kiện chuyển tiếp cho MEM nguy hiểm trong sách giáo khoa trên trang 369 là WRONG! * "và tôi nghĩ nó có thể là về hình ảnh của bạn. – osgx

+1

Đây rõ ràng là một lỗi trong cuốn sách (dấu ngoặc đơn không cân bằng, cho một). Thật kỳ lạ ấn bản gần đây nhất của cuốn sách (ấn bản lần thứ 4 được sửa đổi) cho biết thêm một kết thúc bị thiếu ' – Ilya

Trả lời

6

Tài liệu sử dụng http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html

tôi sẽ viết lại EX và tình trạng nguy hiểm MEM (giảm = 0 phần vì đơn giản!), Trước khi chúng ta sẽ mất trong tài khoản "dữ liệu tăng gấp đôi nguy hiểm" (quy tắc ban đầu):

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 

tôi sẽ gọi điều kiện EX_h_Rs và EX_h_Rt để giữ công thức ngắn hơn

MEM Hazard (điều kiện ban đầu)

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 

====

Và ví dụ của chúng tôi với hai loại rủi ro cùng một lúc, giữa (1 và 3) & (thứ 2 và thứ 3) cùng lúc:

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

hoặc (chu kỳ promlem được đánh dấu bằng ** trên và dưới)

   ** 
add C+A -> A ... A 
      v  ? 
    add B+A -> A 
       v 
      add C+ A -> A  
       **  

Theo liên kết của tôi, sau khi tính đến đôi EX + MEM nguy hiểm: (! Không = 0 và sắp xếp lại các điều khoản boolean), quy tắc cập nhật của MEM Hazard:

Hãy rà soát lại các điều kiện chuyển tiếp cho MEM nguy hiểm để chăm sóc 'đúp' dữ liệu mối nguy hiểm

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 

Hoặc cùng sử dụng kỷ lục ngắn 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 

có nghĩa là:

Hãy thử chuyển tiếp từ MEM/WB sang EX; nếu không có chuyển tiếp vào cùng một toán hạng đầu vào từ thanh ghi đường dẫn EX/MEM.

Hoặc cùng một số

Đừng cố chuyển tiếp từ MEM/WB sang EX; nếu đã có chuyển tiếp kết quả gần đây hơn từ EX/MEM.

Tôi sẽ cố gắng để minh họa:

add C+A -> A  A' 
       v? (forwarding to 3rd instruction) 
      A -> A'' 
       v? 
      add C+A -> A   

vậy, để được hướng dẫn thứ ba quy tắc ban đầu sẽ nói rằng Cả A' từ lệnh đầu tiên và A'' từ hướng dẫn thứ hai nên được chuyển tiếp (nhưng MUX không thể được cho ăn từ hai nguồn tại một thời điểm duy nhất). Và sửa đổi điều kiện nguy hiểm MEM nói rằng không nên cố gắng chuyển tiếp A' nếu có chuyển tiếp hoạt động A'' gần đây hơn.

Vì vậy; bản vẽ của bạn là đúng,sẽ có 2 nguy cơ EX chuyển tiếp; Nhưng không nên thử chuyển tiếp nguy hiểm MEM nếu đã có chuyển tiếp EX Hazard đang hoạt động.

2

Đây rõ ràng là lỗi trong ấn bản thứ 4 của sách (dấu ngoặc đơn không cân bằng, cho một). Tò mò ấn bản mới nhất của cuốn sách (4th Edition Revised) cho biết thêm một đóng cửa mất tích ')' nhưng ... kết thúc với một điều kiện không chính xác vẫn:

enter image description here

Tôi nghĩ rằng đây sẽ là phiên bản đúng của các điều kiện:

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