---
schema_version: 1
exam_id: "sose26-probeklausur"
aufgabe: 7
unit_id: "7c-2"
source_group_id: "7c"
official_exam: true
official_solution: true
language: "ko"
---

# 7c-2 — 첫 실제 hazard: t2→bne

> **학습 목표:** 첫 실제 hazard 시점의 producer sub와 consumer bne를 찾아 RAW dependency, pipeline stage 배치, 가능한 forwarding/stall 해결을 구분해 설명할 수 있다.
>
> **왜 따로 배우는가:** hazard 이름만 쓰면 어느 값이 언제 부족한지 증명하지 못합니다. producer rd, consumer rs, snapshot stage, 해결 경로를 한 묶음으로 제시해야 합니다.
>
> **범위:** Aufgabe 7 · 15점 Aufgabe의 최소 학습 단위 · 시험 p14–15 · 공식 해설 p39–40

## 1. 문제 원문 (Deutsch)

이 unit은 공식 Teilaufgabe 또는 표의 한 행·한 access를 학습 가능한 최소 단위로 다시 나눈 것입니다. 아래 전사는 source group `7c`의 공식 독일어 문제 원문이며, 페이지 이미지를 바로 뒤에 함께 두어 코드·표·도식을 대조할 수 있게 했습니다.

~~~text
7c) Hazard-Erkennung in der Pipeline

Bestimmen Sie, welche Befehle sich in den verschiedenen Pipeline-Stufen befinden, wenn der erste Hazard auftritt. Gehen Sie dabei wie folgt vor:

a) Identifizieren Sie die Pipeline-Stufen (Fetch, Decode, Execute, Memory, Writeback), in denen sich die verschiedenen Befehle befinden, sobald der Hazard auftritt.

b) Tragen Sie die entsprechenden Befehle in die Kästchen der Abbildung 4 ein.

c) Geben Sie eine kurze Erklärung dazu, warum ein Hazard entsteht und wie er behoben werden kann.

```text
andi t1, a0, 1
addi x0, a0, 5
addi x0, x0, 10
li t4, 42
sub t2, t1, x0
bne t2, zero, odd
slli t3, a0, 2
odd:
addi a0, a0, -1
```

Abbildung 4: Schreiben Sie die Befehle in die Kästchen.
~~~

![공식 시험 원문 — exam-p15.png](../../assets/exam-p15.png)

*공식 시험 원문: `exam-p15.png` · Probeklausur.pdf · PDF p.15*

### 이 unit에서 풀 항목

`sub t2,t1,x0`와 `bne t2,zero,odd` 사이의 첫 hazard와 그 순간의 pipeline 배치를 찾으세요.

## 2. 쉬운 한국어 해석

7c) Pipeline의 Hazard 검출

첫 번째 Hazard가 발생하는 순간 서로 다른 Pipeline 단계에 어떤 명령어가 있는지 결정하시오. 다음 순서로 수행하시오.

a) Hazard가 발생하는 즉시 각 명령어가 위치한 Pipeline 단계인 Fetch, Decode, Execute, Memory, Writeback을 식별하시오.

b) 해당 명령어를 그림 4의 상자에 기입하시오.

c) Hazard가 왜 발생하며 어떻게 해결할 수 있는지 짧게 설명하시오.

```text
andi t1, a0, 1
addi x0, a0, 5
addi x0, x0, 10
li t4, 42
sub t2, t1, x0
bne t2, zero, odd
slli t3, a0, 2
odd:
addi a0, a0, -1
```

그림 4: 명령어를 상자에 기입하시오.

### 이 unit에 해당하는 최소 작업

`sub t2,t1,x0`와 `bne t2,zero,odd` 사이의 첫 hazard와 그 순간의 pipeline 배치를 찾으세요.

이 문제에서 최종 결과만 맞히는 것보다 중요한 것은 `7c-2`에 필요한 중간 판단을 답안지에 남기는 것입니다.

