School Lecture Study/Computer Architecture

Simple DataPath

vㅔ로 2021. 12. 16. 19:26
728x90

중간고사 때는 워낙 말아먹고 이번에 공부를 거의 새로 하다시피 하니까 컴구가 재밌다...

  • 혼자 공부한 걸 정리한 거라 틀린 부분 있을 수 있습니다. 지적 환영합니다 ;)

Introduction

  • MIPS의 구현은 simple version, realistic pipelined version 두 가지로 나뉜다.
  • 해당 instruction만 구현하는 processor라고 가정한다.
    • 메모리 참조 : lw, sw
    • 연산, 논리 : add, sub, and, or, slt
    • 제어, 전달 : beq, j (j는 약간 모양이 다르다)

Simplified version

먼저 이게 Simplfied 된 version이다.

전혀 안 간단한 것 같지만 pipelined datapath 보다는 훨씬 간단하다.

clocking methodology, basic logic circuit 부분은 생략하겠다.

Datapath?

  • CPU 안의 데이터와 주소들을 처리하는 요소들이다.
  • Ex) 레지스터, ALUs, mux's, memories...

Instruction Fetch

  • PC는 지금 실행될 instruction의 주소를 갖는다. 32-bit register이며, 하나의 clock에 의해 움직인다.
  • PC에 저장된 주소가 Instruction memory로 전달된다. 주소를 읽어서, 32bit instruction을 다음으로 전달한다.
  • 위의 Adder에서 다음 instruction으로 넘어갈 수 있도록 PC와 4를 더해서 PC에 다시 저장한다.
  • 이제 PC + 4는 다음 clock tik이 올 때까지 기다린다.

R-Format Instructions

사칙연산, 논리 연산을 수행하기 위해 두 레지스터의 값을 읽어오고, 다른 레지스터에 결과 값을 쓴다.

Ex) add, sub, and, or, slt

  • Read register 1에는 Rs가 해당되며, instruction의 25-21번째 부분에 해당한다.
  • Read register 2에는 Rt가 해당되며, instruction의 20-16번째 부분에 해당한다.
  • Write register는 Rt 또는 Rd가 들어갈 수 있다.
  • Write data 부분에서는 32bit data를 쓸 수 있다.
  • RegWrite
    • 레지스터에 data를 쓰기를 원할 때 : 1
    • 아니면 0
  • ALU에는 ALU Operation이 존재하는데, 총 16개의 다른 연산들이 있다. (add, sub, and, or 등)
  • Zero
    • ALU result가 0일 때 : 1
    • 아니면 0
  • ALU result는 ALU 연산을 하고 난 후의 결과 값이다.

** R-format의 경우 ALU result는 Rd 레지스터에 쓰일 수 있으므로, ALU result가 Write data로 전달되는 경우도 있다.

Load / Store Instructions

  • Data Memory는 레지스터가 아니라, 메모리이다! 값이 메모리에 저장되고 불러올 수 있다
  • I-format의 16bit offset을 이용하여 주소를 계산해야 한다
    • Sign-extend로 16bits에서 32bits로 늘리는 것
  • load 연산은 메모리를 읽고, 레지스터를 업데이트 한다.
  • store 연산은 레지스터의 값을 데이터 메모리에 쓰는 연산이다.
  • MemWrite
    • 1 : 메모리에 쓸 것인가
    • 아니면 0
  • MemRead
    • 1 : 메모리를 읽을 것인가
    • 아니면 0

Branch Instructions

** 여기서는 beq만 살펴본다.

  • Rs와 Rt를 사용하므로, 레지스터 1, 2를 읽어와서 ALU로 전달한다.
  • beq에서는 Rs와 Rt가 같은지 확인해야 한다. Rs와 Rt 레지스터 안의 값을 읽어와서 뺀 후, 값이 0이면 같고, 아니면 다르다.
  • ALU operation(sub)을 진행했을 때 Zero가 1이면 branch control logic으로 이동한다.
  • offset이 마찬가지로 16bits 이므로 32bits로 바꾼 다음, bytes로 바꾸기 위해 왼쪽 shift 연산을 수행한다. (4를 곱함)
  • 이렇게 구한 address는 Branch로 이동해야 하는 target Address이고, beq이므로 PC에 더하는 연산이다. 그러므로, Adder를 사용해서 PC + 4에 targetAddress를 더하는 연산을 수행한다. → PC에 저장

