전공 과목/컴퓨터 구조

Lecture 12: The Processor - 1

arsenic-dev 2024. 11. 27. 03:32

경희대학교 김정욱 교수님의 컴퓨터 구조 수업을 기반으로 정리한 글입니다.

Datapath of the Processor

▶ Datapath of the Processor

 

※ Processor: 컴퓨터를 실행하는 계산을 수행하는 integrated electronic circuit으로, 쉽게 말해 CPU라고 볼 수 있다.

※ Datapath: instruction을 처리하는 path

 

※ Instruction memory: code가 담겨있는 메모리

Data memory: Stack 혹은 Heap에서 저장된 값이 담겨있는 메모리

※ 위 두 메모리는 실제론 하나의 같은 메모리이다.

 

Fetch stage, decode stage, and execute stage, 이렇게 3개의 stages가 반복된다.

 

회로의 시작점은 PC 값이다.

 

Register file에서 위에서부터 2개의 Register는 input, 맨 아래 Register는 결과값을 저장하는 output이다.

이때, output은 Data에 담겨 맨 아래 Register로 저장된다.

 

 

PC: Program counter의 약자로, 현재 instruction 주소를 가리키는 pointer

PC를 이용해 주소에 대응되는 instruction을 꺼내서 Fetch한다.

Instruction memory: instruction을 저장하는 공간

 

PC 값으로부터 Address를 입력으로 받아, 32 bits의 Instruction을 출력,

이때 R-format이라고 한다면 Instruction은 op(6), rs, rt, rd, shamt, funct(6)으로 이루어져,

첫 번째 Registere엔 rs, 두 번째 Register엔 rt, 세 번째 Register엔 rd 레지스터 주소가 각각 담긴다.

 

Register의 output으로 첫 번째, 두 번째 Register의 값이 ALU의 input으로 들어가 operation 수행 후 Data에 값이 담긴다.

이때, I-format의 경우엔 Instruction은 op(6), rs, rt, constant or address(16)으로 이루어져,

ALU의 input으로 Register의 output인 첫 번째 Register 값과 Instruction memory의 output인 Instruction으로부터,

상수 혹은 주소값을 전달받아 ALU의 두 번째 input으로 들어가게 된다.

1. Fetch stage

▶ Fetch stage 

 

※ Fetch: 꺼내다

 

원하는 instruction을 꺼내는 단계이다.

 

PC는 Instruction memory에 Address로 들어가서 현재 Instruction도 부르지만, 추가적으로 또, PC + 4로 업데이트된다.

이때, 업데이트되는 이유는 그다음 instruction을 수행할 수 있도록 불러주기 위해서이다.

2. Decode stage

▶ Decode stage 

 

어떤 instruction인지 해석하는 단계이다.

 

꺼내온 32 bits의 Instruction을 해석하는 단계로, 일반적으로 Register file에서 일어난다.

이때 해석은 Control이 하고, Registeer file 자체는 해석이 아니라 기계적으로 값을 Register에 집어 넣는다.

 

Control signal에 따라 format에 맞게 어떤 레지스터가 필요한지, 몇 번 레지스터를 사용해야 하는지 파악한다.

 

※ PC 값이 앞에 0000 으로 되어있으면 R-format

3. Execute stage

▶ Execute stage 

 

원하는 operation에 맞게 실제 수행하는 단계이다.

 

lw와 sw도 주소를 계산할 때 ALU operation이 필요하다. (base address + offset, 즉 항상 더하기)

Data memory는 lw, sw 때 사용된다.

lw일 경우엔 input으로 Address를 줘서 output으로 데이터를 가져오고,

sw일 경우엔 input으로 Data를 줘서 Data memory에 값을 저장한다.

 

또한, beq, bne와 같이 branch를 할때에도 같은지 다른지 비교하기 위해 ALU operation이 필요하다. ($t0 - $t1 = 0, 즉 항상 빼기)

Problem - Two different sources can meet

▶ Two different sources can meet

  • branch / 다음 instruction으로 이동 (PC + 4)
  • lw / R-format
  • R-format / I-format

instruction에 따라, 더하여 branch의 경우엔 조건 만족 여부에 따라 둘 중 하나는 무시(쓰레기값), 하나만 유효하게 인식한다.

