Data Analysis for Investment & Control
CPU 아키텍처 설계 - 파이프라인(Pipeline)의 이해 본문
파이프라인은 프로세서가 명령어 수행을 효율적으로 하기 위한 매커니즘이다. 명령어가 수행되는 동안 다음에 수행될 명령어가 해석되고 그 다음에 해석될 명령어가 레지스터에 패치되는 일련의 과정을 통해 프로세서의 동작 속도를 향상시켜준다.
단순한 버전의 프로세서에는 4단계 파이프라인 구조를 가지고 있다.
1. Fetch는 프로그램 메모리에서 명령어를 로드한다.
2. Decode는 Instruction Register의 명령어를 해석한다.
3. Execute는 명령어를 처리한다.
4. Write-Back은 처리된 결과를 레지스터 또는 데이터 메모리에 저장한다.
명령어는 순차적으로 놓이게 된다. 첫 번째 cycle에서는 LD 명령어가 Fetch 단계에 놓인다. 두 번째 cycle에서는 Fetch 단계에 있던 LD 명령어가 Decode 단계에 놓이고 ADD 명령어가 Fetch 단계에 새로 놓인다. 세 번째 cycle에서는 LD 명령어는 명령어 수행을 위해 Execute 단계에 들어가며 ADD 명령어는 Decode 단계로, 그 뒤에 SUB 명령어가 새로 Fetch 단계에 놓인다. LD 명령어는 수행을 마친 후에 Write-Back 단계에 놓이며 ADD 명령어는 Execute 단계에 놓여 덧셈 연산을 처리한다. SUB 명령어는 Decode 단계에서 명령어를 해석하며 다음 해석될 ST 명령어가 Fetch되어 Instruction Register에 저장된다.
아래의 그림은 코어 내부 모듈들을 파이프라인 순서에 맞추어 배치한 것이다. 각 파이프 라인 사이에 배치되어 있는 모듈들은 기본적으로 concurrent circuit으로 non clock based이다. 그리고 점선에 오버랩되어 배치된 모듈들은 sequential circuit으로 clock based이다.
Assembly 언어로 작성된 코드가 기계어로 변환되어 program memory에 저장되는 명령어들이 clock cycle에 따라 순차적으로 fetch가 되어 명령어를 처리한다.
예를 들어, 데이터 메모리에 저장되어 있는 변수 값 a, b, c에 대해 (a+b)-c의 결과 값을 구하고자 한다면 아래와 같은 assembly code를 작성해 볼 수 있다.
ADDR INST DST OP1 OP2
0000 LD mr0 mem0
0001 LD sr0 mem1
0002 ADD mr1 mr0 sr0
0003 LD sr1 mem2
0004 SUB mr2 mr1 sr1
0005 ST mem3 mr2
0006 NOP
0007 NOP
ADDR INST DST OP1 OP2
0000 LD mr0 mem0(a) FETCH
Program memory의 0번지에 위치한 명령어부터 차례로 fetch가 되어 명령어가 처리된다. Fetch 단계에 있는 LD 명령은 program memory와 instruction register 사이에 위치한다. LD 명령어는 data memory에서 데이터를 꺼내야 하는 처리를 하기 때문에 instruction decoding 단계로 가기 전에 1cycle 미리 data memory의 address를 access하는 instruction dispatch 처리를 수행한다. Data memory는 register보다 1clock을 더 소모하기 때문이다. 이는 파이프라인 구조에서 명령어 수행의 동기화를 위한 작업이다.
ADDR INST DST OP1 OP2
0001 LD sr0 mem1(b) FETCH
0000 LD mr0 mem0(a) DECODE
첫 번째 LD는 decode 단계로 넘어가고 두 번째 LD 명령어가 fetch된다. 첫 번째 LD 명령어가 decoding 되면서 instruction decoder에서 데이터를 로드시킬 레지스터의 address와 write enable signal 그리고 register group에 데이터 라인을 지정하기 위한 multiplexer를 선택하기 위한 signal을 내보낸다. 이 신호들은 LD 명령어가 execute 단계에서 처리가 되도록 하기 위해 buffer를 거친다. 두 번째 LD는 마찬가지로 instruction dispatcher를 통해 미리 data memory에 address를 지정한다.
ADDR INST DST OP1 OP2
0002 ADD mr1 mr0 sr0 FETCH
0001 LD sr0 mem1(b) DECODE
0000 LD mr0 mem0(a) EXECUTE
세 번째 cycle에서는 ADD 명령어가 fetch된다. ADD 명령어는 data memory를 access 할 필요가 없기 때문에 instruction dispatcher의 처리는 일어나지 않는다. 0001번지에 저장되어 있던 LD 명령어는 decode 단계에 놓이면서 0000번지에 저장되어 있던 LD 명령어와 마찬가지로 register의 address와 write enable signal 그리고 multiplexer selection signal을 buffer에 전송한다. 0001번지의 LD 명령어는 slave register group에 데이터를 로드 시키기 때문에 master register group과는 다른 buffer로 시그널을 딜레이 시킨다. 0000번지의 LD 명령어는 execute 단계에 놓이면서 master register group으로 address가 지정되며, write enable signal과 multiplexer selection signal이 입력된다. 이 때 data memory로부터 0번지에 저장되어 있던 데이터 ‘a’가 데이터 버스에 놓이게 된다.
ADDR INST DST OP1 OP2
0003 LD sr1 mem2(c) FETCH
0002 ADD mr1 mr0 sr0 DECODE
0001 LD sr0 mem1(b) EXECUTE
0000 LD mr0 mem0(a) WRITEBACK
4번째 cycle에서는 LD 명령어가 fetch된다. Data memory에 address를 지정해야 하기 때문에 instruction dispatcher에서 처리가 이루어진다. ADD 명령어는 decode 단계에 놓이게 된다. ADD 명령어는 master와 slave register group에 read address를 지정하기 때문에 read address buffer로 시그널을 보내며 execute 단계에서 필요한 functional signal을 위해 functional signal buffer로 signal을 보낸다. src1과 src2 multiplexer selection을 위해 src1과 src2 mux buffer로 signal을 보낸다. 0001번지의 LD 명령어는 execute 단계에 놓이면서 data memory에서 나오는 데이터 ‘b’가 slave register group로 입력이 된다. Buffer를 통과한 address, write enable signal 그리고 multiplexer selection signal이 입력된다. 0000번지의 LD 명령어는 write-back 단계에 놓이게 되는데 이때 실제적으로 master register group으로 데이터 ‘a’의 저장이 이루어진다.
ADDR INST DST OP1 OP2
0004 SUB mr2 mr1 sr1 FETCH
0003 LD sr1 mem2(c) DECODE
0002 ADD mr1 mr0 sr0 EXECUTE
0001 LD sr0 mem1(b) WRITEBACK
0000 LD mr0 mem0(a)
5번째 cycle에서는 SUB 명령어가 fetch된다. 0003번지의 LD 명령어는 decode 단계에 놓이면서 slave register group에 데이터를 로드하기 위해 필요한 시그널들을 각각의 buffer에 보낸다. ADD 명령어는 execute 단계에 놓이게 된다. Read address buffer로부터 master register group과 slave address group으로 addressing이 이루어지며 src mux buffer로부터 src1과 src2 multiplexer selection signal이 입력된다. Functional signal buffer로부터 ADD 연산을 위한 functional signal이 arithmetic unit으로 입력된다. Arithmetic unit은 concurrent circuit이기 때문에 연산 결과가 바로 출력이 된다. 데이터 ‘a’와 ‘b’가 더해진 결과가 master register group의 데이터 라인에 입력된다. 그리고 write enable signal과 multiplexer selection signal도 역시 입력된다. 0001번지의 LD 명령은 write-back 단계에 있게 되기 때문에 데이터 ‘b’는 slave register group에 저장이 된 상태이다.
ADDR INST DST OP1 OP2
0005 ST mem3 mr2 FETCH
0004 SUB mr2 mr1 sr1 DECODE
0003 LD sr1 mem2(c) EXECUTE
0002 ADD mr1 mr0 sr0 WRITEBACK
0001 LD sr0 mem1(b)
0000 LD mr0 mem0(a)
6번째 cycle에서는 ST 명령어가 fetch된다. SUB 명령어는 decode 단계에 놓인다. 따라서 operand1과 operand2가 저장되어 있는 master register group과 slave register group을 access 하기 위해 read address buffer로 access할 주소를 보낸다. 마찬가지로 functional signal buffer로 SUB 연산을 수행할 functional signal을 보내며, src1과 src2 mux buffer로 multiplexer selection signal을 보낸다. 연산 처리 결과가 저장될 위치를 지정하기 위해 master register group의 address, write enable signal 그리고 multiplexer selection signal을 각각의 buffer에 전송한다. 0003 번지의 LD 명령어는 execute 단계에 놓이면서 data memory로부터의 데이터 ‘c’가 slave register group의 데이터 라인으로 입력이 되고 write enable signal과 multiplexer selection signal도 입력이 된다. ADD 명령어는 write-back 단계에 놓이게 되어 연산 결과인 ‘a+b’가 master register group내의 지정된 address에 저장된다.
ADDR INST DST OP1 OP2
0006 NOP FETCH
0005 ST mem3 mr2 DECODE
0004 SUB mr2 mr1 sr1 EXECUTE
0003 LD sr1 mem2(c) WRITEBACK
0002 ADD mr1 mr0 sr0
0001 LD sr0 mem1(b)
7번째 cycle에서는 NOP 명령어가 fetch된다. ST 명령어는 decode 단계에 놓이면서 data memory로 data를 저장하기 위한 address, write enable signal 그리고 multiplexer selection signal을 buffer에 전송한다. SUB 명령어는 execute 단계에 위치한다. Decoding 단계에서 내보낸 read address와 write address 그리고 SUB 연산을 위한 functional signal과 src1, src2 multiplexer selection signal이 arithmetic unit, 각각의 register group 그리고 multiplexer에 입력된다. 따라서 SUB 연산의 결과인 ‘(a+b)-c’가 master register group의 데이터 라인으로 입력된다. 0003번지의 LD 명령어는 write-back 단계에 놓이게 되어 데이터 ‘c’가 slave register group의 지정된 address에 저장된다.
ADDR INST DST OP1 OP2
0007 NOP FETCH
0006 NOP DECODE
0005 ST mem3 mr2 EXECUTE
0004 SUB mr2 mr1 sr1 WRITEBACK
0003 LD sr1 mem2(c)
0002 ADD mr1 mr0 sr0
8번째 cycle에서는 NOP 명령이 fetch된다. 0006번지의 NOP 명령은 decode 단계에 놓이며 No Operation이라는 의미대로 아무런 작업을 수행하지 않는다. ST 명령은 execute 단계에 놓이게 되는데, 이전 단계의 instruction decoder에서 내보냈던 각 signal들이 data memory의 addressing과 write enable signal 그리고 multiplexer selection signal로 data memory와 multiplexer에 입력된다. 또한 master register group에 read address가 입력된다. SUB 명령은 write-back 단계에 놓이게 되며 SUB 연산 결과인 ‘(a+b)-c’ 값이 master register group의 지정된 address에 저장된다.
ADDR INST DST OP1 OP2
0007 NOP DECODE
0006 NOP EXECUTE
0005 ST mem3 mr2 WRITEBACK
0004 SUB mr2 mr1 sr1
0003 LD sr1 mem2(c)
9번째 cycle에서는 fetch될 명령어가 존재하지 않는다. 0007번지의 NOP 명령어는 decode 단계에 놓이며 아무런 작업을 수행하지 않는다. 0006번지의 NOP 명령어는 execute 단계에 놓이며 역시 아무런 작업을 수행하지 않는다. ST 명령어는 write-back 단계에 놓이게 되는데, 연산 결과인 ‘(a+b)-c’ 값이 0003번지에 data memory에 저장된다. Data memory에 데이터가 완전히 저장이 되려면 2 cycle이 소요되기 때문에 0003번지의 결과 데이터를 사용하기 위해서는 2 cycle을 기다려야 한다.
'Robotics > Hardware' 카테고리의 다른 글
IEEE 754-2008 Decimal Floating Point Format (1) (0) | 2009.08.30 |
---|---|
DSP 개발환경 꾸미기 (3) | 2009.07.23 |
DSP를 이용한 CAN 통신 (0) | 2009.06.17 |
BLDC 모터의 원리 (12) | 2009.06.15 |
C2000TM 32bit Architecture (2) | 2009.06.15 |