🤔 총 몇 개의 MUX가 필요할까?

  1. ALU input에서, 2번째 register(Rt)인지, 아니면 16bit immediate constant인지 확인하는 MUX
  2. 레지스터에 데이터를 쓸 때, ALU output이 돌아와서 write 하는 것인지(R-format의 add 같은 거), 아니면 lw가 레지스터에 write하는 것인지?
  3. 다음 PC input에서, 'PC + 4'인지, 아니면 branch의 target address로 이동해야 하는지?
  4. 레지스터에 값 쓰기를 할 때, Rt에 써야 하는 지 (lw) Rd에 써야 하는지(R-format)?

Control

Control은 ALU Control, Main Control로 나뉜다.

ALU Control

  • ALU operation은 총 4bit로 주어진다.
  • R-type의 경우 funct field에 의해서 instruction이 결정된다.
  • ALU function은 4bit로 주어지기 때문에 16가지가 존재한다.

** lw, sw, add 모두 ALU add function을 사용한다.

** beq는 값이 같은지 확인하기 위해서 ALU sub function을 사용해서 확인한다.

  • 각각 instruction마다 opcode를 갖고 있는데, 간단히 하기 위해 ALUOp를 사용했다.
  • lw와 sw는 똑같이 add function을 이용하기 때문에 ALU OP가 같다. lw, sw, beq는 R-type이 아니므로 function이 필요가 없다.
  • R-type의 funct를 보면 앞이 10으로 똑같다. (ALUOp에 의한 값)

→ 이렇게 2-bit의 ALUOp와 func의 4-bit를 합쳐 k-map을 통해 4-bit ALU control을 생성한다.

** 'x'는 어떤 값이 오든지 상관 없다는 뜻

k-map 만드는 방법은 생략하겠다.

Main Control Unit

  • R-type : rs와 rt는 값을 읽어오는 레지스터. rd는 값을 쓰는 레지스터. 뒤에 funct에는 위에서 썼던 ALU Control이 들어간다.
  • Load/Store : rs는 값을 읽어오는 레지스터. address는 sign-extend 후 add 되는 주소값이다.
    • Load : rt는 값을 가져오는 레지스터
    • Store : rt는 값을 읽어오는 레지스터
  • Branch : rs, rt 모두 값을 읽어오는 레지스터. address는 Load/Store와 동일.

그렇게 어렵지 않다.

  • RegDst : 어떤 레지스터에 쓸 것인가
    • lw는 Rt에 쓰므로 0
    • R-format의 경우 Rd에 쓰므로 1
    • sw와 beq는 don't care
  • ALUSrc : 레지스터를 읽을 것인가, sign-extend를 할 것인가
    • R-format과 beq는 레지스터를 읽어와야 하므로 0
    • lw, sw는 sign-extend이므로 1
  • MemtoReg : 메모리에서 Register로 값을 쓸 것인가?
    • R-format은 메모리에서 Register로 값을 쓰지 않으니 0
    • lw는 메모리에서 Register로 값을 써야 하니 1
    • sw, beq는 어차피 RegWrite가 0이면 RegDst, MemtoReg 모두 불가능 하므로 don't care이다.
  • MemRead : 메모리를 읽을 것인가?
    • R-format, sw, beq은 메모리 관련 활동 X → 0
    • lw만 메모리에서 값을 읽으므로 1
  • MemWrite : 메모리에 쓸 것인가?
    • R-format, beq, lw는 메모리에 쓰지 않으므로 0
    • sw는 메모리에 값을 쓰기 때문에 1
  • Branch : branch를 사용하는가?
    • beq만 branch를 사용하므로 1
    • 나머지는 0
  • R-format : ALUOP1, beq : ALUOP0

 

728x90

'School Lecture Study > Computer Architecture' 카테고리의 다른 글

Cache  (0) 2021.12.23
Each instruction's datapath  (0) 2021.12.23
MIPS Instructions  (0) 2021.12.10
[5-2] Division  (0) 2021.10.21
[5-1] Overflow / Multiplication  (0) 2021.10.18