본문 바로가기

load-use 정지와 전달 시간표

값 준비·소비 시점을 고정하고 정지 사이클의 PC·IF/ID 유지와 bubble을 끝까지 추적합니다.

파이프라인의 단계 이름만으로 정지 수를 계산할 수는 없습니다. LOAD 결과가 언제 준비되고 다음 명령이 언제 그 값을 요구하는지, 전달 경로가 어디에 있는지를 먼저 정해야 합니다.

이 시간표의 다섯 가정

  1. IF·ID·EX·MEM·WB의 5단계, 단계당 1사이클입니다. 단계 레지스터는 사이클 끝 에지에서 갱신합니다.
  2. LOAD 주소는 EX에서 계산하고 값은 MEM 끝에 준비합니다. ADD는 EX 시작에 값을 요구합니다.
  3. MEM/WB → EX 전달을 허용합니다. MEM에서 아직 준비하지 않은 값은 전달할 수 없습니다.
  4. 명령·데이터 메모리는 분리합니다. 캐시 실패·가변 지연·분기는 없으며 일반 ALU 결과 전달을 허용합니다.
  5. ID의 ADD와 EX의 LOAD가 의존하면 PC·IF/ID를 한 에지 유지하고 ID/EX에 bubble을 넣습니다. 먼저 들어간 LOAD는 계속 진행합니다.

IR이라는 이름을 쓰더라도 어떤 단계의 명령 레지스터인지 정해야 합니다. 여기서 유지하는 것은 IF/ID에 있는 ADD이며 모든 단계의 IR을 멈추는 동작이 아닙니다. bubble은 유효 비트 0인 빈 슬롯으로 쓰기·저장 부작용이 없습니다. 실제 NOP 명령을 메모리에서 인출한 것과 구분합니다.

LOAD·ADD·독립 명령을 끝까지 따라가기

I1=LOAD R1,[R4], I2=ADD R2,R1,R3, I3=ADD R5,R6,R7입니다. R3=5, LOAD 데이터=7이면 I2는 12를 계산해야 합니다. I3는 I1·I2의 결과를 사용하지 않습니다. 전체 시간표에서 유지는 이미 들고 있는 명령을 다시 진행시키지 않는 상태입니다.

load-use: 같은 칸에서 한 사이클씩 따라가기

I1 = LOAD R1,[R4], I2 = ADD R2,R1,R3, I3 = ADD R5,R6,R7. R3 = 5, LOAD 데이터 = 7. 단계 칸은 현재 사이클, PC·IF/ID는 사이클 시작값입니다.

이 예의 조건

  • IF·ID·EX·MEM·WB의 5단계, 단계당 1사이클입니다. 단계 레지스터는 사이클 끝 에지에서 갱신합니다.
  • LOAD 주소는 EX에서 계산하고 값은 MEM 끝에 준비합니다. ADD는 EX 시작에 값을 요구합니다.
  • MEM/WB → EX 전달을 허용합니다. MEM에서 아직 준비하지 않은 값은 전달할 수 없습니다.
  • 명령·데이터 메모리는 분리합니다. 캐시 실패·가변 지연·분기는 없으며 일반 ALU 결과 전달을 허용합니다.
  • ID의 ADD와 EX의 LOAD가 의존하면 PC·IF/ID를 한 에지 유지하고 ID/EX에 bubble을 넣습니다. 먼저 들어간 LOAD는 계속 진행합니다.
세 명령과 bubble의 전체 시간표 · C1~C8
명령 / 사이클12345678
I1 LOADIFIDEXMEM, 끝에 7 준비WB———
I2 ADD—IFID, 위험 검출ID 유지EX, 전달값 7 사용MEMWB—
I3 독립 ADD——IF, 보류IF 보류 유지IDEXMEMWB
빈 슬롯———EX bubbleMEM bubbleWB bubble——
PC·IF/ID·ID/EX · 사이클 끝 에지 후
사이클 끝PCIF/ID 내용ID/EX 내용이유
1104I1빈 슬롯첫 인출
2108I2I1정상 진행
3108I2 유지bubbleI1이 EX인 동안 I2 위험 검출; I3를 아직 확정하지 않음
4112I3I2LOAD 값이 끝에 준비; 다음 EX에서 쓸 수 있음
5116다음 명령I3정상 진행 재개