Solution - Multiplexor (Controller)

▶ Multiplexor (Controller)

 

Control은 opcode를 읽어, 즉 decode하여 format을 파악하여 control signal을 보낸다.

MUX는 control signal에 따라 둘 중 하나를 받는다.

 

ALU는 빼기 연산을 통해 beq, bne 여부를 판단한다.

즉, 빼기 수행시 값이 0이 나오면 같다고 판단하여 zero signal을 보낸다.

 

AND gate는 ALU 빼기 연산 값이 0이고, Control signal이 Branch라고 판단하면,

PC + 4로부터 이동할 offset 값을 받는다.

 

fetch를 하는 단계에서는 어떤 명령어인지 모르기 때문에 준비를 해놔야 한다.

때문에 맨 위 MUX는 branch, 즉 offset 값만큼 이동할지 혹은 다음 명령어로 이동할지를 AND gate에 따라 선택된다.

 

가운데 MUX는 lw면 Data 받아 들이고, R-format이면 ALU operation 값을 받아들인다.

Logic Design Basics

Datapath element(소자)를 이루는 2가지 소자

1. Combinational element (조합 회로)

▶ AND gate, Adder, Multiplexer, Arithmetic/Logic unit

  • Outputs depend only on the current inputs 

입력만 넣으면 그대로 출력된다.

 

2. State element

▶ Instruction memory, Data memory

  • To store data
  • The outputs depend on both their inputs and the contents of the internal state

입력이 바로 출력을 내뱉는 게 아니라, 클럭 시그널(internal state)이 변할 때의 입력에 따라 출력이 결정된다.

Clocking Methodology

▶ Clocking Methodology

 

※ 0 -> 1: rising edge / 1 -> 0: falling edge, 일반적으론 rising edge를 주로 사용한다.

 

Edge-triggered clocking: Update when clock is changed 0 to 1

 

이를 통해 데이터를 기다림으로써 제대로된 데이터를 전달할 수 있도록 한다.

즉, state element가 rising edge일 때까지 기다리고, state element가 가도 된다고 하면 다음 단계로 넘어간다.

 

각각의 단계에서 걸리는 시간은 다르다. 

예를 들어, fetch는 시간이 적게 걸리지만 decode는 시간이 오래 걸린다. 

이러한 각 단계마다 시간이 다 다른 것을 state element가 고려해 다음 단계로 넘어갈지 더 기다릴지 결정한다.

Building Datapath

1.  Instruction Fetch

▶ Datapath elements (소자)

  • Instruction memory: Instruction의 주소를 받아, 이에 대응된 32bits의 instruction을 꺼낸다.
  • Program counter (PC): 현재 프로그램이 실행되고 있는 위치, 즉 현재 instruction의 address를 담고 있다.
  • Adder: PC 값을 통해 instruction memory를 읽어야 되는데, 이때 읽자마자 PC는 PC + 4로 업데이트가 되어야 하기에 이때 사용한다.

▶ Instruction memory + Program counter + Adder -> Fetch 단계

 

PC 값을 통해 주소를 읽고, 그 주소에 맞춰 instruction을 꺼내온다.

이때, 추가적으로 현재 PC에서 4를 더해 그다음 PC 값을 준비한다.

 

Fetch 이후, 바로 Decode 단계로 가는 것이 아니라, state element가 가도 된다고 할 때까지 기다린다.

2.  Instruction Decode

Format에 따라서 Decode(해석)하는 게 조금씩 다르다.

1) R-Format

사칙연산을 하는 format을 말한다.

▶ R-Format

  • op: operation code (명령 코드), 명령어가 수행할 연산의 종류를 나타낸다.
  • rs: register source 1 (5bits - 32registers)
  • rt: register source 2 (5bits - 32registers)
  • rd: register destination (5bits - 32registers)
  • shamt: shift amount, 시프트 연산에서 이동의 크기로 곱셈, 나눗셈에 이용된다.
  • funct: function code, op field가 나타낸 연산의 종류 중 어떤 연산을 나타내는지 연산을 구체적으로 지정한다.