## 3. 무엇을 묻는 문제인가

### 공식 문제의 요구사항

- x0에 쓰는 두 addi가 실제 architectural dependency를 만드는지 먼저 판정한다.
- 첫 번째 실제 Hazard가 발생하는 cycle을 찾는다.
- 그 순간 IF, ID, EX, MEM, WB에 있는 명령어를 식별한다.
- 식별한 명령어를 Abbildung 4의 상자에 배치한다.
- Hazard의 원인을 producer와 consumer register 관계로 설명한다.
- Hazard를 해결할 수 있는 방법을 짧게 설명한다.

### 조건과 제약

- 분석 대상은 제시된 명령어 순서이다.
- Pipeline 단계 이름은 Fetch, Decode, Execute, Memory, Writeback이다.
- RISC-V x0는 쓰기 결과가 보존되지 않고 읽으면 항상 0이다.
- 공식 해설은 sub가 생성하는 t2와 바로 다음 bne가 읽는 t2 사이의 RAW Data Hazard를 첫 실제 Hazard로 판정한다.
- 답은 Hazard 발생 시점의 단계 배치와 짧은 원인·해결 설명을 모두 포함해야 한다.

### 원문 오탈자·도식 관련 주의

- 시험 PDF p15의 Abbildung 4에는 Pipeline datapath와 각 stage 위의 빈 답안 상자가 실제로 렌더되어 있다. 텍스트 overlay는 상자의 기하 위치를 직렬화하지 않으므로 exam-p15.png에서 IF/ID/EX/MEM/WB 위치를 시각적으로 대조해야 한다.
- 원문은 '첫 번째 Hazard'라고만 하여 Data Hazard와 Control Hazard 중 무엇을 우선하는지 명시하지 않는다. 공식 해설은 x0 관련 가짜 dependency를 제외한 뒤 sub t2 → bne t2의 RAW Data Hazard를 다룬다.
- 원문은 forwarding 가능 위치, branch 비교 단계, 필요한 stall 수 같은 구체적 Pipeline 구현 조건을 제시하지 않는다.
- Teil c는 Hazard가 어떻게 해결되는지도 요구하지만 공식 해설 p40의 문장 설명은 원인을 명시할 뿐 해결 방법을 명시적으로 적지 않는다.

### 도식 시각 확인 상태

- **도식 의존 여부:** 필수
- **시각 확인 상태:** verified spot-check
- **직접 확인한 asset:** exam-p15.png, solution-p40.png
- **확인 기준:** component/box 위치와 공식 해설의 표시를 텍스트 추출이 아닌 2× 원본 raster에서 대조했습니다.

### 이 unit의 학습 목표

- **관찰 가능한 목표:** 첫 실제 hazard 시점의 producer sub와 consumer bne를 찾아 RAW dependency, pipeline stage 배치, 가능한 forwarding/stall 해결을 구분해 설명할 수 있다.
- **출제 의도:** hazard 이름만 쓰면 어느 값이 언제 부족한지 증명하지 못합니다. producer rd, consumer rs, snapshot stage, 해결 경로를 한 묶음으로 제시해야 합니다.
- **공식 근거 범위:** Probeklausur.pdf 시험 p15 7c의 첫 hazard stage diagram과 code, Probeklausur Musterlösung und Hinweise.pdf 공식 해설 p40 하단의 bne/sub hazard 설명.
- **Aufgabe 공통 선수지식:** 한 cycle의 stage는 IF→ID→EX→MEM→WB 순서입니다. Jump가 확인되기 전에 뒤의 instruction이 이미 들어오므로 wrong-path instruction이 flush되어 nop이 됩니다. x0에 대한 write는 버려져 dependency를 만들지 않습니다.

## 4. 선수 개념과 핵심 용어

### producer

