5-stage 파이프라이닝은 CPU의 성능을 향상시키기 위해 명령어 처리를 여러 단계로 나누어 동시에 여러 명령어를 처리하는 기술입니다. 이 방식의 주요 장점은 다음과 같습니다:

  1. 성능 향상: 파이프라이닝을 통해 여러 명령어가 동시에 다른 단계에서 처리될 수 있으므로, CPU의 전체적인 처리량(throughput)을 증가시킬 수 있습니다. 각 단계가 독립적으로 작동하므로, 더 많은 명령어가 단위 시간 내에 처리됩니다.
  2. 명령어 처리 시간 단축: 각 명령어는 전체 처리 시간을 5단계로 나누어 수행하므로, 각 명령어가 완료되는 데 걸리는 시간을 줄일 수 있습니다. 파이프라인의 모든 단계가 동시에 작업을 수행하기 때문에 전체적인 성능이 개선됩니다.
  3. 자원 활용 극대화: 각 단계에서 서로 다른 하드웨어 자원을 사용할 수 있으므로, CPU 자원의 활용도를 극대화할 수 있습니다. 이를 통해 자원의 낭비를 줄이고 효율성을 높일 수 있습니다.
  4. 스루풋 증가: 파이프라이닝은 명령어의 스루풋을 증가시켜 CPU의 성능을 높이는 데 기여합니다. 예를 들어, 5-stage 파이프라인을 사용하면 이론적으로 매 사이클마다 하나의 명령어를 완성할 수 있습니다.
  5. 복잡한 명령어 처리 가능: 더 많은 단계를 추가함으로써 복잡한 명령어를 더 효율적으로 처리할 수 있는 가능성이 열립니다. 각 단계에서 수행되는 작업을 세분화하면, 더 복잡한 작업을 효과적으로 처리할 수 있습니다.
  6. 클럭 주기 단축: 파이프라인의 각 단계에서 수행되는 작업이 작아지므로, 클럭 주기를 단축할 수 있습니다. 이는 CPU의 클럭 속도를 높여 전체 성능을 증가시킬 수 있는 기회를 제공합니다.
  7. 병렬 처리: 파이프라인 구조는 명령어 간의 병렬 처리를 가능하게 하여 성능을 향상시킵니다. 예를 들어, 한 명령어가 실행되는 동안 다른 명령어는 디코딩 중에 있거나 메모리에서 읽혀질 수 있습니다.

 

* https://hackmd.io/@yW7HKRexRASTmH3kBDXQpQ/Sy395BDg5#pipeline-overview

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

