본문 바로가기
ੈ✩‧₊˚Computer Science/컴퓨터구조

[컴퓨터구조]Data hazard (forwarding)

by 샨샨 2020. 11. 17.
반응형

Data forwarding 복습 ! 

Data Hazard 일 때, data가 register 혹은 memory에 write 될 때 까지 기다리지 않고 EX 단 / MEM 단에서 계산되면 바로 가져와서 사용하는 것임!

 

Data forwarding이 필요한 경우

Data dependency 가 생길 때

ex1) sub $2, $1, $3

      add $12, $2, $5 ☞ Data hazard ! ( sub의 목적지 register 을 이용하기 때문)

      or $13, $6, $2  ☞ Data hazard !  ( sub의 목적지 register 을 이용하기 때문)

      add $14, $2, $2 ☞sub가 WB일 때, ID단인데 같은 자리에 있어도 write가 read보다 더 빠르기 때문에 hazard 발생 안함

      sw $15, 100($2)

ex1 사진)

 

forwarding 에 따른 Datapath 설정

forwarding 전 ./ forwarding 후

forwarding logic ( 00 : register file에서 값을 받아옴 10:MEM에서 값을 받아옴 01 : WB에서 값을 받아옴)

EX hazard 인 경우 : 

 

1) 만약 EX/MEM.RegWrite = 1 && EX/MEM.RegRd = ID/EX.RegRs && EX/MEM.RegRd != 0  이면, ForwardA = 10

(= EX연산 끝나고 EX/MEM에 값이 저장될 때, EX/MEM의 Rd 값과 ID/EX의 Rs 값이 같고, EX/MEM의 Rd 값이 0 이 아니라면 MEM의 값을 Rs에 저장)

 

2) 만약 EX/MEM.RegWrite = 1 && EX/MEM.RegRd = ID/EX.RegRt && EX/MEM.RegRd != 0  이면, ForwardB = 10

(= EX연산 끝나고 EX/MEM에 값이 저장될 때, EX/MEM의 Rd 값과 ID/EX의 Rt 값이 같고, EX/MEM의 Rd 값이 0 이 아니라면 MEM의 값을 Rt에 저장)

 

MEM hazard 인 경우 : 

 

1) 만약 MEM/WB.RegWrite = 1 && MEM/WB.RegRd = ID/EX.RegRs && EX/MEM.RegRd != ID/EX.RegRs && MEM/WB.RegRd != 0  이면, ForwardA = 01

(= MEM연산 끝나고 MEM/WB에 값이 저장될 때, MEM/WB의 Rd 값과 ID/EX의 Rs 값이 같고, EX/MEM의 Rd 값과 ID/EX의 Rs 값이 다르고, MEM/WB의 Rd 값이 0 이 아니라면 WB의 값을 Rs에 저장)

 

2) 만약 MEM/WB.RegWrite = 1 && MEM/WB.RegRd = ID/EX.RegRt && EX/MEM.RegRd != ID/EX.RegRt && MEM/WB.RegRd != 0  이면, ForwardB = 01

(= MEM연산 끝나고 MEM/WB에 값이 저장될 때, MEM/WB의 Rd 값과 ID/EX의 Rt 값이 같고, EX/MEM의 Rd 값과 ID/EX의 Rt 값이 다르고, MEM/WB의 Rd 값이 0 이 아니라면 WB의 값을 Rt에 저장)

forwading logic 을 추가한 회로 (mux 2개와 forwarding unit 추가함)

forwarding 예시

sub $2, $1, $3

and $4, $2, $5

or $4, $4, $2

add $9, $4, $2

 

1,2

 

3,4

lw 일 때, 1 clock stall 이 필요함

lw의 rt 값이 다음 명령어의 rt 혹은 rs 값과 같다면 control을 이용해 NOP삽입

반응형