[컴퓨터 구조] The Processor(프로세서) - Pipeline(2)

Yeontachi·2025년 5월 14일

Pipelined Datapath and Control

MIPS Pipelined Datapath

파이프라이닝 구조를 이해하기 위해서는 하나의 명령어가 여러 단계를 거치며 실행된다는 점을 먼저 이해해야 한다. MIPS 구조에서는 명령어 실행 과정을 다섯 단계로 나누며, 이들 각각은 파이프라인의 한 단계가 된다.

  1. IF(Instruction Fetch) : 명령어 메모리로부터 명령어를 가져옴
  2. ID(Instruction Decode and Register Read) : 명령어를 해석하고 레지스터 값을 읽음
  3. EX(Execute or Address Calculation) : 연산 수행 또는 주소 계산
  4. MEM(Memory Access) : 데이터 메모리 접근(load/store)
  5. WB(Write Back) : 연산 결과 또는 메모리 데이터를 레지스터에 기록

이렇게 구성된 5단계 파이프라인에서는 한 사이클에 최대 5개의 명령어가 동시에 실행될 수 있다. 즉, 매 사이클마다 새로운 명령어가 파이프라인에 들어오고, 이전 명령어들은 다음 단계로 차례차례 진행된다.

파이프라인 구조에서는 데이터가 일반적으로 왼쪽에서 오른쪽으로 흐른다. 즉, 명령어는 PC와 명령어 메모리에서 시작해 레지스터 파일, ALU, 메모리 접근, 그리고 마지막으로 레지스터 파일로 돌아가는 방향으로 처리된다. 이 흐름은 각 단계를 거칠수록 점점 더 "완성된 상태"가 되어 가는 구조다.

그러나 이 단방향적 흐름에는 두 가지 예외가 존재한다:

  1. Write-back 단계에서는 결과가 다시 중앙에 위치한 레지스터 파일로 되돌아간다.
  2. PC의 다음 값 선택은 MEM 단계에서 계산된 분기 주소(branch address)와 일반적인 PC + 4 값 중에서 선택되며, **다음 명령어 가져오기(IF) 단계에 영향을 준다.

이러한 오른쪽에서 왼쪽으로의 흐름은 현재 명령어에는 영향을 주지 않지만, 이후 명령어들에게는 영향을 준다. 따라서 첫 번째 예외는 데이터 해저드(data hazard)를, 두 번째 예외는 제어 해저드(control hazard)를 일으킬 수 있다.

단계별 사용하는 실제 자원 정리

파이프라인 단계단계 명칭사용하는 실제 자원 (Physical Resources)설명
IFInstruction FetchPC (Program Counter)
Instruction Memory (IM)
명령어 주소 계산 및 명령어 읽기
IDInstruction Decode/Register ReadRegister File (읽기)
Sign Extender
명령어 해석 및 레지스터 값 읽기
EXExecute / Address CalculationALU (Arithmetic Logic Unit)
Adder (분기 주소 계산용)
연산 수행, 주소 계산, 분기 조건 처리
MEMMemory AccessData Memory (DM)메모리 읽기/쓰기
WBWrite BackRegister File (쓰기)계산 또는 메모리 값 레지스터에 저장

Pipeline register

파이프라인 구조는 명령어를 여러 단계로 나누어 각 단계가 병렬적으로 작동하도록 함으로써 처리량을 높인다. 하지만 각 단계는 서로 독립적으로 동작하기 때문에, 한 단계에서 생성된 결과(데이터, 주소, 제어 신호 등)는 다음 단계로 정확히 전달되어야 한다.