▶ Register file

  • Input: rs, rt, rd의 register 번호를 각각 넣어준다.
  • Output: register 번호에 맞는 값을 꺼낸 후, ALU를 통해 operation한다. 이때, ALU 결과를 Write Data에 넣어준다.
  • Regwrite: Write the data at the clock edge (edge-triggered, statement element 허락 O)

※ '5 \' 의미: 선이 5개 있다는 의미이다.

 

※ ALU에는 선이 4개 있으므로 2^4, 즉 16가지의 operation 중 하나를 수행함을 알 수 있다.

▶ ALU

  • Input: Read data 1, Read data 2
  • Output: Write data에 넣어준다.

※ Zero는 뺄 때 사용한다. 그 외엔 Don't care로 무시하면 된다.

2) I-Format 

상수 연산을 하는 format을 말한다.

▶ I-Format

  • op: operation code (명령 코드), 명령어가 수행할 연산의 종류를 나타낸다.
  • rs: register source 1, base address를 나타낸다.  (5bits - 32registers)
  • rt: register source 2, target(destination)을 나타낸다.. (5bits - 32registers)
  • constant or address: constant는 immediate 연산을 할 때 사용하는 상수 값을 ± 2^15 범위에서 나타내고, address는 접근할 수 있는 주소, 즉 base address에서 어느 정도 떨어질 수 있는지를 ± 2^15 을 통해 나타낸다.

▶ Load/Store (Data memory)

  • Input: Address and Write data
  • Output: Read data from the address
  • Read and write controls are separated: load word의 경우 MemWrite는 0 MemRead는 1, store word의 경우 MemWrite는 1 MemRead는 0이다.

※ MemWrite, MemRead는 명령어에 따라 다르다.

 

address는 데이터에 접근할 주소로, load의 경우엔 값을 꺼내오고 싶은 위치를, store의 경우 값을 저장하고 싶은 위치를 나타낸다. (address는 항상 필요) 이때, Write data의 의미는 데이터의 메모리에 이 값을 쓰겠다는 signal을 주는 것이기 때문에 load의 경우엔 Write data가 아닌 Read data가 중요하다.

 

※ store의 경우 Read data가 필요없다고 해서 Output이 없는 것은 아니다. 단지, 나중에 MUX를 이용해 무시해주는 것이다.

▶ Load/Store (Sign extension unit)

  • MSB of 16-bit inputs is extended to form 32-bit outputs (16 비트를 32 비트로 맞춰주는 역할)
Sign extension은 왜 필요할까?

 

ALU에서 사칙연산시 32 비트끼리 연산한다. 하지만 I-format의 constant or address는 16 비트밖에 태울 수 없기 때문에 sign extension이 필요하게 된다.

 

이러한 sign extension은 값을 바꾸지 않고 단순히 비트만 확장하는 것이기에 MSB를 보고 MSB가 0이면 앞을 0들로 채워주고, 1이면 앞을 1들로 채워주는 것을 의미한다.

▶ To add the 16-bit inputs (signed offset) and 32-bit base register

 

Register와 Address를 더해야 하는데, 16 비트와 32 비트를 그대로 더할 수 없으니 16 비트를 32 비트로 확장해주어야 한다.

▶ Branch (beq)

  • ALU is used to evaluate the branch condition
  • Adder is used to branch target: Branch displacement(이동) = (PC + 4) + 32-bit (sign extended from 16-bit) × 4

※ Branch도 I-format이다.

beq $t1, $t2, offset # t1과 t2가 같으면 offset으로 이동하라는 의미

▶ beq 예시

 

쓰는 게 아니라 같은지 다른지 비교해야 하기에 t1, t2를 Read register 1, 2 Input으로 받아 그에 대응하는 값을 꺼내온다. 그 후, ALU를 통과해 주는데, 이때 ALU의 연산은 같은지 다른지 비교하기 위해 무조건 빼기이다. 즉, 레지스터의 값을 빼서 0인지 아닌지 체크하는데, 뺀 값이 0이면 branch해도 된다는 signal을 띄운다. (zero signal이 1)

 

beq라는 instruction이 켜지고 zero signal이 띄워졌을 때, 이 두 조건을 모두 만족할 때 다음 target으로 이동한다.