- **뜻:** 뒤 instruction이 필요로 하는 새 register 값을 계산하는 앞 instruction입니다.
- **이 문제에서:** sub t2,t1,x0를 t2 producer로 표시할 때 사용합니다.

### consumer

- **뜻:** 앞 instruction의 새 값을 source operand로 읽어야 하는 뒤 instruction입니다.
- **이 문제에서:** bne t2,zero,odd를 t2 consumer로 표시할 때 사용합니다.

### forwarding

- **뜻:** 아직 Register File에 writeback되지 않은 결과를 pipeline 내부 경로로 필요한 stage에 직접 전달하는 방법입니다.
- **이 문제에서:** 구현이 지원하면 t2 비교 입력을 기다리지 않고 공급하는 해결책으로 사용합니다.

### stall

- **뜻:** 필요한 값이 사용 가능해질 때까지 consumer 진행을 멈추고 bubble을 넣는 방법입니다.
- **이 문제에서:** 적절한 forwarding이 없을 때 RAW hazard를 해결하는 방법으로 사용합니다.

### 이 문제에 적용할 풀이 규칙

### 규칙 1. RAW는 rd와 rs의 방향 있는 관계다

앞 sub의 rd=t2가 뒤 bne의 rs1=t2와 같아야 하며 반대 순서나 단순 이름 반복만으로는 같은 의미가 아닙니다.

- **시험지에 남길 것:** sub.rd=t2 → bne.rs1=t2 방향 화살표를 그립니다.

### 규칙 2. data hazard와 control hazard를 분리한다

bne가 t2를 기다리는 것은 data hazard이고 branch outcome 뒤 wrong path를 처리하는 것은 별도 control hazard입니다.

- **시험지에 남길 것:** RAW/t2와 branch/PC 두 행으로 원인과 해결을 나눠 씁니다.

### 규칙 3. 공식 상자는 pipeline register 기준으로 읽는다

공식 p40의 네 상자는 IF/ID, ID/EX, EX/MEM, MEM/WB 내용을 나타냅니다. 따라서 bne는 Decode, sub는 Execute에 있고, 강의의 branch-in-EX model에서는 다음 cycle에 sub 결과를 M→E로 forwarding하므로 data stall은 0 cycle입니다.

- **시험지에 남길 것:** IF=slli를 상자 밖에 적고 ID=bne, EX=sub, MEM=li, WB=addi를 표로 만든 뒤 sub M→bne E 화살표를 그립니다.

### 공식 문제 전에 푸는 작은 유사 예제

**문제:** add t3,t0,t1 바로 뒤 beq t3,zero,L이 있는 5-stage pipeline에서 dependency와 해결 방향을 설명하세요.

**주어진 것**

- add의 destination은 t3입니다.
- beq는 t3를 비교 source로 읽습니다.
- 정확한 stall 수는 branch compare stage와 forwarding 지원에 따라 달라집니다.

### 예제 단계 1. producer와 consumer field를 표시합니다.

- **왜:** 값 전달 방향을 증명하기 위해서입니다.
- **종이에:** add.rd=t3 → beq.rs1=t3

### 예제 단계 2. value가 생성되는 stage와 필요한 stage를 표시합니다.

- **왜:** 그 시점에 Register File 값이 최신인지 판단하기 위해서입니다.
- **종이에:** producer result ready / consumer compare need

### 예제 단계 3. 지원 경로에 따라 forwarding 또는 stall을 제시합니다.

- **왜:** 오래된 t3로 branch condition을 계산하지 않게 해야 합니다.
- **종이에:** compare forwarding 지원: forward; 미지원: stall until available

**예제 정답:** add t3→beq t3 사이에 RAW data hazard가 있습니다. branch 비교 입력으로 forwarding할 수 있으면 전달하고, 없으면 최신 t3가 사용 가능할 때까지 stall합니다.

**독립 검산:** branch의 control hazard를 RAW 해결과 같은 문제로 합치지 않았는지 확인합니다.

## 5. 공식 정답 요약

