본문 바로가기
Embedded System/Embedded Recipes

1.18 일반적인 CPU의 동작 예(Core)와 Pipe Line

by 리미와감자 2022. 8. 15.

1.18 일반적인 CPU의 동작 예(Core)와 Pipe Line

 

  CPU는 앞서 설명한대로 크게 CU, ALU, 레지스터로 구성되지만, 그외에도 Program Counter(PC), Instruction Register, Address Register, Data Register 등의 유닛을 더 포함하고있다.

 

  • 실제 CPU의 개략적인 구조

  그림의 왼쪽 부분은 CPU(Processor)이고, 오른쪽 부분은 코드 관련 프로그램과 데이터를 담고 있는 External Memory(외부메모리)이다. RAM 또는 NOR Flash같은 ROM이다.

 

PC(Program Counter) : CPU가 실행할 Instruction의 주소를 가리킴.

IR(Instruction Register) : PC가 가리키는 Instruction의 주소에서 읽어 온 Instruction을 담아두는 레지스터.

Address Register : 현재 사용하는 Data를 Access하기 위한 Data의 주소를 저장하는 레지스터.

Data Register : 데이터를 담아두는 레지스터. Address Register가 가리키는 실제 값.

ACC(Accumulator) : 연산에 사용되는 값을 저장. 연산의 결과값을 일시적으로 저장하는 역할을 함. 외부에서 접근할 수 없고, CPU만 사용할 수 있는 레지스터.


Decoder : IR에서 가져온 Instruction을 해석하여 CU에 넘김.

CU(Control Unit) : Decoder에서 받아온 신호를 제어 신호로 변환.

ALU : 산술 연산 Unit

 


  • CPU 동작방법
word a = 1;
word b = 2;
word c;

word add (void)
{
  int temp;
  temp = a;
  c = a + b;

  return;
}

  위 코드를 통해서 CPU가 어떻게 동작하는지 간단하게 알아보자.

 

  a, b, c는 전역변수로 절대주소를 갖기때문에 어디서나 Access가능하다. 동작하는 CPU가 16bit 프로세서라고 가정하면, 절대주소 또한 1word(=2byte)이다. 각각의 주소 a는 0x2000, b는 0x2002, c는 0x2004로 할당하자.

 

주소                        Assembly

0x1000              LOAD    0x2000

0x1002              ADD       0x2002

0x1004              STORE  0x2004

 

LOAD    0x2000 : a값을 Data Register에 Load(신호를 1010101010101010로 가정)

ADD      0x2002 : 이전에 Load된 a값과 b값을 더함(신호를 1111000011110000로 가정)

STORE  0x2004 : a와 b를 더한 값을 c의 주소에 저장(신호를 1001011010010011로 가정)

 

 

첫 번째 LOAD 과정

 

 

  1. CPU가 실행하려는 주소(0x1000)가 PC에 들어있다.
  2. Address Register에 0x1000을 넣는다.
  3. Address Register에 0x1000을 넣는 순간 External Memory의 0x1000에 Access한다.
  4. External Memory로부터 LOAD 0x2000를 IR로 읽어온다.
  5. IR에 LOAD 0x2000(1010101010101010)이 저장된다.
  6. Decoder로 LOAD 0x2000를 보내어 해석함과 동시에 PC에서는 다음 주소로 넘어간다.
  7. Decoder가 LOAD 0x2000의 의미가 0x2000 번지의 값을 가져오라는 것임을 해석하여 CU에 전달한다.
  8. CU가 External Memory로부터 값을 읽어오도록 제어 신호를 발생시킨다.
  9. CU가 발생시킨 제어 신호에 의해 0x2000 번지의 값 1이 Data Register에 저장된다.
  10. 이 값 1은 어떻게 쓰일지 모르니 ACC에 잠시 저장된다(CU의 신호에 의해 ACC에 저장되는 것임).

 

두 번째 ADD 과정

 

 

  1. CPU가 실행하려는 주소(0x1002)가 PC에 들어있다.
  2. Address Register에 0x1002를 넣는다.
  3. Address Register에 0x1002를 넣는 순간 External Memory의 0x1002에 Access한다.
  4. External Memory로부터 ADD 0x2002를 IR로 읽어온다.
  5. IR에 ADD 0x2002(1111000011110000)이 저장된다.
  6. Decoder로 ADD 0x2002를 보내어 해석함과 동시에 PC에서는 다음 주소로 넘어간다.
  7. Decoder가 ADD 0x2002의 의미가 기존값에 0x2002 번지의 값을 더하는 것임을 해석하여 CU에 전달한다.
  8. CU가 External Memory로부터 값을 읽어오고 ALU에게는 더하라는 제어 신호를 발생시킨다.
  9. CU가 발생시킨 제어 신호에 의해 0x2002 번지의 값 2가 Data Register에 저장된다.
  10. 이 값 2는 이미 ACC에 저장되어있던 1과 더하여 3으로 다시 ACC에 저장된다.

 