이를 위해 사용하는 것이 파이프라인 레지스터이다. 각 사이클마다 앞 단계의 출력 결과를 보관하고, 다음 단계가 그것을 입력으로 사용할 수 있도록 한다.

  • PC(Program Conuter)는 별도의 파이프라인 레지스터는 아니지만, IF 단계에서 사용되는 데이터 공급원이며, 예외 발생 시 반드시 상태를 저장해야 하는 아키텍쳐적으로 중요한 상태 레지스터이다.
  • IF/ID ~ MEM/WB 레지스터들은 단순히 파이프라인 흐름 유지를 위한 임시 저장소이기 때문에, 예외 발생 시 초기화되거나 무시될 수 있다.
  • Write Back(WB) 단계 끝에는 별도의 파이프라인 레지스터가 존재하지 않는다. 그 이유는 WB 단계에서 이미 레지스터 파일이나 메모리, 또는 PC같은 상태(state)가 직접 갱신되기 때문이다. (추가 레지스터가 의미 없다는 뜻이다.)

lw 명령어의 파이프라인 실행 과정

1단계: Instruction Fetch(IF)

  • 동작 설명
    • PC가 가리키는 주소를 사용해 Instruction Memory(IM)에서 명령어를 가져온다.
    • PC는 +4 증가되어 다음 명령어 주소로 준비된다.
    • 가져온 명령어(32비트)증가된 PC 값IF/ID 파이프라인 레지스터에 저장된다.
  • 이 단계에서는 명령어가 어떤 종류인지 모른다. 따라서 어떤 명령어든 수행할 수 있도록 PC + 4 값도 함께 저장한다. 예를 들어, beq 명령어는 이 값을 사용해 분기 주소를 계산하므로 모든 정보를 일단 넘겨준다.

2단계: Instruction Decode & Register Read(ID)

  • 동작 설명
    - IF/ID 레지스터에 저장된 명령어의 필드를 해석한다.(예: rs, rt, immediate)
    • Register File에서 rs, rt, 레지스터의 값을 읽는다.
    • 16비트 immediate 상수는 sign-extend되어 32비트로 확장된다.
    • 이 모든 정보는 ID/EX 파이프라인 레지스터로 전달된다.
  • 실제로 lw는 rt만 필요하지만, 컨트롤 신호 복잡성을 줄이기 위해 모든 명령어에 대해 두 레지스터 값(rs, rt)과 즉시값(immediate)을 무조건 넘긴다. 모든 명령어가 이 단계를 공통적으로 사용하기 때문에, 명령어 종류와 상관없이 기본 동작을 수행한다.

3단계: Execution/Address Calculation(EX)

  • 동작 설명
    - ID/EX 레지스터에서 받은 값들 중, rs 레지스터의 값과 sign-extended immediate를 ALU에서 더한다.
    • 이 결과는 메모리 주소로 사용된다.
    • ALU 결과와 함께 필요한 정보들은 EX/MEM 파이프라인 레지스터로 저장된다.
  • EX는 실제로 데이터를 읽는 것이 아니라 데이터가 있는 주소를 계산하는 단계이다. 이 주소는 다음 단계인 MEM에서 데이터 접근에 사용된다.

4단계: Memory Access(MEM)

  • 동작 설명
    • EX/MEM 레지스터에서 전달된 주소를 사용해 Data Memory(DM)에서 데이터를 읽는다.
    • 읽은 값은 MEM/WB 파이프라인 레지스터에 저장된다.
  • 이 단계에서 lw 명령어는 메모리에서 값을 가져오게 된다.
  • 가져온 값은 다음 WB 레지스터에 저장된다.

5단계: Write Back(WB)

  • 동작 설명
    • MEM/WB 레지스터에 저장된 데이터레지스터 파일(Register File)의 rt에 기록한다.
    • 이로써 lw 명령어는 데이터를 성공적으로 레지스터로 가져온 셈이다.
  • 원래의 설계에서는 어느 레지스터에 쓸 것인지(rt)를 WB 단계까지 전달하지 않고 있었다. 이 문제를 해결하기 위해 ID 단계에서 결정된 목적지 레지스터 번호(rt)를 ID/EX->MEM/WB를 거쳐 WB 단계까지 전달해야 한다.
  • Corrected Datapath

전체 단계별 요약

단계주요 동작저장된 정보
IF명령어 가져오기명령어, PC+4
ID명령어 해석, 레지스터 읽기rs, rt, immediate, PC+4
EX주소 계산ALU 결과
MEM메모리 읽기메모리 데이터
WB레지스터 쓰기MEM 데이터 → rt

