상세 컨텐츠

본문 제목

[컴퓨터 구조] 4.3 Building a Datapath

전공/컴퓨터 구조

by blacksmith16 2020. 10. 25. 18:52

본문

Datapath란 CPU에서 데이터와 주소를 처리하는 요소들을 말한다. 레지스터, ALU, MUX, 메모리 등이 Datapath라 할 수 있다. 지금부터는 lw, sw, add, sub, and, or, slt, beq, j 총 9가지 명령어를 수행할 수 있는 프로세서의 Datapath를 점점 완성해 나갈 것이다.

Instruction Fetch

우선 모든 Instruction을 처리하기 위한 첫 단계인 Instruction Fetch를 먼저 살펴보자.

위 이미지 (강의 교재 figure 4.6) 의 요소들에 대해 간단하게 알아보자.

  • PC : Program Counter. 실행할 명령어의 주소를 저장하고 있는 레지스터이다. State Element이기 때문에 이미지엔 없지만 Clock Input도 있다고 생각하면 된다.
  • Instruction Memory : 명령어의 주소를 받아서, 그 주소에 맞는 Instruction을 내보낸다. Instruction은 2장에서 다룬 32 bit 형식(R, I, J Format)이다.
  • Adder : 말 그대로 덧셈을 하는 요소. 위 이미지에서는 다음 명령어 주소를 가리키기 위해 (현재 주소 + 4)를 하기 위해 존재한다. 4를 더하는 것는 Instruction의 길이가 32 bit이고, 주소 하나가 1 byte(8 bit)이므로 4 byte 뒤의 주소가 다음 명령어의 주소이기 때문이다.

R-Format Instructions

여기에서 소개할 것들은 R-Format Instruction을 구현하는 데 필요한 요소들이다. 우리가 구현하려는 Instruction 중에서 R-Format은 add, sub, and, or, slt이다.
R-Format Instruction의 형태는 2장에서 다루기 때문에 (포스팅은 아직 올리지 않음) 바로 설명하자면, R-Format은 피연산자로 2개의 Read Register(Rs, Rt) Number와 1개의 Write Register(Rd) Number를 가진다.

위 이미지 (강의 교재 figure 4.7) 와 같이 살펴보자.

Registers에서는 3개의 Register Number(각 5 bits)를 입력으로 받는다. 그리고 출력으로 두 Read Register의 값을 읽어와 ALU로 넘긴다. ALU에서는 Instruction의 종류에 맞는 연산을 수행하는데, 이는 ALU operation이라는 플래그에 의해 결정된다. 그리고 연산 결과가 Write Register에 저장되어야 하므로 ALU result는 Registers의 Write Data 포트로 들어가고 Write Register에 저장된다.

Load / Store Instructions

lw, sw를 구현할 때 신경써야 할 점은, 메모리에 접근한다는 점과 레지스터 2개(Rs, Rt)를 입력받는데 lw에서는 Rt가 Write로 사용된다는 것이다. 또, 메모리 offset을 16 bit 즉시 값(lw, sw가 I-Format이기 때문)으로 입력받고 이를 Rs에서 읽은 베이스 주소값(32 bit)에 더해야 한다. 우리가 사용할 ALU는 32 bit 값 두 개의 연산을 할 수 있기 때문에 16 bit인 offset을 32 bit로 확장한 다음 ALU의 입력 값으로 넘겨야 하는데, 이 때 Sign Extension을 하여 값을 유지한 채로 32 bit로 바꿔준다.

위 이미지 (강의 교재 figure 4.9) 는 이 단계에서 사용되는 두 유닛을 나타낸다. Sign Extension Unit은 16 bit 즉시값을 32 bit로 변환하는데 사용되고, Data Memory Unit은 메모리 주소를 입력받고 MemWrite, MemRead 플래그 상태에 따라 메모리를 읽거나 Write Data 입력으로 들어온 데이터(sw일 때 Rt의 값)를 메모리에 쓴다. 이 때, 메모리 주소는 (Rs 레지스터에 들어 있는 베이스 주소 + Sign Extension한 offset)으로 결정된다. lw이면 Read Data를 Rt에 저장하기 위해 Registers의 Write Data로 연결해준다. 지금까지 나온 부분을 합쳐서 그리면 아래 이미지와 같다.