14. Active at same clock  (0) 2024.09.30
13. Pipeline Register  (0) 2024.09.30
11. CPU DATA PATH - J - Type(JUMP)  (0) 2024.09.30
10. CPU DATA PATH - I -Type(Branch)  (0) 2024.09.30
09. CPU DATA PATH - I - Type(Store Instruction)  (0) 2024.09.30

 

  • IF (Instruction Fetch):
    • 프로그램 카운터(PC)가 현재 실행할 명령어의 주소를 가리킵니다.
    • 해당 주소에서 j 명령어를 메모리에서 가져옵니다.
    • 가져온 명령어를 PC로부터 읽어 들인 후, PC는 다음 명령어의 주소로 업데이트됩니다.
  • ID (Instruction Decode):
    • 가져온 j 명령어를 해독하여 목적 주소를 추출합니다.
    • Jump instruction에서는 소스 레지스터가 없으므로, 이 단계에서 다른 레지스터의 값을 읽을 필요가 없습니다.
    • 제어 신호가 생성되어 다음 단계로 전파됩니다.
  • EX (Execute):
    • Jump instruction은 ALU에서 특별한 연산을 수행하지 않습니다. 따라서 이 단계에서는 주로 분기할 주소를 결정합니다.
    • j 명령어는 목적 주소를 가져와서 ALU의 출력을 생성할 필요가 없습니다.
  • MEM (Memory Access):
    • Jump instruction은 메모리에 접근하지 않으므로 이 단계는 무시됩니다.
  • WB (Write Back):
    • Jump instruction의 경우, WB 단계는 필요하지 않습니다.
    • 대신, PC를 ID 단계에서 추출한 Jump 주소로 업데이트합니다.
    • 이 단계에서 새로운 PC 값은 점프할 주소로 설정됩니다.

 

 

 

  • IF (Instruction Fetch):
    • 프로그램 카운터(PC)가 현재 실행할 명령어의 주소를 가리킵니다.
    • 해당 주소에서 beq 명령어를 메모리에서 가져옵니다.
    • 가져온 명령어를 PC로부터 읽어 들인 후, PC는 다음 명령어의 주소로 업데이트됩니다.
  • ID (Instruction Decode):
    • 가져온 beq 명령어를 해독하여 두 소스 레지스터($t0, $t1)와 즉시값(Offset)을 추출합니다.
    • 소스 레지스터의 값을 읽어옵니다.
    • 두 레지스터의 값을 비교하여 같으면 분기할 주소를 계산합니다. 분기할 주소는 현재 PC 값에 Offset을 더한 것입니다.
    • 제어 신호가 생성되어 다음 단계로 전파됩니다.
  • EX (Execute):
    • ALU(산술 논리 장치)가 두 레지스터 값을 비교합니다.
    • 두 레지스터가 같으면 ALU 출력으로 true를 생성하고, 분기 주소를 계산하여 저장합니다.
  • MEM (Memory Access):
    • Branch instruction에서는 메모리 접근이 필요하지 않으므로 이 단계는 일반적으로 비워두거나 무시합니다.
  • WB (Write Back):
    • Branch instruction의 경우, WB 단계는 필요하지 않습니다. 대신, 분기가 발생하면 다음 명령어의 주소가 변경됩니다.
    • 만약 두 레지스터가 같다면, PC는 ID 단계에서 계산된 분기 주소로 업데이트됩니다.

 

 

 

  • IF (Instruction Fetch):
    • 프로그램 카운터(PC)가 현재 실행할 명령어의 주소를 가리킵니다.
    • 해당 주소에서 sw 명령어를 메모리에서 가져옵니다.
    • 가져온 명령어를 PC로부터 읽어 들인 후, PC는 다음 명령어의 주소로 업데이트됩니다.
  • ID (Instruction Decode):
    • 가져온 sw 명령어를 해독하여 소스 레지스터와 목적 레지스터의 주소, 그리고 즉시값(Offset)을 추출합니다.
    • 소스 레지스터의 값을 읽어옵니다. 이 값은 메모리에 저장될 데이터입니다.
    • 목적 레지스터의 주소를 읽어 메모리 주소 계산에 사용할 준비를 합니다.
    • 즉시값(Offset)을 해독하여 주소 계산에 사용할 준비를 합니다.
    • 제어 신호가 생성되어 다음 단계로 전파됩니다.
  • EX (Execute):
    • ALU(산술 논리 장치)가 목적 레지스터의 값과 즉시값(Offset)을 더하여 최종 메모리 주소를 계산합니다.
    • 이 단계에서 최종 메모리 주소가 ALU의 출력으로 생성됩니다.
  • MEM (Memory Access):
    • ALU에서 계산된 메모리 주소를 사용하여 소스 레지스터의 데이터를 해당 메모리 주소에 저장합니다.
    • 이 단계에서 데이터가 메모리에 실제로 기록됩니다.
  • WB (Write Back):
    • Store instruction의 경우, WB 단계는 일반적으로 수행되지 않습니다. 데이터가 메모리에 저장되므로 레지스터에 쓰는 작업이 필요 없습니다.

 

 

 

  • IF (Instruction Fetch):
    • 프로그램 카운터(PC)가 현재 실행할 명령어의 주소를 가리킵니다.
    • 해당 주소에서 lw 명령어를 메모리에서 가져옵니다.
    • 가져온 명령어를 PC로부터 읽어 들인 후, PC는 다음 명령어의 주소로 업데이트됩니다.
  • ID (Instruction Decode):
    • 가져온 lw 명령어를 해독하여 소스 레지스터 주소와 즉시값(Offset)을 추출합니다.
    • 소스 레지스터의 값을 읽어옵니다. 이 값은 메모리 주소의 기본 주소로 사용됩니다.
    • 즉시값(Offset)을 해독하여 주소 계산에 사용할 준비를 합니다.
    • 제어 신호가 생성되어 다음 단계로 전파됩니다.
  • EX (Execute):
    • ALU(산술 논리 장치)가 소스 레지스터의 값과 즉시값(Offset)을 더하여 최종 메모리 주소를 계산합니다.
    • 이 단계에서 최종 메모리 주소가 ALU의 출력으로 생성됩니다.
  • MEM (Memory Access):
    • ALU에서 계산된 메모리 주소를 사용하여 해당 주소에서 데이터를 읽어옵니다.
    • 읽어온 데이터는 다음 단계인 WB 단계로 전송됩니다.
  • WB (Write Back):
    • 메모리에서 읽어온 데이터를 지정된 목적 레지스터에 저장합니다.
    • 이 과정에서 ID 단계에서 결정된 레지스터 주소를 사용하여 레지스터에 데이터를 쓰게 됩니다.

 

 

  1. IF (Instruction Fetch):
    • 프로그램 카운터(PC)가 현재 실행할 명령어의 주소를 가리킵니다.
    • 해당 주소에서 명령어를 메모리에서 가져옵니다.
    • 가져온 명령어를 PC로부터 읽어 들인 후, PC는 다음 명령어의 주소로 업데이트됩니다.
  2. ID (Instruction Decode):
    • 가져온 명령어를 해독하여 연산 종류를 결정합니다.
    • 소스 레지스터의 주소를 읽어 해당 레지스터의 값을 가져옵니다.
    • 즉시값(Immediate value)도 해독하여 준비합니다.
    • 제어 신호가 생성되어 다음 단계로 전파됩니다.
  3. EX (Execute):
    • ALU(산술 논리 장치)가 소스 레지스터의 값과 즉시값을 사용하여 연산을 수행합니다. 예를 들어, A + immediate 형태의 계산이 이루어집니다.
    • 연산 결과가 ALU의 출력으로 생성됩니다.
  4. MEM (Memory Access):
    • I-type 명령어는 일반적으로 메모리에 접근하지 않으므로 이 단계는 무시될 수 있습니다.
    • 하지만 예를 들어, lw(load word) 같은 I-type 명령어의 경우, 이 단계에서 메모리로부터 데이터를 읽어올 수 있습니다.
  5. WB (Write Back):
    • ALU에서 생성된 결과 또는 메모리에서 읽은 데이터가 대상 레지스터에 쓰여집니다.
    • 해당 레지스터의 주소는 ID 단계에서 결정된 레지스터 주소를 사용합니다.