SW 명령어의 파이프라인 실행 과정

1단계: Instruction Fetch(IF)

  • 동작 설명
    • PC가 가리키는 주소를 사용해 Instruction Memory(IM)에서 명령어를 가져온다.
    • PC는 +4 증가되어 다음 명령어 주소로 준비된다.
    • 가져온 명령어(32비트)증가된 PC 값IF/ID 파이프라인 레지스터에 저장된다.
  • 이 단계에서는 명령어가 어떤 종류인지 모른다. 따라서 어떤 명령어든 수행할 수 있도록 PC + 4 값도 함께 저장한다. 예를 들어, beq 명령어는 이 값을 사용해 분기 주소를 계산하므로 모든 정보를 일단 넘겨준다.
  • load와 동일한 방식으로 동작한다.

2단계: Instruction Decode & Register File Read(ID)

  • 동작 설명
    - IF/ID 레지스터에 저장된 명령어의 필드를 해석한다.(예: rs, rt, immediate)
    • Register File에서 rs, rt, 레지스터의 값을 읽는다.($t0: 메모리 주소 계산을 위한 base 주소, $t1: 실제로 저장할 데이터)
    • 16비트 immediate 상수는 sign-extend되어 32비트로 확장된다.
    • 이 모든 정보는 ID/EX 파이프라인 레지스터로 전달된다.
  • sw명령어는 register 값을 두 개 모두 필요로 한다.
  • load와 동일한 방식으로 동작한다.

3단계: Execute/Address Calculation(EX)

  • 동작 설명
    - ALU가 $t0 + offset을 계산하여 유효한 메모리 주소를 생성한다.

    • 동시에 rt 레지스터 값(저장할 데이터)도 함께 EX/MEM 파이프라인 레지스터에 저장한다.
    • 즉, 주소 + 저장할 데이터 둘 다 EX/MEM에 저장되어야 한다.
  • lw와 달리 sw는 메모리에서 값을 읽는 것이 아니라, 레지스터의 값을 메모리에 쓰는 것이 목적이다. 이 때문에 위 그림에서 두 번째 레지스터(rt)의 값도 Ex/MEM에 전달되도록 처리한다.

4단계: Memory Access(MEM)

  • 동작 설명
    - EX/MEM 레지스터에서 받은 주소를 사용해 Data Memory에 접근한다.
    • EX/MEM 레지스터에 저장되어 있던 저장할 값(rt)을 해당 주소에 write한다.
  • 데이터 쓰기가 완료되면 sw 명령어의 본질적인 작업은 끝난다.
  • 이 명령어는 결과를 레지스터에 되돌려주지 않기 때문에, 다음 단계인 WB에서는 아무 동작도 하지 않는다.

5단계: Write Back(WB)

  • 아무 일도 하지 않는다. sw는 데이터를 메모리에 저장하는 것이 목적이므로 레지스터 파일을 변경하지 않는다.
  • 따라서 MEM/WB 파이프라인 레지스터는 갱신되지 않는다.

전체 흐름 요약

단계주요 동작전달 정보
IF명령어 fetch, PC+4명령어, PC+4
ID레지스터 값 읽기, sign-extensionrs 값(base), rt 값(저장할 값), offset
EX주소 계산, 저장할 값 준비주소(→ EX/MEM), 저장할 데이터(→ EX/MEM)
MEM메모리 접근 및 쓰기EX/MEM에서 주소와 데이터 사용
WB동작 없음없음

Pipeline 설계 원리

  1. 정보를 다음 단계에서 사용하려면 반드시 파이프라인 레지스터를 통해 전달해야 한다. 그렇지 않으면 다음 명령어가 덮어쓰므로 정보가 사라진다.
  2. 각 자원은 오직 한 파이프라인 단계에서만 사용되어야 한다. Instruction Memory, Register File, ALU, Data Memory 등은 공유 자원이므로 한 단계에서만 사용하는 방식으로 설계되어야 Structural Hazard를 피할 수 있다.