C2 · 정상 진행

LOAD는 ID, ADD는 IF에 있습니다. 명령들이 한 단계씩 진행하며 아직 LOAD 값이 필요한 EX에 도착하지 않았습니다.

C2의 다섯 단계

상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.

C2의 다섯 단계IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.if → idid → exex → memmem → wbIF 인출: I2 ADD 정상 진행IF 인출I2 ADD정상 진행ID 해독: I1 LOAD 정상 진행ID 해독I1 LOAD정상 진행EX 실행: 빈 슬롯 유효 명령 없음EX 실행빈 슬롯유효 명령 없음MEM 메모리: 빈 슬롯 유효 명령 없음MEM 메모리빈 슬롯유효 명령 없음WB 기록: 빈 슬롯 유효 명령 없음WB 기록빈 슬롯유효 명령 없음
C2의 다섯 단계IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.if → idid → exex → memmem → wbIF 인출: I2 ADD 정상 진행IF 인출I2 ADD정상 진행ID 해독: I1 LOAD 정상 진행ID 해독I1 LOAD정상 진행EX 실행: 빈 슬롯 유효 명령 없음EX 실행빈 슬롯유효 명령 없음MEM 메모리: 빈 슬롯 유효 명령 없음MEM 메모리빈 슬롯유효 명령 없음WB 기록: 빈 슬롯 유효 명령 없음WB 기록빈 슬롯유효 명령 없음

IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.

직전 단계와 현재 단계
상태직전 단계 없음현재: C2 · 정상 진행
PC · 시작값—104
IF/ID · 시작값—I1
끝 에지 후—PC 108 · IF/ID I2 · ID/EX I1
값 준비·소비—LOAD 값은 아직 준비되지 않았습니다.

변화와 이유

  • I1: IF → ID. I2가 IF에 들어옵니다.
  • 빈 슬롯에는 유효한 명령이 없으며 쓰기·저장 부작용도 없습니다.
  • 다음 C3에서 I2와 I1의 R1 의존성을 확인합니다.

장면별 값과 변화
예의 값과 변화
관찰·상황값·보충 정보변화·이유
C2 · 정상 진행

LOAD는 ID, ADD는 IF에 있습니다. 명령들이 한 단계씩 진행하며 아직 LOAD 값이 필요한 EX에 도착하지 않았습니다.

  • PC · 시작값: 104
  • IF/ID · 시작값: I1
  • 끝 에지 후: PC 108 · IF/ID I2 · ID/EX I1
  • 값 준비·소비: LOAD 값은 아직 준비되지 않았습니다.
  • I1: IF → ID. I2가 IF에 들어옵니다.
  • 빈 슬롯에는 유효한 명령이 없으며 쓰기·저장 부작용도 없습니다.
  • 다음 C3에서 I2와 I1의 R1 의존성을 확인합니다.
C3 · 의존성 검출

ID의 ADD는 EX의 LOAD 결과 R1을 사용합니다. 이 사이클 끝에는 PC·IF/ID를 유지하고 ID/EX에 bubble을 넣습니다.

  • PC · 시작값: 108
  • IF/ID · 시작값: I2
  • 끝 에지 후: PC 108 · IF/ID I2 · ID/EX bubble
  • 값 준비·소비: LOAD 값은 아직 준비되지 않았습니다.
  • I1: ID → EX, I2: IF → ID. 두 명령의 R1 의존성을 검출합니다.
  • I3는 IF 요청/보류 위치에 있지만 IF/ID에 확정하지 않습니다.
  • 끝 에지: PC·IF/ID 유지, ID/EX에는 bubble을 넣습니다.
