전공 과목/컴퓨터 구조

Lecture 13: The Processor - 2

arsenic-dev 2024. 11. 29. 17:52

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

Creating a Single Datapath

▶ datapath components

1. R-Format

▶ Datapath for the memory instructions and R-type instructions

 

1, 2

R-format은 MemWrite와 MemRead signal이 안 띄워지기 때문에 Read data 2에서 Write data로 가는 것은 쓰레기 값이다.

이렇게 MemWrite, MemRead, control signal에 의해 유효한 값인지 아닌지 결정이 된다.

 

3

더한 값이 주소인 경우엔 ALU의 연산 결과가 Address로 유효한 값이 가지만, 여기 더한 값이 데이터 값이기에 MUX로 간다.

이때 어차피, memory signal이 아예 안 띄워졌으므로 읽히지도, 쓰여지지도 않을 것이다.

 

4

MemtoReg: memory에서 register로 가냐, 마냐에 따른 signal 값(0 or 1)으로, load word일 때 띄워진다.

 

여기선 memory에서 register로 가는 게 아니기 때문에 MemtoReg 값이 0이 되어 그냥 다음으로 넘어가서,

더한 값이 전달되어 register에 저장한다.

 

※ opcode: control signal로,  format에 맞게 어떤 레지스터가 필요한지, 몇 번 레지스터를 사용해야 하는지 파악하게 한다.

 

※ 빨간색 부분이 유효하고, 검은색 부분은 쓰레기 값으로 유효하지 않은 값들을 나타낸다.

2-1. I-Format: load word

▶ Datapath for the memory instructions and I-type instructions

 

Problem

Unlike R-format, Input of the I-format is different

 

Solution

Add the multiplexer(MUX) to control this circumstances (MUX로 상황 제어)

 

1, 2

rt 값은 base address로부터 32만큼 떨어진 곳의 값을 저장하는 곳이기에 Read register가 아니라, Write register로 가야한다.

Read data1은 base address인 rs의 값이다.

 

또한, '32'라는 constant는 Sign-extend를 통해 32 비트로 변환된다.

그리고 이때 MUX는 constant를 유효한 값으로 받는다.

 

※ 실제론 $t0가 Read register 2로 들어가서 Read data 2에 값이 담기지만, I-format에선 이 값이 필요 없기에 유효한 값으로 인식하지 않을 뿐이다.

애초에 $t0 값을 안 받으면 되지 않나?

 

위와 같은 의문이 들 수 있지만, 지금 상태에선 instruction이 decode되지 않아 어떤 format인지 알지 못해 다 받는 것이다.

때문에 이렇게 다 받고 MUX로 거르는 방식을 사용한다.

 

3

ALU는 base address와 이동할 값인 offset(constant)값을 더해 주어야 한다.

때문에 이 경우 ALU는 항상 더하기를 해주어야 한다. (Target address에 접근)

 

※ ALU 연산은 데이터 값이 아니라 주소값이다.

 

4

Address 값을 받아 접근하여 데이터 메모리에서 값을 Write data에 유효하게 받아들여 $t0 레지스터에 데이터 값을 쓴다.

▶ 실제 구현

 

RegDst: 주어진 Register가 Destination인지 아닌지, 즉 rd가 있으면 1을 띄워 rd 값을 받아들이고, rd가 없으면 0을 띄운다.

 

※ rd가 없다. = I-forma이다.

2-2. I-Format: store word

▶ 실제 구현

 

위 코드는 $t0 값을 읽 base address $t1에서 offset 1200만큼 떨어진 위치에 저장하겠다는 의미이다.

즉, store word에선 $t0가 Write register가 아니라 Read register이다.

때문에 Read data 2는 $t0의 값을 읽는다.

 

하지만 이때, R-format과 달리 Read data 2는 ALU 연산이 되면 안 된다.

Read data 2는 Write data로 간다.

 

※ lw, sw일 경우 ALU는 항상 더하기 연산을 한다.

 

※ 여기서 RegDst는 Don't care(1이든 0이든 상관 X)이기 때문에 아무런 의미가 없다. 왜냐하면 RegWrite signal이 띄워져야 유효하게 저장되기 때문이다.

2-3. I-Format: beq

▶ Addressing in Branches(beq, bne) and Jumps

 

※ PC + 4로 업데이트되어 있는 이유는 PC 값을 불러 Fetch 하자마자 그 다음 명령어를 준비하기 위해서이다.

▶ 실제 구현 (beq $s0, $s1, branch_location)

 

$s0, $s1 값이 같으면 branch_location으로 이동하는 것이니,

먼저 $s0와 $s1 값을 비교하기 위해 Read register로 가져와야 한다.

 

ALU 연산에서 $s0와 $s1을 뺀 값이 0이면, 즉 zero signal을 만족하는지 체크를 한다. (branch에서 ALU는 항상 빼기)