Pipeline의 시각화 : Diagram

다중 클럭 사이클 파이프라인 다이어그램 (Multiple-Clock-Cycle Pipeline Diagram)

여러 클럭 사이클에 걸친 명령어의 전체 실행 과정을 한 장의 표 형태로 표현하는 것이다.

  • 세로 방향 : 실행 순서대로 나열된 명령어들 (위 -> 아래)
  • 가로 방향 : 시간 흐름, 즉 클럭 사이클의 진행 방향(왼 -> 오)
  • 각 셀에는 IF, ID, EX, MEM, WB 등 파이프라인 단계가 차례로 적혀 있다.

단일 클럭 사이클 파이프라인 다이어그램 (Single-Clock-Cycle Pipeline Diagram)

특정 클럭 사이클에서 전체 파이프라인 안의 상태를 보여준다. 즉, 수직 방향으로 시간의 한 순간을 잘라낸 snapshot이다.

  • 가로 방향 : 데이터가 흐르는 방향(왼 -> 오, IF -> WB)
  • 각 단계 위에 어떤 명령어가 해당 단계에 있는지를 표시(예: lw, sub, add,...)
  • 각 단계에서 사용되는 자원(레지스터 파일, 메모리, ALU 등)파이프라인 레지스터의 데이터 흐름을 상세하게 시각화

파이프라인 제어 (Pipelined Control)

파이프라인은 단순히 데이터 경로만 나누는 것이 아니라, 각 단계에서 정확한 제어 신호를 어떻게 생성하고, 전달하며, 사용하느냐가 핵심이다. 제어 신호는 각 명령어가 실행될 때 어떤 연산을 할지, 어디에 결과를 쓸지, 어떤 경로를 사용할지를 지정하기 때문에 파이프라인 설계에 있어 제어의 흐름을 정확히 파악하는 것이 중요하다.

단일 사이클 설계와 마찬가지로, MIPS 파이프라인에서도 9개의 제어 신호가 사용된다. 단일 사이클에서는 이 신호들이 동시에 생성되고 사용되지만, 파이프라인에서는 각 단계에 해당하는 제어 신호만 해당 단계에서 사용된다. 따라서 제어 신호도 명령어와 함께 파이프라인 레지스터를 따라 흐르도록 해야 한다.

기존 단일 사이클에서 사용한 ALU 제어(ALUOp), PCSrc 결정 논리, 목적지 레지스터(MemtoReg), 분기 제어(Branch) 등 동일한 논리가 재사용된다. 하지만 이제는 각 제어 신호가 해당 파이프라인 단계에서만 유효하도록 파이프라인 레지스터를 따라 전파되어야 한다.

중요 확장 사항으로 ALU 제어를 위해 R-타입 명령어의 funct 필드(6비트)ID/EX 레지스터에 포함되어야 한다. 이유는 EX 단계에서 ALU 제어를 하기 위해 필요하며, 이 정보는 immediate 필드의 하위 6비트와 겹치므로 sign-extension 후에도 그대로 유지된다.

ALU Control은 ALUOp 신호와 funct 필드 값을 조합하여 ALU가 어떤 연산을 수행할지를 결정한다.

제어 신호의 파이프라인 단계별 분류

단계사용되는 제어 신호
EXRegDst, ALUSrc, ALUOp, Branch
MEMMemRead, MemWrite
WBMemtoReg, RegWrite

제어 신호들은 ID 단계에서 생성되어, ID/EX 레지스터에 저장되고, 이후 각 단계에서 필요할 때 사용된다.

위 그림은 모든 제어 신호가 파이프라인 레지스터에 포함된 확장된 Datapath이다. 제어 신호는 ID 단계어서 한 번만 생성되며, 이후 단계에 따라 해당 파이프라인 레지스터를 통해 흐름이 유지된다. 각 단계에서는 자기 단계에 맞는 제어 신호만 사용하고, 나머지는 다음 레지스터로 넘긴다.

profile
기초를 다지는 중입니다.📚🧑‍💻

0개의 댓글