Building a Datapath
Datapath: CPU에서 데이터와 주소를 처리하는 요소 (register, ALU, MUX 등)
Instruction Fetch
모든 Instruction을 처리하기 위한 첫 단계

- PC(Program Counter): 다음 실행할 명령어의 주소를 저장하고 있는 register.
- IM(Instruction Memory): PC로부터 받은 주소에 맞는 Instruction을 내보낸다.
- Add(Adder): 다음 명령어의 주소를 가리키기 위해 있다. MIPS는 Instruction의 단위가 word(4byte)이기 때문에 PC + 4를 한다.
Decoding Inst.
Fetch해온 Instruction을 해석하는 단계

- 명령어의 opcode와 function field를 Control Unit에 전달한다.
- Fetch와 Decode는 모든 명령어가 동일하게 실행되며, 이후 excute 단계부터 명령어의 format에 따라 datapath가 달라진다.
R-Format Inst.
R-Format Instructions의 datapath

- Register File: 2개의 read register(rs, rt)와 1개의 write register(rd)를 가지고 있고, 연산 결과를 write data에 쓴다.
- ALU: 레지스터에서 나온 2개의 read data를 input으로 가지고, 다시 결과로 나온 값을 write data로 쓴다.
Load/Store Inst.
I-Format lw/sw instruction의 datapath

- Register File: 1개의 read(rs)와 1개의 write(rt)를 받는다.
- Sign Extend: lw 명령어의 offset field는 16bit이기 때문에, rs에서 읽은 base addr(32bits)와 더하기 위해 Sign Extend를 통해 32bits로 확장하고 ALU로 넘겨진다.
- lw는 Data Memory를 읽고, 레지스터를 업데이트한다.
- sw는 레지스터의 값을 Data Memory에 기록한다.
Branch Inst.
I-Format branch instruction의 datapath

- branch 명령어는 I-format이므로 값을 비교할 때, 비교할 두 레지스터와 두 값이 같을 때 수행할 명령어의 offset을 피연산자로 갖는다.
- lw/sw와 마찬가지로 offset은 Sign Extend하여 32bits로 만들어주는데, branch에서는 추가적으로 2번 shift left 한다. (offset*4를 위해 -> 4byte 단위이기 때문에 하위 2bits이 00이기 때문)
- branch target addr은 (PC+4)+(offset*4)로 계산할 수 있고, rs == rt 라면 이 값이 PC에 저장된다.
- rs와 rt 값을 비교할 때는 ALU에서 두 값을 빼고 결과가 0인지 1인지 확인한다.
Jump Inst.

Full Datapath

- mux를 통해 어떤 명령어의 data source인지 구분해 다른 명령어에 다른 경로로 대응할 수 있도록 한다.
'Computer Science > Computer Architecture' 카테고리의 다른 글
Building a Datapath
Datapath: CPU에서 데이터와 주소를 처리하는 요소 (register, ALU, MUX 등)
Instruction Fetch
모든 Instruction을 처리하기 위한 첫 단계

- PC(Program Counter): 다음 실행할 명령어의 주소를 저장하고 있는 register.
- IM(Instruction Memory): PC로부터 받은 주소에 맞는 Instruction을 내보낸다.
- Add(Adder): 다음 명령어의 주소를 가리키기 위해 있다. MIPS는 Instruction의 단위가 word(4byte)이기 때문에 PC + 4를 한다.
Decoding Inst.
Fetch해온 Instruction을 해석하는 단계

- 명령어의 opcode와 function field를 Control Unit에 전달한다.
- Fetch와 Decode는 모든 명령어가 동일하게 실행되며, 이후 excute 단계부터 명령어의 format에 따라 datapath가 달라진다.
R-Format Inst.
R-Format Instructions의 datapath

- Register File: 2개의 read register(rs, rt)와 1개의 write register(rd)를 가지고 있고, 연산 결과를 write data에 쓴다.
- ALU: 레지스터에서 나온 2개의 read data를 input으로 가지고, 다시 결과로 나온 값을 write data로 쓴다.
Load/Store Inst.
I-Format lw/sw instruction의 datapath

- Register File: 1개의 read(rs)와 1개의 write(rt)를 받는다.
- Sign Extend: lw 명령어의 offset field는 16bit이기 때문에, rs에서 읽은 base addr(32bits)와 더하기 위해 Sign Extend를 통해 32bits로 확장하고 ALU로 넘겨진다.
- lw는 Data Memory를 읽고, 레지스터를 업데이트한다.
- sw는 레지스터의 값을 Data Memory에 기록한다.
Branch Inst.
I-Format branch instruction의 datapath

- branch 명령어는 I-format이므로 값을 비교할 때, 비교할 두 레지스터와 두 값이 같을 때 수행할 명령어의 offset을 피연산자로 갖는다.
- lw/sw와 마찬가지로 offset은 Sign Extend하여 32bits로 만들어주는데, branch에서는 추가적으로 2번 shift left 한다. (offset*4를 위해 -> 4byte 단위이기 때문에 하위 2bits이 00이기 때문)
- branch target addr은 (PC+4)+(offset*4)로 계산할 수 있고, rs == rt 라면 이 값이 PC에 저장된다.
- rs와 rt 값을 비교할 때는 ALU에서 두 값을 빼고 결과가 0인지 1인지 확인한다.
Jump Inst.

Full Datapath

- mux를 통해 어떤 명령어의 data source인지 구분해 다른 명령어에 다른 경로로 대응할 수 있도록 한다.