[CS] #5. Processor

<div>elop·2022년 1월 24일
0

이번 챕터에서는 Processor에 대해 알아볼 것이다.
processor는 datapath+control을 합친 것 이다.
즉, 어떻게 연산들이 이루어지고, control signal이 어떻게 되는지, 병렬연산(중요)을 어떻게 처리하는지 등을 알아볼 것이다!
(process hardware를 구성해본다고 생각해도 좋다)

우선, 모든 instruction은 처음에 공통된 다음의 두 단계를 거친다.

  • PC(현재 명령어를 가리키는 주소)를 메모리로 보내고, 그 instruction을 fetch한다.
  • 앞서 배운 instruction들의 field를 사용해서 register를 읽는다.




이제 아~주 간단한 hardware을 살펴보겠다.

간단해 보이지 않을 수 있지만...
곧 이 hardware 위에 수많은 control signal들과 mux들이 덕지덕지 추가 될 것이다.
구체적으로 살펴보기전에 먼저 구성을 대충 훑어보자.
i) 가장 먼저 PC에서 instruction memory로 address를 가져오고, 어떤 instruction인지 확인 하는것을 볼 수 있다.
(앞서 말한 instuction을 fetch하는 공통된 과정. 당연히 이번 수행할 명령어가 어떤것인지 알아야 하니...)
ii) 다음 명령어를 위해 PC에 4를 더해 주는것도 보인다. 이때에 쓰이는 ALU라는 것은 산술 계산을 처리해주는 연산장치이다.
iii) 3개의 operhands로 인한 3개의 register 들도 보이고, lw나 sw instruction에서 사용되는 data memory영역도 보인다.

이제,지금까지 배웠던 add, beq, lw와 같은 instruction들이 processor에서 어떤 과정을 거쳐 수행되는지 좀 더 자세히 알아보자!



Instruction을 fetch 하는 과정은 공통이므로 생략하도록 하겠다.
1. add

  • 우측 ALU를 보면 두개의 register가 input으로 들어가는걸 볼 수 있는데, rs와 rt에 해당되는 register들이다. ALU에서 add 연산을 수행한 후, Data memory영역으로 가는게 아니라 위 화살표를 따라가서 data(rd)에 그대로 덮어쓴다.

2. lw
  • lw에서는 ALU로 들어가는것이 base address와 offset이다. 이 두개를 더해서 나온 address를 data memory영역에서 읽어 값을 찾고, 그 값을 data(rd)로 넘긴다.

3. sw
  • sw에서는 load word와 달리, Data memory에서 register로 data를 넘길 필요가 없다. 그림을 보면 register가 ALU로 들어가기전에 data memory로 들어가는 Data를 볼 수 있는데, sw할 때에 rd부분(값이 써지는 부분)을 넘겨주는 과정이다.

4. beq
  • 복습해보면, beq a, b, c 라는 명령어는 a와 b가 같을 경우 c로 가라는 뜻이다. 이럴 경우 ALU에서 뺄셈 연산이 수행된다. a에서 b를 뺀 값이 0인지 아닌지로 a와 b값의 동일여부를 파악하기 위함이다. 그리고 그 값을 PC+4를 한 ALU 옆에 있는 ALU에서 더해줌으로써, target address로 향하는 것이다. (a와 b를 뺀 ALU 결과값이 어떻게 영향을 미치는지는 이 그림엔 나와있지 않고, 후에 더 자세한 그림으로 설명하겠다.)




Control Signals

이제 멀티플렉서를 추가해 볼것이다. 먼저 멀티플렉서란?
여러개의 입력된 신호중 하나를 골라주는 장치이다. 멀티플렉서가 왜 필요할까?

당장 위 그림만 보더라도, 빨간 동그라미 부분에서 신호가 여러개 들어오는 것을 볼 수있다. 당연히 여러 신호를 받을 수 없으므로, 어떤 신호를 선택할지 결정해주는 Mux가 필요하다.

위 그림은 Mux를 추가해준 그림이다. Control signal에서 나오는 파란색선에 따라서 어떤값을 processing할지 결정해준다고 보면된다. control signal값이 0이냐 1이냐에 따라 값을 선택 해주는 식이다.
그리고 그 Control signal은 instruction의 op code에 따라 결정된다!