**공식 결론:** 공식 p40 상자(IF/ID→MEM/WB)는 `bne t2,zero,odd` | `sub t2,t1,x0` | `li t4,42` | `addi x0,x0,10`입니다. Stage 의미로는 IF=`slli t3,a0,2`(공식 네 상자 밖), ID=`bne`, EX=`sub`, MEM=`li`, WB=`addi x0,x0,10`입니다. `sub→bne`는 t2에 대한 RAW Data Hazard이고, 강의의 branch-in-EX/forwarding model에서는 다음 cycle에 sub의 ALU 결과를 M→E로 전달하므로 data stall은 0 cycle입니다. 분기가 taken이면 별도로 강의 회로의 두 younger slot을 flush합니다(이 code에서는 `slli`가 실제 wrong-path이며 target instruction은 flush 후 다시 fetch될 수 있습니다).

### 시험지 문장별 정답 해설

아래는 시험지의 항목 순서를 그대로 유지합니다. 각 항목에서 원문 → 한국어 번역 → 정답 → 판단 근거 → 실제로 쓸 답을 바로 이어서 읽으세요.



### 현재 소문제의 요구·판단·답을 한 흐름으로 연결

### `7c-2`에서 정확히 답할 대상

- **시험지가 요구하는 답:** `sub t2,t1,x0`와 `bne t2,zero,odd` 사이의 첫 hazard와 그 순간의 pipeline 배치를 찾으세요.
- **이 소문제의 공식 답:** 공식 p40 상자(IF/ID→MEM/WB)는 `bne t2,zero,odd` | `sub t2,t1,x0` | `li t4,42` | `addi x0,x0,10`입니다. Stage 의미로는 IF=`slli t3,a0,2`(공식 네 상자 밖), ID=`bne`, EX=`sub`, MEM=`li`, WB=`addi x0,x0,10`입니다. `sub→bne`는 t2에 대한 RAW Data Hazard이고, 강의의 branch-in-EX/forwarding model에서는 다음 cycle에 sub의 ALU 결과를 M→E로 전달하므로 data stall은 0 cycle입니다. 분기가 taken이면 별도로 강의 회로의 두 younger slot을 flush합니다(이 code에서는 `slli`가 실제 wrong-path이며 target instruction은 flush 후 다시 fetch될 수 있습니다).

### 판단 1. producer의 rd=t2를 표시합니다.

- **왜:** sub t2,t1,x0가 실제 architectural value를 만드는 첫 후보임을 확정해야 합니다.
- **이 판단에서 답안지에 남길 것:** sub: rd=t2, result=t1-0을 적습니다.

### 판단 2. consumer의 rs1=t2를 표시합니다.

- **왜:** 바로 다음 bne가 새 t2로 equality/inequality를 판단하므로 producer 결과를 필요로 합니다.
- **이 판단에서 답안지에 남길 것:** bne: rs1=t2, rs2=zero를 적습니다.

### 판단 3. 공식 p40의 네 상자를 pipeline register와 stage 의미에 대응시킵니다.

- **왜:** 첫 상자는 현재 Fetch instruction이 아니라 IF/ID에 저장되어 Decode로 들어가는 bne이므로, 이를 Fetch로 부르면 hazard 시점이 한 cycle 어긋납니다.
- **이 판단에서 답안지에 남길 것:** 공식 상자 IF/ID=bne, ID/EX=sub, EX/MEM=li, MEM/WB=addi x0,x0,10. Stage 표 IF=slli, ID=bne, EX=sub, MEM=li, WB=addi를 적습니다.

### 판단 4. 강의의 branch-in-EX forwarding 경로로 RAW를 해결합니다.