C4 · 한 사이클 대기

ADD는 ID에서 기다리고 LOAD는 MEM으로 진행합니다. LOAD 값 7은 이번 사이클 끝에야 준비됩니다.

  • PC · 시작값: 108
  • IF/ID · 시작값: I2
  • 끝 에지 후: PC 112 · IF/ID I3 · ID/EX I2
  • 값 준비·소비: MEM 끝에 7 준비. 다음 EX에서 소비 가능.
  • I2는 ID에 남고 EX는 bubble입니다. 먼저 들어간 I1은 MEM으로 이동합니다.
  • LOAD 값 7은 사이클 끝에 준비됩니다. 같은 사이클 시작의 EX에는 늦습니다.
  • 끝 에지: I2를 ID/EX에 넣고 I3를 IF/ID에 저장하며 PC를 진행합니다.
C5 · 전달·재개

MEM/WB의 7을 ADD의 EX 입력으로 전달합니다. 7 + 5 = 12를 계산하고 인출·해독을 다시 진행합니다.

  • PC · 시작값: 112
  • IF/ID · 시작값: I3
  • 끝 에지 후: PC 116 · IF/ID 다음 명령 · ID/EX I3
  • 값 준비·소비: MEM/WB의 7을 EX에서 소비. R2 기록은 C7.
  • I2: ID → EX. 현재 MEM이 아닌 MEM/WB에서 7을 전달합니다.
  • I3: IF 보류 → ID. bubble은 EX → MEM으로 이동합니다.
  • EX 결과 12는 I2의 WB인 C7에서 R2에 기록합니다.

load-use: 같은 칸에서 한 사이클씩 따라가기

I1 = LOAD R1,[R4], I2 = ADD R2,R1,R3, I3 = ADD R5,R6,R7. R3 = 5, LOAD 데이터 = 7. 단계 칸은 현재 사이클, PC·IF/ID는 사이클 시작값입니다.

이 예의 조건

  • IF·ID·EX·MEM·WB의 5단계, 단계당 1사이클입니다. 단계 레지스터는 사이클 끝 에지에서 갱신합니다.
  • LOAD 주소는 EX에서 계산하고 값은 MEM 끝에 준비합니다. ADD는 EX 시작에 값을 요구합니다.
  • MEM/WB → EX 전달을 허용합니다. MEM에서 아직 준비하지 않은 값은 전달할 수 없습니다.
  • 명령·데이터 메모리는 분리합니다. 캐시 실패·가변 지연·분기는 없으며 일반 ALU 결과 전달을 허용합니다.
  • ID의 ADD와 EX의 LOAD가 의존하면 PC·IF/ID를 한 에지 유지하고 ID/EX에 bubble을 넣습니다. 먼저 들어간 LOAD는 계속 진행합니다.
세 명령과 bubble의 전체 시간표 · C1~C8
명령 / 사이클12345678
I1 LOADIFIDEXMEM, 끝에 7 준비WB———
I2 ADD—IFID, 위험 검출ID 유지EX, 전달값 7 사용MEMWB—
I3 독립 ADD——IF, 보류IF 보류 유지IDEXMEMWB
빈 슬롯———EX bubbleMEM bubbleWB bubble——
PC·IF/ID·ID/EX · 사이클 끝 에지 후
사이클 끝PCIF/ID 내용ID/EX 내용이유
1104I1빈 슬롯첫 인출
2108I2I1정상 진행
3108I2 유지bubbleI1이 EX인 동안 I2 위험 검출; I3를 아직 확정하지 않음
4112I3I2LOAD 값이 끝에 준비; 다음 EX에서 쓸 수 있음
5116다음 명령I3정상 진행 재개
C2의 다섯 단계

상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.

