1. IF

- PC(Program Counter): 프로그램 카운터는 현재 실행할 명령어의 주소를 가리키는 레지스터입니다.
- 명령어 가져오기: PC가 가리키는 주소에서 명령어를 메모리로부터 읽어옵니다.
- PC 값 증가: 다음 명령어를 가리키기 위해 PC 값을 4만큼 증가시킵니다. 이는 대부분의 아키텍처에서 명령어의 크기가 4바이트일 때 사용됩니다.
- IF/ID 레지스터: Instruction Fetch/Instruction Decode 레지스터에 현재 가져온 명령어와 업데이트된 PC 값을 저장합니다.
- 분기 명령어 처리: PC 값을 저장하는 이유는 분기 명령어와 같은 상황에서 프로그램의 흐름을 관리하기 위함입니다. 분기 명령어는 실행 중에 PC 값을 변경하여 프로그램의 흐름을 제어하기 때문에, 이전 PC 값을 저장해두어야 이후에 필요한 경우에 다시 사용할 수 있습니다.
2. ID

- 명령어 분해: CPU가 가져온 명령어를 각 구성 요소로 나누는 과정입니다. 이 과정에서 명령어의 오퍼코드, 소스 레지스터, 대상 레지스터, 즉각적인 값(immediate value) 등이 식별됩니다.
- 레지스터 접근: 분해된 명령어를 기반으로 필요한 레지스터에 접근하여 데이터를 읽어옵니다. 이 단계에서는 명령어에서 지정된 레지스터를 확인합니다.
- 부호 확장(sign-extend): 즉각적인 값은 종종 고정된 비트 수로 표현되므로, 이를 32비트와 같이 필요한 비트 수로 확장하는 과정입니다. 이 과정에서 원래 비트의 부호를 유지합니다. 예를 들어, 16비트의 즉각적인 값이 음수인 경우, 부호 확장을 통해 상위 비트를 모두 1로 설정하여 32비트로 변환합니다.
- ID/EX 레지스터: 명령어 디코딩 단계에서 처리된 정보를 ID/EX 레지스터에 저장합니다. 이 레지스터에는 다음 세 가지 값이 포함됩니다:
- 즉각적인 값 (sign-extended immediate value)
- 읽기용 레지스터 (source register)
- 쓰기용 레지스터 (destination register)
- R형과 I형의 차이: 명령어가 R형인지 I형인지에 관계없이 동일한 처리를 수행합니다. R형 명령어는 주로 레지스터 간의 연산을 수행하고, I형 명령어는 레지스터와 즉각적인 값 간의 연산을 포함합니다. 그러나 두 경우 모두 ID/EX 레지스터에 필요한 값을 저장해야 합니다.
3. EX

- 제어 유닛(Control Unit): CPU의 제어 유닛은 명령어의 종류에 따라 다중화기(multiplexer)의 설정을 조정합니다. 이는 ALU의 동작 방식(ALUSrc와 ALUOp)을 결정하는 데 필요한 정보를 제공합니다.
- 다중화기(Multiplexer): 명령어 유형에 따라 ALU의 입력을 선택하는 역할을 합니다. ALUSrc는 ALU의 두 번째 입력으로 사용할 데이터의 출처를 결정하고, ALUOp는 ALU가 수행할 연산의 종류를 결정합니다.
- 즉각적인 값 시프트 및 더하기: 분기 명령어의 경우, 즉각적인 값은 2 비트 시프트되어야 합니다. 이는 MIPS 아키텍처에서 주소 계산 시 즉각적인 값을 4바이트(2비트 시프트)의 단위로 이동시키기 위함입니다. 그 후, 시프트된 즉각적인 값은 PC+4에 더해져 분기 목표 주소를 계산합니다.
- EX/MEM 레지스터: 계산된 두 결과(즉각적인 값과 ALU 연산 결과)는 EX/MEM 레지스터에 저장됩니다. 이는 다음 단계인 메모리 접근 단계에서 사용될 수 있도록 준비하는 과정입니다.
- ALU 계산: 이 경우, 다중화기는 ALU가 $rs(소스 레지스터)와 offset(오프셋) 값을 더하는 계산을 수행하도록 설정됩니다. 그 결과는 EX/MEM 레지스터에 저장됩니다.
- 분기 명령어 여부: 이 문맥에서 강조하는 점은 현재 처리하는 명령어가 분기 명령어가 아니므로, 시프트된 즉각적인 값은 중요하지 않다는 것입니다. 즉, ALU가 계산한 결과가 EX/MEM 레지스터에 저장되고, 이후 단계에서 메모리 접근을 수행할 때 사용됩니다.
4. MEM