- **왜:** sub의 ALU 결과는 EX가 끝나면 EX/MEM에 있고, 바로 다음 cycle bne가 EX에서 비교할 때 M→E forwarding으로 최신 t2를 받을 수 있습니다.
- **이 판단에서 답안지에 남길 것:** cycle n: sub=EX, bne=ID; cycle n+1: sub=MEM, bne=EX, M→E forwarding(ForwardAE/ForwardBE의 M 경로 선택)을 적습니다. Forwarding 미지원 시에는 stall이라고 덧붙입니다.

### 판단 5. branch가 control hazard도 만들 수 있음을 별도로 적습니다.

- **왜:** t2 RAW가 해결되어도 bne outcome이 정해질 때까지 wrong-path fetch 문제가 남을 수 있습니다.
- **이 판단에서 답안지에 남길 것:** Data: sub→bne t2, M→E, 0 stall; Control: taken이면 강의 회로의 두 younger slot flush를 적습니다. 이 code에서는 slli가 실제 wrong-path이고 target instruction은 다시 fetch될 수 있다고 구분합니다.

### 위 판단이 최종 답으로 이어지는 이유

첫 실제 dependency는 `sub`가 만드는 t2를 바로 다음 `bne`가 읽는 RAW입니다. 공식 p40의 네 상자는 pipeline register 기준 IF/ID→MEM/WB 순서이며, 각각 bne, sub, li, addi x0,x0,10을 담습니다. 따라서 stage 의미로는 ID=bne, EX=sub, MEM=li, WB=addi이고, 동시에 다음 `slli`가 IF에 있을 수 있습니다.

### 답안 작성 시 주의

공식 도식의 첫 상자를 Fetch라고 부르면 hazard 발생 시점이 한 cycle 어긋납니다. 상자는 IF/ID register의 내용, 즉 Decode에 들어가는 bne를 표시합니다. Data Hazard와 branch의 Control Hazard도 분리하세요.

![공식 Musterlösung/Hinweise — solution-p40.png](../../assets/solution-p40.png)

*공식 Musterlösung/Hinweise: `solution-p40.png` · Probeklausur Musterlösung und Hinweise.pdf · PDF p.40*

## 6. 풀이 전략

1. producer의 rd=t2와 consumer의 rs1=t2를 표시합니다.
2. 공식 p40 네 상자를 IF/ID, ID/EX, EX/MEM, MEM/WB에 대응시킵니다.
3. 표준 stage 이름으로 ID/EX/MEM/WB와 현재 IF를 따로 적습니다.
4. 강의의 EX-stage branch 비교에서는 다음 cycle의 M→E forwarding으로 data stall 0임을 표시합니다.
5. branch의 Control Hazard와 RAW Data Hazard를 분리합니다.

## 7. 단계별 상세 풀이

### 단계 1. producer의 rd=t2를 표시합니다.

- **이유:** sub t2,t1,x0가 실제 architectural value를 만드는 첫 후보임을 확정해야 합니다.
- **종이에 남길 것:** sub: rd=t2, result=t1-0을 적습니다.
- **완료 기준:** 앞의 x0 write와 달리 t2 write가 관찰 가능함을 설명합니다.
- **막힐 때 힌트:** x0 관련 false dependency를 제거한 다음 destination을 보세요.
- **가장 흔한 첫 오류:** sub의 x0를 destination으로 잘못 읽습니다.

### 단계 2. consumer의 rs1=t2를 표시합니다.

- **이유:** 바로 다음 bne가 새 t2로 equality/inequality를 판단하므로 producer 결과를 필요로 합니다.
- **종이에 남길 것:** bne: rs1=t2, rs2=zero를 적습니다.
- **완료 기준:** sub.rd와 bne.rs가 정확히 일치합니다.
- **막힐 때 힌트:** branch에는 rd가 없고 두 비교 source만 있습니다.
- **가장 흔한 첫 오류:** bne의 t2를 destination이라고 표시합니다.

### 단계 3. 공식 p40의 네 상자를 pipeline register와 stage 의미에 대응시킵니다.