C2의 다섯 단계IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.if → idid → exex → memmem → wbIF 인출: I2 ADD 정상 진행IF 인출I2 ADD정상 진행ID 해독: I1 LOAD 정상 진행ID 해독I1 LOAD정상 진행EX 실행: 빈 슬롯 유효 명령 없음EX 실행빈 슬롯유효 명령 없음MEM 메모리: 빈 슬롯 유효 명령 없음MEM 메모리빈 슬롯유효 명령 없음WB 기록: 빈 슬롯 유효 명령 없음WB 기록빈 슬롯유효 명령 없음
C2의 다섯 단계IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.if → idid → exex → memmem → wbIF 인출: I2 ADD 정상 진행IF 인출I2 ADD정상 진행ID 해독: I1 LOAD 정상 진행ID 해독I1 LOAD정상 진행EX 실행: 빈 슬롯 유효 명령 없음EX 실행빈 슬롯유효 명령 없음MEM 메모리: 빈 슬롯 유효 명령 없음MEM 메모리빈 슬롯유효 명령 없음WB 기록: 빈 슬롯 유효 명령 없음WB 기록빈 슬롯유효 명령 없음

IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.

예의 값과 변화
관찰·상황값·보충 정보변화·이유
C2 · 정상 진행

LOAD는 ID, ADD는 IF에 있습니다. 명령들이 한 단계씩 진행하며 아직 LOAD 값이 필요한 EX에 도착하지 않았습니다.

  • PC · 시작값: 104
  • IF/ID · 시작값: I1
  • 끝 에지 후: PC 108 · IF/ID I2 · ID/EX I1
  • 값 준비·소비: LOAD 값은 아직 준비되지 않았습니다.
  • C2의 다섯 단계
  • IF·ID·EX·MEM·WB의 칸 위치는 고정입니다. 각 칸은 현재 사이클의 명령을 나타내며, 화살표는 단계 순서입니다.
  • IF 인출
  • I2 ADD
  • 정상 진행
  • ID 해독
  • I1 LOAD
  • EX 실행
  • 빈 슬롯
  • 유효 명령 없음
  • MEM 메모리
  • WB 기록
  • IF 인출 → ID 해독
  • ID 해독 → EX 실행
  • EX 실행 → MEM 메모리
  • MEM 메모리 → WB 기록
  • I1: IF → ID. I2가 IF에 들어옵니다.
  • 빈 슬롯에는 유효한 명령이 없으며 쓰기·저장 부작용도 없습니다.
  • 다음 C3에서 I2와 I1의 R1 의존성을 확인합니다.
C3 · 의존성 검출

ID의 ADD는 EX의 LOAD 결과 R1을 사용합니다. 이 사이클 끝에는 PC·IF/ID를 유지하고 ID/EX에 bubble을 넣습니다.

  • PC · 시작값: 108
  • IF/ID · 시작값: I2
  • 끝 에지 후: PC 108 · IF/ID I2 · ID/EX bubble
  • 값 준비·소비: LOAD 값은 아직 준비되지 않았습니다.
  • C3의 다섯 단계
  • I3 독립 ADD
  • 저장 보류
  • R1 의존 검출
  • 주소 계산
  • I1: ID → EX, I2: IF → ID. 두 명령의 R1 의존성을 검출합니다.
  • I3는 IF 요청/보류 위치에 있지만 IF/ID에 확정하지 않습니다.
  • 끝 에지: PC·IF/ID 유지, ID/EX에는 bubble을 넣습니다.
C4 · 한 사이클 대기

ADD는 ID에서 기다리고 LOAD는 MEM으로 진행합니다. LOAD 값 7은 이번 사이클 끝에야 준비됩니다.

  • PC · 시작값: 108
  • IF/ID · 시작값: I2
  • 끝 에지 후: PC 112 · IF/ID I3 · ID/EX I2
  • 값 준비·소비: MEM 끝에 7 준비. 다음 EX에서 소비 가능.
  • C4의 다섯 단계
  • 인출 주소 유지
  • 한 사이클 대기
  • bubble
  • 유효 비트 0
  • 끝에 7 준비
  • I2는 ID에 남고 EX는 bubble입니다. 먼저 들어간 I1은 MEM으로 이동합니다.
  • LOAD 값 7은 사이클 끝에 준비됩니다. 같은 사이클 시작의 EX에는 늦습니다.
  • 끝 에지: I2를 ID/EX에 넣고 I3를 IF/ID에 저장하며 PC를 진행합니다.