zero signal이 띄워지면 값이 같은 것이므로 branch를 해도 되는 것이다.

 

branch_location은 Sign-extend를 통해 32 비트로 확장한 후, byte addressing을 위해 4를 곱해준다. (Offset × 4)

 

Add

  • 1번째 Add: PC + 4
  • 2번째 Add: (PC + 4) + Offset × 4

이때 branch 조건을 만족하면 Target Address로 PC값이 없데이트되고, (zero signal = 0 -> not taken)

조건을 만족하지 않으면 MUX에 의해 PC + 4로 이동한다. (zero signal = 1 -> taken)

3. J-Format

▶ Jump: Jump to the address

Pseudodirect addressing: Addressing method for jump (j, jal에만 해당, jr에는 해당하지 않음.)

▶ Datapath for the J-type instructions

 

Datapath for the Pseudodirect addressing

1. 32비트 중 26비트만 끊어 Address 값 가져오기 -> 26 비트

2. Shift left 2 해주기 (뒤에 00 붙이기) -> 28 비트

3. PC의 MSB로부터 4비트를 앞에 붙이기 -> 32 비트

 

2개의 MUX

  • PCSrc: PC + 4 / branch
  • JToPC: jump / PCSrc로부터 선택된 것

A Simple Implementation Scheme

ALU Control

ALUOp (2-bit) + funct (function field) (6-bit)

ALU control은 instruction type에 의해 결정된다.

▶ ALU Control

▶ Truth Table

 

※ ALU는 control line이 4개 있다. 즉 ALU control Input은 4개의 비트로 이루어져 있다.

 

※ ALUOp + funct 8비트 -> [ALU Control] -> ALU control Input 4비트 -> [ALU]

 

ALUOp

ALUOp는 opcode에 의해 결정된다.

  • LW, SW: 00
  • Branch Equal: 01 (오른쪽에 시그널 띄워짐.)
  • R-type: 10 (왼쪽에 시그널 띄워짐.)

▶ ALUOp

 

※ ALUOp가 11이면 잘못된 값이라는 의미다. (오류 메시지)

 

※ R-Format만 funct가 있기에, ALUOp가 00, 01일 땐 Funct field가 아예 무시가 된다. (Don't care)

▶ ALUOp: 00, 01

  • ALUOp: 00 -> ALU control Input: 0010 -> ALU 연산: add (addressing 계산 위함.)
  • ALUOp: 01 -> ALU control Input: 0110  -> ALU 연산: subtract (같은지, 다른지 비교 위함.)

▶ R-Format funct field

▶ Funct field Truth Table

 

※ X는 Don't care을 의미한다. 때문에 ALUOp1이 1이기만 하면 ALUOp2의 값에 상관없이 R-Format임을 알 수 있다. 물론, R-Format의 ALUOp는 10이긴 하다.

▶ ALUOp: 10

  • ALUOp: 10 -> ALU control Input is determined by the truth table

Designing the Main Control Unit

9 Control Signals (7 Signals + 2 lines ALUOp (00, 01, 10))

▶ 9 Control Signals

▶ 9 Control Signals - Real

1. R-format

▶ R-format

 

RegDst (1)

R-Format 이므로

 

RegWrite(1)

연산을 수행한 결과를 Dst 레지스터에 쓰므로 (rd)

 

※ lw일 땐 RegDst (0)을 띄워줌으로써 rt 값을 Write register에 받을 수 있도록 한다.

▶ R-format - Real

2-1. I-format (lw)

▶ I-format (lw)

 

RegWrite (1)

dst 레지스터에 쓰므로

 

ALUSrc (1)

Instruction의 const/address를 더하므로

 

MemRead (1)

Data memory의 데이터를 읽으므로

 

MemtoReg (1)

Data memory로부터의 데이터를 저장하므로

 

※ MemtoReg: memory에서 register로 갈 건지, 말 건지를 나타낸다.

▶ I-format - Real (lw)

2-2. I-format (sw)

▶ I-format - Real (sw)

 

ALUSrc (1)

Instruction의 const/address를 더하므로

 

MemWrite (1)

Data memory의 데이터에 쓰므로

 

※ sw는 wrtie register하는 게 목적이 아니기에 MemtoReg (0)을 띄워준다.

2-3. I-format (beq)

▶ I-format (beq)

 

Branch (1)

zero signa이 (1)로 띄워져 beq signal이 만족하면 PCSrc가 (1)

▶ I-format - Real (beq)

3. J-format (jump)

▶ J-format - Real (jump)

 

※ jump는 간단하게 jump signal이 띄워지기만 하면 된다.

Instruction별 Control Signal

▶ Instruction별 Control Signal

 

※ ALUOp1 + ALUOp2 = ALUOp