Processor
Instruction Execution
- 동일한 행동: PC에 있는 Instruction 주소를 가져온다 -> 해당 Instruction에 대한 레지스터를 메모리에서 참조한다
- 다른 행동: 산술연산 / 메모리에 관련있는 lw, sw / 분기를 나누는 branch
- PC를 바꾸는 행동: 다음 Instruction으로 넘어감(PC + 4) / branch를 통해 분기이동(target address)
- branch에서 target address인 immediate는 PC + 4가 생략되어 있음
- 밑에 Processor의 구조를 보면 왜 3이 아니라, 2인지 이해가능
Overview
First
1. PC에서 주소를 꺼냄
1-1. PC는 4씩 더해짐
1-2. 만약 branch 명령어라면 PC+4된 값에 다시한번 branch의 immediate에 해당하는 값만큼 더함
2. PC에 해당하는 Instruction을 Instruction memory에서 꺼냄
3. 해당 Instruction이 사용하는 레지스터들을 Registers에서 가공함
4. ALU에서 레지스터들을 연산함
5. 연산결과를 Data memory에 저장하거나(sw), 메모리에 접근하지 않고 바로 다시 레지스터에 저장함
Second
- 전선이 겹치는 부분은 MUX(멀티플렉서)를 사용해 연결
- MUX는 2^n개의 신호를 n개의 선택자를 통해 1개의 신호로 선택하는 회로
Third
- MUX의 선택자를 Control부분에서 제어해줌
- Instruction에 따라 Control Signal이 달라져서 어떠한 동작을 할지 결정가능
Mechanism
Logic Design
- Combinational element: AND-gate, ALU 등 연산요소
- State element: register, 메모리에 store, load 등 메모리요소
- 모든 Cobinational element는 CPU의 한 Clock cycle에 진
Building a datapath
PC 증가
- PC는 현재 실행중인 명령어를 가리킴
- 명령어가 실행되면 PC에 4를 올려 다음의 Instruction으로 주소가 바뀜
Arithmetic Instruction
- 산술연산(add, sub)을 하는 R Format은 rs, rt, rd를 3개 사용
- 연산처리를 하는 Instruction이면 ALU를 사용해 연산
- Zero는 branch Instruction에서 값을 비교할때, 같으면 1이 나옴(두 값을 빼 0이되면 같은 값이므로 Zero라고 이름을 정함)
Memory Access Instruction
- 메모리접근(lw, sw)을 하는 I Format은 rs, rt, immediate를 사용
- immediate는 16비트인데 이는 Base Address에서 offset으로 더하기됨
- 즉, 32bit인 주소와 16비트 immediate를 더하기 위해 32비트로 확장하는 Sign extension unit이 필요
Branch Instruction
- 값을 비교해 분기를 나누는(beq, bne) 명령어는 I Format으로 rs, rt, immediate를 사용
- immediate는 16비트이므로 연산을 위해 Sign-extend
- 두 값이 같은지 비교하기 위해 Zero Control를 사용
- 또한 immediate만큼 더하는게 아니라 4를 곱한값(Alignment restriction)을 더하므로 shift left 2
Example
- Control Signal과 모든 부분을 합쳤음
- MUX는 4개 존재
Arithmetic Instruction
1. R Format이므로 rs, rt, rd로 4번째 필드인 rd를 사용하기때문에 RegDst=1
2. 레지스터에 값을 쓰기 때문에 RegWrite=1
3. I Format이 아니므로, Sign Extend는 사용하지않고 ALU Control에 LSB방향 필드인 function코드가 들어감
4. ALU는 ALU Conrol에서 더하기일지 빼기일지 명령을 받음
5. ALU 피연산자는 Register에서 rs와 rt의 값을 두개 받으므로 해당 MUX=0으로 rt의 값을 선택(1이라면 Sign Extend의 값을 받음)
6. 메모리를 사용하지 않으므로 마지막 MUX=0으로 값을 바로 Write Data
7. PC는 branch 연산을 하지 않았으므로, PCSrc=0으로 0을 선택
Load word
1. I Format이므로 rs, rt, immediate를 사용하기 때문에 RegDst=0
2. 레지스터에 값을 쓰기 때문에 RegWrite=1(sw였으면 0)
3. I Format이므로 Sign Extend를 사용하고 ALU control은 ALUOp Control Signal이 정해줌
4. ALU는 ALU Control에서 Offset을 더하라고 명령을 받음
5. ALU 피연산자는 Register에서 rs에 immediate에 더해야하므로, Sign Extend에서 MUX=1로 가져옴
6. 메모리에 rs+immediate에 해당하는 주소의 값을 불러와야하므로 마지막 MUX=1, 가져온 값을 rt에 Write Data, 또한 메모리에서 값을 읽으므로 MemRead=1
7. PC는 branch 연산을 하지 않았으므로, PCSrc=0으로 0을 선택
Branch
1. I Format이므로 rs, rt, immediate를 사용하기 때문에 RegDst=0
2. 레지스터에 값을 쓰지 않기에 RegWrite=0
3. I Format이므로 Sign Extend를 사용하고 ALU control은 ALUOp Control Signal이 정해줌
4. ALU는 ALU Control에서 두값을 비교하기 위해 빼라고 명령을 받음
5. ALU는 두 값을 빼서 값이 0이나오면 Zero=1이되므로 이를 PCSrc에 전달
6. PCSrc는 값이 같다면 Sign-Extend에서 immediate를 가져와 4배곱하고(shift left2) 더함 PC + 4 + 4 * Immedate
7. Branch는 메모리에 접근하거나 레지스터에 값을 쓰거나 읽는 동작을 하지 않으므로 ALU이후 동작은 하지 않음
Implementation
- ALUOp: 메모리접근=00 / Branch=01 / R Format=10
- Function Field: 제일 왼쪽 2비트는 ALUOp를 따라감
- 2비트인 ALUOp와 6비트인 Function Field를 통해 ALU Control Input이 결정
- ALU Control Input은 add, subtract, AND, OR, slt 등 다양한 액션 존재
Control Signal
- RegDst: rd가 있는지 없는지
- RegWrite: R Format으로 rd에 값을 쓰거나, lw로 rt에 값을 불러오는지
- ALUSrc: 오프셋연산으로 Sign-Extend를 쓰는지
- PCSrc: branch연산에서 immediate로 오프셋을 더하는지
- MemRead: 메모리에서 값을 load하는지
- MemWrite: 메모리에 값을 store하는지
- MemtoReg: 메모리에 접근하는지(R Format, load word에만 사용)