- EX/MEM: EX/MEM 레지스터는 실행(EX) 단계와 메모리(MEM) 단계 사이의 정보를 저장합니다. 여기에는 ALU의 계산 결과, 메모리 주소, 및 필요한 제어 신호가 포함됩니다.
- 제어 유닛(Control Unit): 제어 유닛은 EX/MEM에서 읽은 정보를 바탕으로 다음 단계에서 수행할 작업을 결정합니다. 이 단계에서는 메모리 접근과 관련된 작업을 포함합니다.
- 결과 저장: 제어 유닛은 EX/MEM에서 받은 결과를 MEM/WB 레지스터에 저장합니다. MEM/WB는 메모리(MEM) 단계와 쓰기 백(WB) 단계 사이의 정보를 저장합니다. 이 결과는 최종적으로 레지스터에 기록되거나 다른 연산에 사용됩니다.
- 메모리 접근: 제어 유닛은 메모리 주소에 접근하여 데이터의 읽기 또는 쓰기를 수행합니다.
- MemWrite: 메모리에 데이터를 쓰는 신호입니다. EX/MEM에서 메모리 주소와 데이터를 가져와 메모리에 기록합니다.
- MemRead: 메모리에서 데이터를 읽어오는 신호입니다. 메모리 주소에 접근하여 필요한 데이터를 가져옵니다.
- 분기 여부 결정: 제어 유닛은 또한 EX/MEM에서 얻은 정보를 바탕으로 분기가 발생했는지 여부를 판단합니다. 이 결정은 다음 명령어의 실행 흐름에 중요한 영향을 미칩니다. 분기 명령어인 경우, 프로그램 카운터(PC)를 업데이트하여 분기 주소로 이동합니다.
5. WB

- 제어 유닛(Control Unit): 제어 유닛은 명령어의 종류에 따라 어떤 결과를 선택하고 이를 레지스터에 기록할지 결정합니다. 이 단계에서는 MemtoReg와 RegWrite 신호가 중요한 역할을 합니다.
- MemtoReg: 이 신호는 메모리에서 읽은 데이터를 레지스터에 쓸 것인지 여부를 결정합니다. 메모리에서 데이터를 읽어올 때, 이 신호를 사용하여 레지스터에 쓸 데이터를 선택합니다.
- RegWrite: 이 신호는 레지스터 파일에 데이터를 쓸 수 있도록 허용합니다. RegWrite가 활성화되면, 선택된 데이터가 지정된 레지스터에 기록됩니다.
- 명령어의 유형: 만약 현재 처리하는 명령어가 레지스터에 데이터를 다시 쓰는 것과 관련이 없다면, 이 명령어는 이 단계에서 아무 작업도 수행하지 않습니다. 예를 들어, 데이터 처리나 메모리 접근을 하지 않고, 단순히 흐름 제어만 수행하는 명령어일 수 있습니다.
- 메모리 데이터의 레지스터로의 기록: 이 경우, 메모리에서 읽은 데이터가 레지스터에 기록됩니다. 즉, 메모리 접근 단계에서 가져온 데이터가 최종적으로 레지스터 파일에 저장되는 과정입니다.
* https://hackmd.io/@yW7HKRexRASTmH3kBDXQpQ/Sy395BDg5#pipeline-overview
'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글
| 16. Data Hazard(Forwarding & Stall) (0) | 2024.09.30 |
|---|---|
| 15. Hazard (0) | 2024.09.30 |
| 13. Pipeline Register (0) | 2024.09.30 |
| 12. Advantage of Pipeline (0) | 2024.09.30 |
| 11. CPU DATA PATH - J - Type(JUMP) (0) | 2024.09.30 |