요약

  • I-type 명령어는 주로 즉시값을 활용하여 레지스터에 데이터를 쓰는 구조로 되어 있습니다.
  • 파이프라인의 각 단계에서 명령어가 어떻게 처리되는지 이해하는 것이 중요합니다.
  • 결과적으로, I-type 명령어는 레지스터에 데이터를 저장하기 위해 IF, ID, EX, MEM(선택적으로), WB 단계를 거칩니다.
  1. Instruction Fetch (IF):
    • 명령어 메모리에서 명령어를 가져옵니다. 프로그램 카운터(PC)를 사용하여 현재 실행할 명령어의 주소를 결정하고, 그 주소에서 명령어를 읽어 옵니다.
    • PC는 다음 명령어 주소로 증가합니다.
  2. Instruction Decode (ID):
    • 가져온 명령어를 해독하고, 필요한 레지스터를 읽습니다.
    • R-type 명령어의 경우, opcode를 확인하여 해당 명령어가 R-type임을 인식합니다.
    • 소스 레지스터(예: rs, rt)에서 값을 읽어옵니다.
    • 명령어의 목적 레지스터(rd)도 식별합니다.
  3. Execute (EX):
    • ALU(산술 논리 장치)를 사용하여 계산을 수행합니다.
    • 소스 레지스터에서 읽은 값들을 ALU에 입력하고, 명령어에 지정된 연산(예: 더하기, 빼기 등)을 수행합니다.
    • 결과는 ALU 결과 레지스터에 저장됩니다.
  4. Memory Access (MEM):
    • R-type 명령어는 메모리 접근이 필요하지 않기 때문에 이 단계는 생략되거나 NOP(No Operation)로 처리할 수 있습니다.
    • 만약 R-type 명령어에 메모리 접근이 필요하다면, 이 단계에서 데이터 메모리에 접근합니다.
  5. Write Back (WB):
    • ALU에서 계산된 결과를 목적 레지스터(rd)에 저장합니다.
    • 이 단계에서 레지스터 파일에 쓰기 작업이 이루어집니다.