- **이유:** 첫 상자는 현재 Fetch instruction이 아니라 IF/ID에 저장되어 Decode로 들어가는 bne이므로, 이를 Fetch로 부르면 hazard 시점이 한 cycle 어긋납니다.
- **종이에 남길 것:** 공식 상자 IF/ID=bne, ID/EX=sub, EX/MEM=li, MEM/WB=addi x0,x0,10. Stage 표 IF=slli, ID=bne, EX=sub, MEM=li, WB=addi를 적습니다.
- **완료 기준:** 공식 네 상자와 표준 다섯 stage를 모두 빠짐없이 설명합니다.
- **막힐 때 힌트:** IF/ID register의 출력은 Decode stage가 읽습니다.
- **가장 흔한 첫 오류:** 왼쪽 첫 상자의 bne를 Fetch라고 불러 아직 t2를 필요로 하지 않는 시점에 hazard가 발생했다고 설명합니다.

### 단계 4. 강의의 branch-in-EX forwarding 경로로 RAW를 해결합니다.

- **이유:** sub의 ALU 결과는 EX가 끝나면 EX/MEM에 있고, 바로 다음 cycle bne가 EX에서 비교할 때 M→E forwarding으로 최신 t2를 받을 수 있습니다.
- **종이에 남길 것:** cycle n: sub=EX, bne=ID; cycle n+1: sub=MEM, bne=EX, M→E forwarding(ForwardAE/ForwardBE의 M 경로 선택)을 적습니다. Forwarding 미지원 시에는 stall이라고 덧붙입니다.
- **완료 기준:** 강의 model에서는 data stall 없이 forwarding 가능함과, forwarding 없는 구현의 stall 필요성을 구분합니다.
- **막힐 때 힌트:** Vorlesung Teil 2의 arithmetic result M/W→E forwarding을 사용하세요.
- **가장 흔한 첫 오류:** Register File writeback까지 무조건 기다리거나, 반대로 forwarding 경로를 그리지 않고 0 stall이라고만 씁니다.

### 단계 5. branch가 control hazard도 만들 수 있음을 별도로 적습니다.

- **이유:** t2 RAW가 해결되어도 bne outcome이 정해질 때까지 wrong-path fetch 문제가 남을 수 있습니다.
- **종이에 남길 것:** Data: sub→bne t2, M→E, 0 stall; Control: taken이면 강의 회로의 두 younger slot flush를 적습니다. 이 code에서는 slli가 실제 wrong-path이고 target instruction은 다시 fetch될 수 있다고 구분합니다.
- **완료 기준:** 두 hazard의 원인, 영향, 해결이 서로 분리됩니다.
- **막힐 때 힌트:** 하나는 값, 다른 하나는 다음 PC의 불확실성입니다.
- **가장 흔한 첫 오류:** branch이므로 모든 문제를 control hazard 한 단어로만 설명합니다.

## 8. 문제와 공식 해설의 비교·검증