C5 · 전달·재개

MEM/WB의 7을 ADD의 EX 입력으로 전달합니다. 7 + 5 = 12를 계산하고 인출·해독을 다시 진행합니다.

  • PC · 시작값: 112
  • IF/ID · 시작값: I3
  • 끝 에지 후: PC 116 · IF/ID 다음 명령 · ID/EX I3
  • 값 준비·소비: MEM/WB의 7을 EX에서 소비. R2 기록은 C7.
  • C5의 다섯 단계
  • MEM/WB에 준비된 7을 EX 입력으로 전달해 12를 계산합니다. EX 계산과 R2의 WB 기록은 다른 시점입니다.
  • 다음 명령
  • 전달 7 + 5 = 12
  • R1에 7 기록
  • I2: ID → EX. 현재 MEM이 아닌 MEM/WB에서 7을 전달합니다.
  • I3: IF 보류 → ID. bubble은 EX → MEM으로 이동합니다.
  • EX 결과 12는 I2의 WB인 C7에서 R2에 기록합니다.

C1~C8 전체 시간표와 PC·IF/ID·ID/EX 끝 에지 표는 위 개념도에 함께 놓여 있습니다. 단계 칸의 명령과 PC·IF/ID의 사이클 시작값을 비교한 뒤, 끝 에지 후의 값을 읽으세요.

정지가 없으면 I2의 EX는 4사이클 시작입니다. I1의 데이터는 4사이클 끝에 준비하므로 데이터가 준비되기 전에 I2가 그 값을 요구합니다. 정지 한 번으로 I2 EX를 5사이클 시작으로 옮기면 값을 사용할 수 있습니다. 전달은 준비된 값을 빨리 가져오는 방법이지 미래 값을 가져오는 방법이 아닙니다.

PC와 IF/ID가 실제로 유지되는 에지

주소 100·104·108에 I1·I2·I3가 있고 PC는 다음 인출 주소입니다. 개념도의 끝 에지 표는 해당 사이클 끝 에지 후의 값입니다. 끝에 IF/ID로 넣을 수 있는 정상 인출만 PC를 4 증가시킵니다.

위 개념도의 PC·IF/ID·ID/EX · 사이클 끝 에지 후 표를 확인하세요. C3 끝에는 PC=108과 IF/ID의 I2를 유지하고, C4 끝에는 PC=112와 IF/ID의 I3로 진행합니다.

첫 시간표에서 I3의 IF 표시는 요청/보류 위치이며 사이클 3 끝에는 I3를 IF/ID에 덮어쓰지 않습니다. I3를 같은 PC=108에서 다시 받아 사이클 4 끝에 저장합니다. 실제 인출 버퍼나 캐시에서는 요청을 취소하지 않고 보류할 수도 있으므로 이것은 한 가지 제어 모델입니다.

같은 준비 시점이라도 전달을 없애면

전달 경로가 없으면 ID에서 레지스터 파일의 R1을 읽어야 합니다. 추가로 WB는 사이클 앞부분에 기록하고 ID는 뒷부분에 읽을 수 있다고 가정하면 I1 WB가 5사이클일 때 I2는 그 사이클에 ID를 마치고 6사이클에 EX로 갑니다. 정지는 2회입니다. 같은 사이클 WB→ID 읽기를 허용하지 않으면 더 기다려야 합니다. 이 수치를 모든 CPU에 공통인 “LOAD 정지 공식”으로 외우지 않습니다.

