티스토리 뷰

Study/Architecture

[Study] Pipelined Implementation Example

생각많은 소심남 2013. 3. 28. 16:59

잠깐 헷갈리고 있던 개념이 있어서 이자리에서 정리해보려고 한다. 과연 Single Cycle Implementation과 Multi Cycle Implementation 그리고 이전에 다뤘던 pipelined Implementation 의 차이는 무엇일까 하는 것이었다. 그 의문을 갖게 된 계기는 다음과 같다. 

위의 이미지는 Pipeline Implementation의 DataPath이다. 그런데 잘 보면 알다시피 기본 베이스가 Single Cycle Implementation의 Architecture에다 중간중간에 Stage Register가 삽입된 형태를 띄고 있다. 내가 헷갈렸던 것은 Pipeline 자체도 Multi-cycle Implementation을 기반으로 나온 개념인데 왜 기본 구조는 Single Cycle Implementation 이냐는 것이었다. 

사실 Single Cycle이냐 Multi Cycle Implementation의 개념을 Pipelined Implementation과 동일한 선상에서 비교하면 잘 못된거 같다. Single Cycle은 말그대로 1 cycle에 1 instruction을 끝내기 위한 과정으로 결과적으로 모든 instruction 의 수행시간이 그 수행시간이 가장 긴 instruction에 맞춰서 똑같이 정렬된다는 특징이 있다. 이에 비해서 Multi Cycle이 나타내는 것은 이 1cycle상에서도 단계를 나누어 필요없는 과정은 수행하지 않고 지나칠 수 있다는 개념이 적용된 것이다. 결국 instruction마다 수행시간이 달라지는 것이다. 예를 들어 data flow를 보아도 arithmetic instruction의 경우는 4단계만 수행하면 되는 것을 lw/sw같은 건 5단계까지 가야 전체 instruction이 수행되며, 오히려 branch instruction이나 jmp같은건 3단계에서 끝나버리는 경우도 발생하는 것이다. 이렇게 단계로 나눠서 instruction의 수행시간을 다르게 정의할 수 있는게 Multi cycle implementation인 것이다.

 pipelined implementation의 반대되는 개념은 위에서 언급한 cycle의 개념이 아니라 sequential Implementation이다. 즉, 여러 연산을 순차적으로 처리되는 것이 아니라 동시에 여러 instruction을 수행할 수 있는  mechanism 자체가 pipeline인 거지, 이게 위에서 말한 implementation과는 다른 비교가 아닌가 싶다. 그래서 위의 구조같은 경우도 stage 별로 나누되, 그걸 동시에 수행할수 있는 구조자체를 언급하는게 맞는 거 같다. 그 구조가 single이냐 Multi냐를 따지는게 중요한게 아니라...

 

아무튼 위의 구조에서 한가지 예를 들어서 pipeline implementation의 data flow를 살펴보고자 한다. 일단 모든 hazard가 없다는 가정하에 다음의 예제가 있다. 

hazard가 없는 상태라면 clock이 이동할 때마다 그림이 다음과 같이 나올것이다.

그럼 첫번째 instruction인 lw가 제일 먼저 수행된다.


하지만 다들 알다시피 lw의 본연의 역할을 하는 것은 MEM 단계이고 현재 clock 1인 상태에서는 Instruction을 Fetch 하는 상태이다. 이제 다음 clock으로 넘어가면서 IF stage는 다음 instruction인 sub가 들어오게 된다. 



현재 lw instruction은 Decode된 상태이기 때문에 여기서부터 이 구조는 이제 다음으로 수행할 operation이 load라는 사실을 알게 된다. 그래서 관련 control signal이 설정되어 미리 stage register에 들어가 있게 될 것이다. 참고로 lw 명령어는 I-format instruction이기 때문에 I[15:0] 부분을 사용하기 위한 sign extend가 미리 수행될 것이다. 



세번째 clock에서는 다음 instruction인 and가 들어오기 시작하며, 맨처음에 들어왔던 lw instruction은 EXE 단계를 수행하게 된다. lw가 EXE 단계에서 수행되는 과정을 돌이켜보면 이전 단계에서 imm16값을 받아와 register의 source address와의 add 연산을 수행하게 된다. 그래서 그 결과가 다음 stage의 register에 저장되어 clock이 넘어갈 때까지 대기 할 것이다. 참고로 sub에서 얻을 수 있는 정보는 rs와 rd, rt 이므로 이 와 관련한 bit field가 미리 뽑아져서 stage register에서 대기하고 있어야 한다. 물론 다음 clock이 되면 이 정보들이 EXE단계에서 이용될 것이다. 



Clock 4로 넘어오면서 새로운 instruction인 or가 들어왔다. 반면 맨처음에 들어왔던 lw 는 MEM에서 수행되고 있다. 눈여겨볼 것은 lw의 맨 밑에 10이란 값이 계속 흘러가고 있는 것이다. 이 10이 나타내는 것은 load된 정보가 담길 register 값이다. 이 값은 WB단계에서 앞에 있는 register의 write register의 입력값으로 들어갈 것이고, memory에서 뽑아져 나온 Data 값은 이 다음 단계인 WB에서 MUX를 거쳐 Register의 Data로 들어갈 것이라는 것을 예상할 수 있다. 지금 보다시피 모든 연산들이 단계별로 동시에 수행되고 있는 것을 보고 있다. 지금 이 clock 4 단계에선 동시에 or와 and, sub lw가 수행되고 있는 것이다. 물론 이 동작에 따라서 Control Signal의 활성화 여부가 달라지는 것을 볼 수 있다. 그래서 보통 clock 몇단계에서 해당 모듈의 input과 output이 뭔지를 물어보는 시험문제가 많이 나오는 듯 하다. 이후의 연산은 공통적으로 R-format을 활용한 Arithmetic instruction이기 때문에 설명을 생략하려고 한다.






참고로 회색으로 칠해있는 부분이 해당 stage에서 활성화되는 모듈이고 진하게 칠한 bus도 역시 활성화 된 부분이다.

댓글