- **문제가 요구하는 것:** `sub t2,t1,x0`와 `bne t2,zero,odd` 사이의 첫 hazard와 그 순간의 pipeline 배치를 찾으세요.
- **공식 해설이 제시하는 결론:** 공식 p40 상자(IF/ID→MEM/WB)는 `bne t2,zero,odd` | `sub t2,t1,x0` | `li t4,42` | `addi x0,x0,10`입니다. Stage 의미로는 IF=`slli t3,a0,2`(공식 네 상자 밖), ID=`bne`, EX=`sub`, MEM=`li`, WB=`addi x0,x0,10`입니다. `sub→bne`는 t2에 대한 RAW Data Hazard이고, 강의의 branch-in-EX/forwarding model에서는 다음 cycle에 sub의 ALU 결과를 M→E로 전달하므로 data stall은 0 cycle입니다. 분기가 taken이면 별도로 강의 회로의 두 younger slot을 flush합니다(이 code에서는 `slli`가 실제 wrong-path이며 target instruction은 flush 후 다시 fetch될 수 있습니다).
- **결론을 재현하는 핵심 논리:** 첫 실제 dependency는 `sub`가 만드는 t2를 바로 다음 `bne`가 읽는 RAW입니다. 공식 p40의 네 상자는 pipeline register 기준 IF/ID→MEM/WB 순서이며, 각각 bne, sub, li, addi x0,x0,10을 담습니다. 따라서 stage 의미로는 ID=bne, EX=sub, MEM=li, WB=addi이고, 동시에 다음 `slli`가 IF에 있을 수 있습니다.
- **검증 방법:** 위 micro-step의 `종이에 남길 것`을 순서대로 만들고 각 `완료 기준`을 확인합니다. 최종 산출물이 공식 결론과 같은지 대조합니다.
- **공식 전사와 독립 검산:** 공식 p40의 상자 배치는 그대로 전사하되, 강의 forwarding 회로에서는 `sub→bne` 값을 M→E로 전달할 수 있어 data stall은 0 cycle입니다. taken branch의 control hazard 처리는 별도 flush 문제입니다.
- **전제와 주의 범위:** 공식 도식의 첫 상자를 Fetch라고 부르면 hazard 발생 시점이 한 cycle 어긋납니다. 상자는 IF/ID register의 내용, 즉 Decode에 들어가는 bne를 표시합니다. Data Hazard와 branch의 Control Hazard도 분리하세요.
- **채택할 시험 답:** 상자에는 공식 p40의 instruction 배치를 재현하고, 설명에는 `x0` write가 dependency가 아니며 `sub→bne`는 M→E forwarding으로 stall 없이 해결된다는 강의 전제를 명시합니다. branch가 taken이면 강의 회로가 두 younger slot을 flush한다고 따로 적습니다.

## 9. 시험장에서 쓸 최종 답안

공식 p40 상자(IF/ID→MEM/WB)는 `bne t2,zero,odd` | `sub t2,t1,x0` | `li t4,42` | `addi x0,x0,10`입니다. Stage 의미로는 IF=`slli t3,a0,2`(공식 네 상자 밖), ID=`bne`, EX=`sub`, MEM=`li`, WB=`addi x0,x0,10`입니다. `sub→bne`는 t2에 대한 RAW Data Hazard이고, 강의의 branch-in-EX/forwarding model에서는 다음 cycle에 sub의 ALU 결과를 M→E로 전달하므로 data stall은 0 cycle입니다. 분기가 taken이면 별도로 강의 회로의 두 younger slot을 flush합니다(이 code에서는 `slli`가 실제 wrong-path이며 target instruction은 flush 후 다시 fetch될 수 있습니다).

답안지에는 결과만 쓰지 말고, 7절의 중간 산출물 가운데 판정을 증명하는 식·bit field·register 상태·cycle·cache 상태를 함께 남기세요.

## 10. 자주 하는 실수와 검산 체크리스트

### 대표 실수

- 공식 도식의 첫 상자를 Fetch라고 부르면 hazard 발생 시점이 한 cycle 어긋납니다. 상자는 IF/ID register의 내용, 즉 Decode에 들어가는 bne를 표시합니다. Data Hazard와 branch의 Control Hazard도 분리하세요.
- sub의 x0를 destination으로 잘못 읽습니다.
- bne의 t2를 destination이라고 표시합니다.
- 왼쪽 첫 상자의 bne를 Fetch라고 불러 아직 t2를 필요로 하지 않는 시점에 hazard가 발생했다고 설명합니다.
- Register File writeback까지 무조건 기다리거나, 반대로 forwarding 경로를 그리지 않고 0 stall이라고만 씁니다.
- branch이므로 모든 문제를 control hazard 한 단어로만 설명합니다.

### 빠른 self-check