그리고 이 그림을 보면 아까 beq에서 설명할 수 없던 부분을 이해할 수 있다.
beq의 register에서 뺄셈을 수행한 후, 그 값이 같을 경우 zero signal을 AND gate로 보내는 것을 볼 수 있는데, 이 AND gate의 결과값에 따라 다음 PC를 target address로 할지, 단순히 PC+4로 할지 결정되는 것이다.


이제 Contro signal값의 의미와 그 값에 따라 어떤 연산을 수행하는지 알아보자.
설명을 위해 더 복잡해진 그림을 가져왔다!

이것저것 많이 추가되었다... 하나씩 뜯어보면 크게 어렵지않으니 알아보도록하자!

가장 먼저 이 부분을 살펴 보자. fetch한 32bits의 instruction의 bits들을 구간별로 나뉘어 있다.

눈치 챘겠지만, 앞서 공부했던 format들의 필드들별로 구분 된것이다. 방금 배웠듯 instruction의 opcode는 Control signal의 input으로, rs, rt등 source registers부분은 register의 input으로 들어가는 것이다.

그런데!! I-format을 위한 address(15:0)부분에 Sign-extend라는 연산을 해주고 shift left 2를 해주는것을 볼 수 있다. 이건 왜 그럴까?

  • Sign-enxtension : 값을 유지하면서 비트를 확장해 주는 것.
    Ex) 0100 => 0000 0100 (4bits 에서 8bits로 확장)

이는 ALU는 32bits 연산을 하는데 address부분이 16bits이기때문에 Sign extension을 해준 뒤, ALU 연산을 해주는것이다.
그렇다면 Shift left 2 는?? Alignment restriction을 위해, 4를 곱해준 뒤 PC+4와 함께 더해주는 것이다.




다음은 Control signal에서 어떤 신호들이 나가는 지 알아보자. 존나 많다.
7개의 signal들과 ALUop로 이루어져있다. 7개의 signal부터 표와 함께 보도록 하자.

7 sginals

instruction의 op code로 부터 signal들의 값이 0 또는 1로 결정되는데, 각각 어느 상황인지를 설명해 놓은것이다. 하나씩 살펴보면,

1. RegDst

  • 0 : rd register가 20:16 bits로 결정 (lw일 경우)
  • 1 : rd register가 15:11 bits로 결정 (R-format일 경우)


2. RegWrite

  • 0 : None
  • 1 : register에 값을 쓸 때. 즉 r-format이거나 lw instruction을 수행할 때이다.


3. ALUSrc

  • 0 : ALU의 두번째 피연산자를 Read data2로 결정 (R-format, beq,..)
  • 1 : ALU의 두번째 피연산자를 sign-extended 16bits로 결정 (lw, sw, ...)


4. PCSrc

  • 0 : 다음 PC를 PC+4로 결정
  • 1 : 다음 PC를 target addres로 결정


5. MemRead

  • 0 : None
  • 1 : Data memory의 content가 ReadData의 출력으로 결정 (lw)


6. MemWrite

  • 0 : None
  • 1 : Data memory의 content가 ReadData의 입력으로 결정 (sw)


7. MemtoReg

  • 0 : ALU의 출력이 Write data로 들어감
  • 1 : Data memory의 출력이 Write data로 들어감

ALUop

ALUop는 ALU에서 어떤 연산을 수행(add or sub or ...)해야할지 결정한다.
따라서 ALU control의 input으로 들어가는 것을 볼 수있는데, 잘 보면 input이 하나 더 있다. 바로 instruction의 5:0, 즉 funct code 부분이다. ALU에서 어떤 연산을 할지는 op code와 funct code에 의해 결정된다.
instruction에 따라 아래에 표로 정리해놨다.


lw, sw는 base address + offset을 해줘야해서 add 연산을, branch equal에서는 register source의 값이 같은지 확인하기 위해 subtract 연산을 하는 것을 확인 할 수 있다!



요약

이제 instruction을 fetch했을 때, Control signal의 신호들이 각각 어느 값을 내보낼지 예상이 된다! 아직도 이해가 안간다면, 정리된 표를 보고 다시 한번 이해하도록 하자.

(X는 어떤 값이든 상관 없다는 뜻이다.)

profile
기록장

0개의 댓글