세 번째 STORE 과정

 

 

  1. CPU가 실행하려는 주소(0x1004)가 PC에 들어있다.
  2. Address Register에 0x1004를 넣는다.
  3. Address Register에 0x1004를 넣는 순간 External Memory의 0x1004에 Access한다.
  4. External Memory로부터 STORE 0x2004를 IR로 읽어온다.
  5. IR에 STORE 0x2004(1001011010010011)이 저장된다.
  6. Decoder로 STORE 0x2004를 보내어 해석함과 동시에 PC에서는 다음 주소로 넘어간다.
  7. Decoder가 STORE 0x2004의 의미가 기존값을 0x2004 번지에 저장하는 것임을 해석하여 CU에 전달한다.
  8. CU가 External Memory에 값을 저장할 수 있도록 제어 신호를 발생시킨다.
  9. CU가 발생시킨 제어 신호에 의해 ACC의 값 3이 0x2004 번지에 저장된다.

 

  이러한 일련의 과정을 통해 CPU와 메모리는 계속 데이터를 주고받는다. Program Counter 덕분에 CPU가 쉬지않고 다음 코드를 읽어낼 수 있다.

 


  • CPU 명령 주기(Instruction Cycle)

  CPU의 명령 주기는 3가지 동작을 순환한다.

 

 

  1. Fetch : Instruction을 메모리로부터 가져온다(위 동작과정 예시에서 1~5에 해당).
  2. Decode : 가져온 Instruction을 해석하고 레지스터 값들도 확인한다(위 동작과정 예시에서 6~7에 해당).
  3. Execute : Decoding된 Instruction을 실행한다(위 동작과정 예시에서 8~끝에 해당).

 

  • Pipe Line(파이프라인)

  Fetch, Decode, Execute 3가지 동작을 더 효율적으로 하기 위해서 CPU는 파이프라인을 사용한다. 즉, 한 동작을 할때 다른 Unit들이 쉬지 않도록 계속 굴리는 것이다.

 

  CPU의 동작을 시간을 멈추어놓고 보면, 위 동작과정의 예시의 LOAD, ADD, STORE를 동시에 하고 있는 것이다. 즉, LOAD의 8~10번 과정, ADD의 6~7번 과정, STORE의 1~5번 과정이 동시에 실행되어 쉬고있는 Unit이 없음을 의미한다.

 

  위 그림은 ARM7의 3 stage pipe line이다. 한 칸당 1cycle(1clock)을 의미하며 3번째 clock부터는 3가지 동작이 함께 이루어짐을 알 수 있다. 만약 파이프라인이 없다면 LOAD, ADD, STORE 동작을 완료하는 데 9cycle이 걸리지만, 파이프라인을 적용하면 5cycle만에 끝낼 수 있다.

 

  하지만, 파이프라인의 단계가 많은 것이 더 좋은 퍼포먼스를 만드는 것은 아니다. 시스템에 따라 다르고, 오히려 퍼포먼스가 떨어질 수도 있다.

 

  3가지 동작이 함께 이루어진다면 PC는 어디를 가리키고 있을까? PC는 항상 Fetch하는 곳을 가리키고 있다. 위의 예에서 3Cycle부터 3가지 동작이 함께 이루어지는데, PC는 STORE의 FETCH를 가리키고 있을 것이다. 즉, 현재 Execution하고 이쓴 곳보다 앞서가고 있음을 알아야한다. ARM의 경우는 32bit(=4byte)이기때문에, 항상 8byte만큼 PC 내부의 주소가 앞설 것이다. 위의 16bit CPU 예시에서는 4byte만큼 앞선다.

 

 

※ Control Hazard와 Data Hazard

Control Hazard : Jump를 할 때 Execute단계에서 Fetch해놓았던 데이터를 버려야하는 경우.

Data Hazard : Execute단계에서 Register의 값을 조작하고 있는데, Decode단계에서 조작하고 있는 Register의 값이 필요한 경우.

 


아래 주소에서 더 자세하게 확인할 수 있습니다.

http://recipes.egloos.com/4982170

 

일반적인 CPU의 동작 예 (Core)와 Pipe Line

일반적인 CPU의 동작 예를 들기 위하여, 조금 더 Simplified된 CPU모델을 소개하고자 합니다. CPU는 최소한의 동작을 위하여 그림과 같이 , CU, ALU 이외에도 Program Counter, IR, Address Register, Data Register, ACC

recipes.egloos.com

 

댓글