- **회상 질문:** producer와 consumer 사이에 독립 instruction 하나가 끼면 forwarding/stall 조건이 어떻게 달라지는지 설명해 보세요.
- [ ] 공식 p40 네 상자를 IF/ID=bne, ID/EX=sub, EX/MEM=li, MEM/WB=addi로 읽고, 표준 stage 표에는 IF=slli까지 추가할 수 있다.
- [ ] 같은 branch instruction에서 data hazard와 control hazard를 두 문장으로 분리할 수 있다.

## 11. 짧은 확인 문제와 전이 연습

### 개념 재구성

**문제:** 공식 code의 첫 실제 hazard를 producer, consumer, type, 해결의 네 요소로 재구성하세요.

**힌트:** sub의 t2와 bne의 t2를 연결하세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** producer는 sub t2,t1,x0, consumer는 bne t2,zero,odd이며 t2에 대한 RAW data hazard입니다. 강의의 branch-in-EX pipeline에서는 sub가 MEM, bne가 EX가 되는 다음 cycle에 M→E forwarding으로 해결하고, forwarding이 없는 구현은 최신 t2가 준비될 때까지 stall합니다.

**채점 기준**
  - sub t2,t1,x0
  - bne t2,zero,odd
  - RAW data hazard
  - forwarding
  - stall

</details>

### 변형 문제

**문제:** lw t0,0(s1) 바로 뒤 add t2,t0,s2가 있을 때 producer/consumer와 hazard type을 쓰고 일반적인 해결 방향을 제시하세요.

**힌트:** load result t0가 언제 준비되는지 생각하세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** producer는 lw의 rd=t0이고 consumer는 add의 rs1=t0이므로 load-use RAW hazard입니다. memory read 결과 forwarding이 제때 가능하지 않으면 stall을 넣고, 가능한 시점에 t0를 forward합니다.

**채점 기준**
  - lw의 rd=t0
  - add의 rs1=t0
  - load-use RAW hazard
  - stall
  - forward

</details>

### 오답 진단

**문제:** 학생이 'bne이므로 이 pair는 control hazard일 뿐 data hazard는 없다'고 했습니다. 두 hazard를 분리해 고치세요.

**힌트:** branch outcome 이전에 비교 operand t2가 어디서 오는지 보세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** sub가 만든 t2를 bne가 바로 읽으므로 RAW data hazard가 먼저 존재합니다. bne의 다음 PC가 확정되기 전 wrong-path 문제는 별도의 control hazard입니다.

**채점 기준**
  - RAW data hazard
  - t2
  - 별도의 control hazard
  - wrong-path

</details>

## 12. 근거 자료

- `[문제 출처] current:Probeklausur.pdf` — 시험 p14–15 · 공식 해설 p39–40
- `[공식 해설] current:Probeklausur Musterlösung und Hinweise.pdf` — 시험 p14–15 · 공식 해설 p39–40
- `[정확한 원문 group] 7c` — 시험 p.15 · 공식 해설 p.40
- `[소문항 범위] Probeklausur.pdf 시험 p15 7c의 첫 hazard stage diagram과 code, Probeklausur Musterlösung und Hinweise.pdf 공식 해설 p40 하단의 bne/sub hazard 설명.`
- `[개념 근거 · file-level] current:Vorlesung/Rechnerorganisation - Teil 2.pdf` — Pipeline stage와 Hazard
- `[개념 근거 · file-level] current:Uebung/Lösung 9.pdf` — Pipeline timing, forwarding, stall
- `[개념 근거 · file-level] current:Uebung/Lösung 10.pdf` — RAW hazard와 branch 처리

### 이 파일에서 직접 대조한 공식 이미지

- `exam-p15.png` — Probeklausur.pdf · PDF p.15
- `solution-p40.png` — Probeklausur Musterlösung und Hinweise.pdf · PDF p.40

정확한 강의 슬라이드 한 페이지를 확정하지 못한 개념 자료는 `file-level`로 표시했습니다. 페이지 번호를 추측해서 만들지 않았습니다.
