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