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 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
lw 일 때, 1 clock stall 이 필요함
lw의 rt 값이 다음 명령어의 rt 혹은 rs 값과 같다면 control을 이용해 NOP삽입
'ੈ✩‧₊˚Computer Science > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 캐시(Cache) (0) | 2020.11.20 |
---|---|
[컴퓨터구조] 메모리 계층구조 기본 (Memory hierarchy general) (0) | 2020.11.20 |
[컴퓨터구조] Pipelining Hazard (파이프라인 해저드) (0) | 2020.11.13 |
[컴퓨터구조] MultiCycle Datapath (0) | 2020.11.06 |
[컴퓨터구조] single cycle 의 단점, multi cycle (0) | 2020.11.06 |