같은 포트로 들어갈 수 있는 데이터들은 MUX로 Instruction에 따라 선택할 수 있도록 하였고 MUX, Registers, Data Memory, ALU의 동작을 제어하기 위한 플래그(빨간 색으로 표시된 것)들은 다음 포스팅에 설명할 Control에서 Instruction의 종류에 따라 결정한다.

지금까지 만든 회로로 실행할 수 있는(Control이 있다고 가정) 명령어는 add, sub, and, or, stl, lw, sw 이다. 이제 beq, j만 남았다. 일단 j는 다음 포스팅에서 다루도록 하겠다.

Branch Instructions

beq는 I-Format이기 때문에 값이 같은지 비교할 두 레지스터와 두 값이 같을 때 수행할 Instruction의 주소 Offset을 16 bit 즉시값을 피연산자로 갖는다. lw, sw와 마찬가지로 즉시값은 Sign Extend하여 32 bit로 만들어 준다. 하지만 beq에서는 Shift left를 두 번(4배) 해주는데, Instruction은 1 word이고 word가 위치한 곳은 정렬되어 있기 때문에 항상 주소값의 뒷자리가 00이다. 바이트 정렬에 대해서는 링크 1(영어) 링크 2(한글) 을 참고하면 더 자세하게 알 수 있고, 2장의 Branch Addressing (포스팅은 아직 올리지 않음) 을 설명하는 부분에서 앞서 설명되었다.
Branch Target Address는 (PC + 4) + (offset * 4)으로 계산할 수 있고 (이것도 2장에서 이미 언급), 두 레지스터(Rs, Rt)의 값이 같으면 이 주소가 PC에 저장된다. 두 레지스터의 값을 비교할 때는 ALU에서 두 값을 뺀 다음, Zero 출력이 1이 되는지 확인한다. ALU의 Zero는 연산의 결과가 0이면 1이되고 아니면 0이 되는 출력값이다. ALU에는 출력이 ALU Result와 Zero 총 2개가 있다고 생각하면 된다.

Composing the Elements

앞서 Instruction Fetch, R-Format, Load / Store 부분을 합친 회로를 보여줬는데 여기서는 요소들을 합칠 때 생각해 볼 것들을 알아볼 것이다.

합치기 전 각각의 Datapath들은 한 가지 Instruction을 실행할 수 있을 것이고 여러 Instruction을 동시에 수행하기 위해 이들을 병렬적으로 놓는다면 ALU 같이 여러 Datapath에 등장하는 요소는 같은 것이 여러 개가 필요할 것이다. 중복된 부품은 비용 증가로 이어지기 때문에, 그렇기 보다는 한 요소에 들어가는 Input을 선택적으로 넣을 수 있도록 MUX를 놓는 것이 더 효율적이다. 그래서 앞에서 보여준 회로는 MUX를 이용해 중복을 피하며 합칠 수 있었다. 그리고 이 MUX의 출력을 선택하는 플래그를 결정하기 위해 Control이 필요한 데 이는 다음 포스팅의 주제이다.

MUX는 beq까지 합친 회로에서 어떤 부분에서 필요할까?

  1. ALU 입력 : 레지스터 입력(add, sub, and, or, slt) or 즉시값(lw, sw)
  2. Register Write Data : ALU 결과(add, sub, and, or, slt) or 데이터에서 읽은 값(lw)
  3. 다음 PC 값 : PC + 4(add, sub, and, or, slt, lw, sw) or Branch Target Address(beq)
  4. Write Register Number : Rd(add, sub, and, or, slt) or Rt(lw)

beq까지 전부 합치고 Control, ALU Control까지 추가한 그림이다. Control에 대해서는 다음 포스팅에서 다루겠지만, 간단하게 말하자면 opcode를 읽고 instruction의 종류에 따라 MUX에서 어떤 값을 선택할지, 메모리를 쓸 지 읽을지, 레지스터에 값을 저장할 지 등에 대한 선택을 한다고 생각하면 된다. ALU의 연산을 결정하는 것은 ALU Control이라는 Control을 한 번 더 거쳐서 결정하게 된다.
PC는 State Element이고, 나머지는 Combinational Element이기 때문에 전체 회로를 도는 데에는 1 Clock이 소요(CPI = 1)되어야 한다. 즉, 이 회로가 도는 속도에 따라 프로세서의 클럭 주기가 결정된다고 할 수 있다.

관련글 더보기

댓글 영역