이 과정을 통해 R-type 명령어가 실행되고, 결과는 지정된 레지스터에 저장됩니다. 각 단계는 별도의 사이클에서 실행되어 파이프라인이 효율적으로 작동합니다.

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

08. CPU DATA PATH - I - Type(Load Instruction)  (0) 2024.09.30
07. CPU DATA PATH - I - Type(Register Write)  (0) 2024.09.30
05-5. Write Back(WB)  (0) 2024.09.30
05-4. Memory Access(MEM)  (0) 2024.09.30
05-3. Execute(EX)  (0) 2024.09.30

CPU의 Write Back (WB) 단계는 명령어 실행의 마지막 단계로, 메모리나 ALU에서 생성된 결과를 레지스터 파일에 기록하는 과정입니다. 이 단계는 CPU의 상태를 업데이트하고, 다음 명령어의 실행에 필요한 데이터를 준비하는 데 중요한 역할을 합니다.

Write Back (WB) 단계의 주요 기능

  1. 결과 레지스터에 쓰기
    • ALU 연산이나 메모리에서 읽어온 데이터를 지정된 레지스터에 기록합니다. 예를 들어, LW 명령어로 메모리에서 읽은 데이터는 해당 레지스터에 저장되며, ADD 같은 ALU 연산의 결과도 레지스터에 기록됩니다.
  2. 데이터 유효성 검사
    • WB 단계에서는 데이터를 기록하기 전에, 해당 데이터가 유효한지 검증하는 과정이 포함될 수 있습니다. 이는 데이터 위험을 방지하는 데 도움이 됩니다.
  3. 레지스터 선택
    • 어떤 레지스터에 데이터를 쓸 것인지를 결정합니다. 이 과정은 주로 명령어의 디코딩 단계에서 레지스터 주소를 추출하는 방법에 의해 결정됩니다.
  4. 파이프라인의 연속성 유지
    • WB 단계는 CPU 파이프라인의 연속성을 유지하는 데 중요합니다. 이 단계가 원활하게 진행되면, 다음 명령어가 실행될 때 필요한 데이터가 이미 레지스터에 준비되어 있게 됩니다.

WB 단계의 흐름

  1. MEM 단계에서 읽은 데이터 또는 ALU 연산의 결과가 WB 단계로 전달됩니다.
  2. 지정된 레지스터에 결과를 기록합니다. 이 레지스터는 명령어에 의해 결정되며, rd 필드에 정의된 레지스터를 사용합니다.
  3. WB 단계가 완료되면, CPU는 다음 명령어를 준비하여 파이프라인을 계속 진행합니다.

관련 설계 고려 사항

  • 데이터 위험 (Data Hazard): WB 단계에서의 데이터 위험은 주로 Load-Use 위험과 관련이 있습니다. WB 단계에서 데이터가 적절하게 기록되면, 이후 명령어에서 해당 데이터를 사용하는 데 문제가 발생하지 않도록 해야 합니다.
  • 레지스터 파일 설계: WB 단계의 효율성은 레지스터 파일의 설계에 크게 의존합니다. 레지스터 파일의 접근 속도와 구조는 WB 단계의 성능을 결정짓는 중요한 요소입니다.
  • 비동기적 기록: 일부 설계에서는 WB 단계를 비동기적으로 처리하여 CPU의 파이프라인 성능을 높이는 방법을 사용합니다.

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

07. CPU DATA PATH - I - Type(Register Write)  (0) 2024.09.30
06. CPU DATA PATH - R-Type (Register Write)  (0) 2024.09.30
05-4. Memory Access(MEM)  (0) 2024.09.30
05-3. Execute(EX)  (0) 2024.09.30
05-2. Instruction Decode (ID)  (0) 2024.09.30

+ Recent posts