전달 조건I1 준비/기록I2 EX 시작정지 수세 명령의 마지막 WB
MEM/WB→EX 전달MEM 끝 4518
전달 없음, WB 앞/ID 뒤 허용WB 앞 5629

손 시간표를 계산 코드와 대조하기

아래 함수는 위 세 명령의 배치 규칙만 계산합니다. ISA 실행기나 hazard 검출 회로가 아닙니다. 값 준비는 4사이클 끝으로 고정하고, 전달 여부만 비교합니다. 인덱스·출력을 먼저 손 시간표와 비교합니다.

def timing(forwarding=True):
    ready_end = 4
    # 전달: ready_end 다음 사이클 EX. 미전달: WB 앞 기록/ID 뒤 읽기.
    ex_start = ready_end + 1 if forwarding else max(ready_end + 2, 6)
    stalls = ex_start - 4
    table = {
        "LOAD": [(1, "IF"), (2, "ID"), (3, "EX"), (4, "MEM"), (5, "WB")],
        "ADD": [(2, "IF")] + [(c, "ID") for c in range(3, ex_start)]
               + [(ex_start, "EX"), (ex_start + 1, "MEM"), (ex_start + 2, "WB")],
        "I3": [(3, "IF")] + [(c, "IF-hold") for c in range(4, ex_start)]
              + [(ex_start, "ID"), (ex_start + 1, "EX"),
                 (ex_start + 2, "MEM"), (ex_start + 3, "WB")],
    }
    return stalls, table

stalls, table = timing()
assert stalls == 1
assert table["ADD"] == [(2, "IF"), (3, "ID"), (4, "ID"),
                        (5, "EX"), (6, "MEM"), (7, "WB")]
assert table["I3"][-1] == (8, "WB")
assert timing(forwarding=False)[0] == 2
assert timing(forwarding=False)[1]["I3"][-1] == (9, "WB")
load_value, other_input = 7, 5
assert load_value + other_input == 12  # 5사이클 EX의 두 입력
print(stalls, table)

load_use.py로 실행하면 위 ADD 단계 목록과 마지막 I3의 (8, 'WB')를 확인합니다. 코드는 고정 1사이클 MEM·정상 WB=5를 가진 모델만 완성한 것으로, 메모리 응답이 지연되는 경우에는 LOAD 자체의 단계 유지도 함께 바꿔야 합니다.

분기와 실제 파이프라인의 경계

분기는 어떤 사이클에 방향·목표가 확정되는지, 그 전 인출을 허용하는지, 잘못된 경로의 명령이 어디까지 왔는지에 따라 flush 비용이 달라집니다. 이 시간표에는 분기가 없으므로 “정지 1회니까 분기도 1회”라고 결론 내리지 않습니다. MIT 파이프라인 강의는 bypass 경로와 stall을 정의하지만 Beta의 단계·RF 시점은 여기와 같다고 가정하지 않습니다. 실제 ISA/CPU의 전체 예외 처리·superscalar·out-of-order·가변 메모리 응답은 이후 범위입니다.

독립 문제: LOAD 뒤에 한 명령을 띄우면

같은 전달 모델에서 I1=LOAD, I2=독립 ADD, I3=LOAD 결과를 사용하는 ADD로 순서를 바꿉니다. 세 명령의 EX 시작 사이클과 load-use 정지 수를 구하세요. I2가 독립인지 확인하지 않고 순서를 바꾸면 어떤 문제가 생길 수 있나요?

힌트

정지가 없는 세 명령의 EX는 3·4·5사이클입니다. LOAD 값 준비는 여전히 4사이클 끝입니다.

풀이

EX는 3·4·5, 정지는 0회입니다. I3의 5사이클 시작에는 값이 준비돼 전달 가능합니다. 명령 재배치에는 데이터·제어·메모리 부작용의 의존 관계를 보존해야 하므로 아무 명령이나 틈에 넣을 수 없습니다. 다음 제어 신호는 이러한 유지·빈 슬롯을 상태 갱신 규칙으로 연결합니다.