경희대학교 김정욱 교수님의 컴퓨터 구조 수업을 기반으로 정리한 글입니다.
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
'전공 과목 > 컴퓨터 구조' 카테고리의 다른 글
Lecture 15: The Processor - 4 (0) | 2024.12.03 |
---|---|
Lecture 14: The Processor - 3 (1) | 2024.12.01 |
Lecture 12: The Processor - 1 (0) | 2024.11.27 |
Lecture 10: Arithmetic for Computers - 2 (0) | 2024.10.17 |
Lecture 09: Arithmetic for Computers - 1 (1) | 2024.10.16 |