전에 배운 single cylce에 pipeline을 더해서 성능을 획기적으로 상승시킨다. 그러나 이 과정에서 발생하는 문제, 혹은 위험(hazard)이 있는데 이는 다음과 같다.
Structural hazard
HW는 하나인데 같은 cycle에 두 개의 명령어를 쓰려고 함.
Data hazard
두 개의 명령어가 같은 storage에 접근
명령어가 정순서로 뽑아질 때 나옴
Control hazard
한 명령어가 다음 명령어에 영향을 끼친다.
Structural hazard
모든 instruction의 수행이 IF-ID-EX-MEM-WB으로 이루어진다고 가정했을 때 4번째 Cycle에서는 첫 번째 instruction의 Memory Access와 네 번째 instruction의 IF가 동시에 Memory Access를 요구하는 것을 볼 수 있다. 메모리는 당연히 어디서 해당 signal을 받았는지 알 수 없기 때문에 결론적으로 Resource Conflict 현상이 발생하는 것이다.
이에 대한 해결책으로는 Stalling으로, 저렇게 중복해서 쓰는 부분에 대해서는 다른 instruction을 처리 할 때는 쉬어주게끔 고려하는 것이다. 즉, 기기적으로 이상이 없음에도 일부러 수행을 멈추게 하여 비용적인 측면에서는 더 효율적이겠지만 아무래도 성능이 좋을 순 없다.
Data Hazard
Data에 대한 Read/Write Sequence가 엇갈리면서 발생하는 문제이다. 간단히 두 번째 instruction 결과가 첫 번째 instruction에 dependent하기에 발생하는 문제인 것이다.
이에 따른 경우는 다음 3가지와 같이 정의된다.
Read After Write(RAW)
Write After Write(WAW)
Write After Read(WAR)
위를 보면 Write 과정이 data hazard를 야기하는 주된 원인임을 알 수 있을 것이다.
Load-use hazard
lw의 계산 결과는 memory의 값이기 때문에 DM과정의 뒤에서 가져올 수 있기 때문에 이전의 hazard와 같이 forwading 방식으로 ALU에서 가져와도 그 연산 결과는 메모리의 주소값일 뿐 실질적으로 원하는 값이 아니기 때문에 그 방식으로는 해결할 수 없다.
Stalling
앞의 데이터가 준비 되기 전까지 그 데이터를 쓰는 공간을 아무것도 하지 않고 가만히 냅둔다. (stall)
즉, 그 상태를 그대로 유지하는 것이다.
그러기 위해선 다음 두 조건을 만족해야 한다.
새로운 명령어가 들어오지 않는다.
register file에 data가 update되지 않는다.
Stalling Hardware
)
StallF와 StallD 신호를 통해 IF와 ID의 register를 disabled 시키는 것이다.
그렇게 되면 E방에는 데이터가 한 clock 동안 비워 주어야 하는데 이 과정을 flush라고 하고 해당 동작을 FlushE signal이 관할하여 clear 시키는 역할을 한다.