---
schema_version: 1
exam_id: "sose26-probeklausur"
aufgabe: 7
unit_id: "7c-1"
source_group_id: "7c"
official_exam: true
official_solution: true
language: "ko"
---

# 7c-1 — 가짜 dependency 제거: x0

> **학습 목표:** x0를 destination으로 하는 instruction의 write가 architectural dependency를 만들지 않음을 rd/rs 집합으로 증명할 수 있다.
>
> **왜 따로 배우는가:** register 이름이 반복된다는 이유만으로 hazard를 표시하면 첫 실제 hazard 위치를 놓칩니다. x0의 특수 규칙을 먼저 적용해야 false dependency를 제거할 수 있습니다.
>
> **범위:** 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에서 풀 항목

`addi x0,...` 두 줄이 hazard를 만드는지 판단하세요.

## 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에 해당하는 최소 작업

`addi x0,...` 두 줄이 hazard를 만드는지 판단하세요.

이 문제에서 최종 결과만 맞히는 것보다 중요한 것은 `7c-1`에 필요한 중간 판단을 답안지에 남기는 것입니다.

## 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의 학습 목표

- **관찰 가능한 목표:** x0를 destination으로 하는 instruction의 write가 architectural dependency를 만들지 않음을 rd/rs 집합으로 증명할 수 있다.
- **출제 의도:** register 이름이 반복된다는 이유만으로 hazard를 표시하면 첫 실제 hazard 위치를 놓칩니다. x0의 특수 규칙을 먼저 적용해야 false dependency를 제거할 수 있습니다.
- **공식 근거 범위:** Probeklausur.pdf 시험 p15 7c의 hazard code와 Probeklausur Musterlösung und Hinweise.pdf 공식 해설 p40의 x0 설명.
- **Aufgabe 공통 선수지식:** 한 cycle의 stage는 IF→ID→EX→MEM→WB 순서입니다. Jump가 확인되기 전에 뒤의 instruction이 이미 들어오므로 wrong-path instruction이 flush되어 nop이 됩니다. x0에 대한 write는 버려져 dependency를 만들지 않습니다.

## 4. 선수 개념과 핵심 용어

### x0

- **뜻:** 읽으면 항상 0이고 write 결과는 버려지는 RISC-V zero register입니다.
- **이 문제에서:** 두 addi x0 instruction이 실제 값을 생산하지 않는다고 판정할 때 사용합니다.

### architectural write

- **뜻:** 이후 instruction이 관찰할 수 있도록 register state를 실제로 바꾸는 write입니다.
- **이 문제에서:** rd=x0인 write를 dependency producer에서 제외할 때 사용합니다.

### RAW dependency

- **뜻:** 앞 instruction의 실제 destination 값을 뒤 instruction이 source로 읽어야 하는 관계입니다.
- **이 문제에서:** text상 같은 register와 진짜 data hazard를 구분할 때 사용합니다.

### false dependency

- **뜻:** 표면적으로 register 이름이 겹치지만 architectural data 전달이 필요하지 않은 관계입니다.
- **이 문제에서:** x0 write 뒤 x0 read를 hazard로 세지 않을 때 사용합니다.

### 이 문제에 적용할 풀이 규칙

### 규칙 1. producer가 실제 state를 쓰는지 먼저 본다

RAW는 앞 instruction이 관찰 가능한 새 값을 만들어야 성립하며 rd=x0 write는 그 조건을 만족하지 않습니다.

- **시험지에 남길 것:** 각 instruction의 rd 옆에 architectural write yes/no를 표시합니다.

### 규칙 2. x0 read는 항상 constant 0이다

뒤 instruction이 x0를 source로 사용해도 앞 instruction 결과를 기다리는 것이 아니라 ISA constant를 읽습니다.

- **시험지에 남길 것:** rs=x0를 value 0으로 치환하고 producer 화살표를 그리지 않습니다.

### 공식 문제 전에 푸는 작은 유사 예제

**문제:** add x0,t1,t2 다음에 sub t3,x0,t4가 올 때 RAW hazard가 있는지 판정하세요.

**주어진 것**

- x0에 대한 write는 버려집니다.
- sub의 x0 source 값은 항상 0입니다.
- RAW에는 실제 producer 값이 필요합니다.

### 예제 단계 1. 첫 instruction의 destination을 적습니다.

- **왜:** producer 후보를 확인하기 위해서입니다.
- **종이에:** rd=x0, architectural write=no

### 예제 단계 2. 둘째 instruction의 source를 적습니다.

- **왜:** 어떤 이전 값이 필요한지 확인하기 위해서입니다.
- **종이에:** rs1=x0(constant 0), rs2=t4

### 예제 단계 3. 실제 producer→consumer 값 전달이 있는지 판정합니다.

- **왜:** x0는 앞 add 결과가 아니라 constant 0을 제공하기 때문입니다.
- **종이에:** RAW 없음

**예제 정답:** RAW hazard가 없습니다. 첫 instruction의 x0 write는 버려지고 둘째 instruction은 항상 0을 읽습니다.

**독립 검산:** 첫 instruction을 삭제해도 둘째 instruction의 x0 입력이 변하지 않는지 생각합니다.

## 5. 공식 정답 요약

**공식 결론:** `addi x0,a0,5`와 `addi x0,x0,10`은 x0 값을 바꾸지 않으므로 이 write 때문에 Data Hazard가 생기지 않습니다.

### 시험지 문장별 정답 해설

아래는 시험지의 항목 순서를 그대로 유지합니다. 각 항목에서 원문 → 한국어 번역 → 정답 → 판단 근거 → 실제로 쓸 답을 바로 이어서 읽으세요.



### 현재 소문제의 요구·판단·답을 한 흐름으로 연결

### `7c-1`에서 정확히 답할 대상

- **시험지가 요구하는 답:** `addi x0,...` 두 줄이 hazard를 만드는지 판단하세요.
- **이 소문제의 공식 답:** `addi x0,a0,5`와 `addi x0,x0,10`은 x0 값을 바꾸지 않으므로 이 write 때문에 Data Hazard가 생기지 않습니다.

### 판단 1. 각 instruction의 실제 destination을 표시합니다.

- **왜:** hazard 탐색은 먼저 producer의 rd를 확정해야 source와 비교할 수 있습니다.
- **이 판단에서 답안지에 남길 것:** 두 addi의 rd=x0를 표시합니다.

### 판단 2. destination=x0이면 architectural write가 없다고 표시합니다.

- **왜:** RISC-V는 x0 write를 버리므로 새 register value가 pipeline 밖에서 관찰되지 않습니다.
- **이 판단에서 답안지에 남길 것:** rd=x0 → write discarded → producer 아님을 적습니다.

### 판단 3. 후속 instruction의 source와 대조합니다.

- **왜:** text상 x0가 반복되어도 후속 source는 앞 결과가 아니라 constant 0이므로 기다릴 dependency가 없습니다.
- **이 판단에서 답안지에 남길 것:** producer set에서 x0를 제거하고 rs 집합과 교집합이 없음을 적습니다.

### 위 판단이 최종 답으로 이어지는 이유

RISC-V x0 write는 버려집니다. 다음 instruction이 x0를 읽어도 값은 항상 0이므로 앞의 addi 결과를 기다릴 이유가 없습니다.

### 답안 작성 시 주의

text상 register 이름이 같다는 이유만으로 dependency를 선언하지 마세요.

![공식 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. 각 instruction의 실제 destination을 표시합니다.
2. destination=x0이면 architectural write가 없다고 표시합니다.
3. 후속 instruction의 source와 대조합니다.

## 7. 단계별 상세 풀이

### 단계 1. 각 instruction의 실제 destination을 표시합니다.

- **이유:** hazard 탐색은 먼저 producer의 rd를 확정해야 source와 비교할 수 있습니다.
- **종이에 남길 것:** 두 addi의 rd=x0를 표시합니다.
- **완료 기준:** syntax의 첫 register와 실제 architectural destination 의미를 분리합니다.
- **막힐 때 힌트:** 두 번째 operand가 아니라 instruction의 rd field를 보세요.
- **가장 흔한 첫 오류:** a0나 x0 source를 destination으로 잘못 표시합니다.

### 단계 2. destination=x0이면 architectural write가 없다고 표시합니다.

- **이유:** RISC-V는 x0 write를 버리므로 새 register value가 pipeline 밖에서 관찰되지 않습니다.
- **종이에 남길 것:** rd=x0 → write discarded → producer 아님을 적습니다.
- **완료 기준:** x0 write가 RegWrite control과 무관하게 architectural state를 바꾸지 않음을 설명합니다.
- **막힐 때 힌트:** x0를 읽으면 언제나 어떤 값인지 떠올리세요.
- **가장 흔한 첫 오류:** ALU가 결과를 계산했으므로 x0의 값도 잠시 바뀐다고 생각합니다.

### 단계 3. 후속 instruction의 source와 대조합니다.

- **이유:** text상 x0가 반복되어도 후속 source는 앞 결과가 아니라 constant 0이므로 기다릴 dependency가 없습니다.
- **종이에 남길 것:** producer set에서 x0를 제거하고 rs 집합과 교집합이 없음을 적습니다.
- **완료 기준:** 첫 실제 hazard 탐색을 다음 instruction들로 계속할 수 있습니다.
- **막힐 때 힌트:** 앞 instruction을 nop으로 바꿔도 후속 x0 값이 같은지 확인하세요.
- **가장 흔한 첫 오류:** 같은 이름 x0가 연속 등장한다는 이유만으로 RAW 화살표를 그립니다.

## 8. 문제와 공식 해설의 비교·검증

- **문제가 요구하는 것:** `addi x0,...` 두 줄이 hazard를 만드는지 판단하세요.
- **공식 해설이 제시하는 결론:** `addi x0,a0,5`와 `addi x0,x0,10`은 x0 값을 바꾸지 않으므로 이 write 때문에 Data Hazard가 생기지 않습니다.
- **결론을 재현하는 핵심 논리:** RISC-V x0 write는 버려집니다. 다음 instruction이 x0를 읽어도 값은 항상 0이므로 앞의 addi 결과를 기다릴 이유가 없습니다.
- **검증 방법:** 위 micro-step의 `종이에 남길 것`을 순서대로 만들고 각 `완료 기준`을 확인합니다. 최종 산출물이 공식 결론과 같은지 대조합니다.
- **전제와 주의 범위:** text상 register 이름이 같다는 이유만으로 dependency를 선언하지 마세요.
- **채택할 시험 답:** 이 가이드에서는 공식 Musterlösung의 결론을 시험 답으로 유지하며, 일반 ISA 또는 다른 구현과 달라질 수 있는 부분은 위 전제와 주의 범위에서 분리합니다.

## 9. 시험장에서 쓸 최종 답안

`addi x0,a0,5`와 `addi x0,x0,10`은 x0 값을 바꾸지 않으므로 이 write 때문에 Data Hazard가 생기지 않습니다.

답안지에는 결과만 쓰지 말고, 7절의 중간 산출물 가운데 판정을 증명하는 식·bit field·register 상태·cycle·cache 상태를 함께 남기세요.

## 10. 자주 하는 실수와 검산 체크리스트

### 대표 실수

- text상 register 이름이 같다는 이유만으로 dependency를 선언하지 마세요.
- a0나 x0 source를 destination으로 잘못 표시합니다.
- ALU가 결과를 계산했으므로 x0의 값도 잠시 바뀐다고 생각합니다.
- 같은 이름 x0가 연속 등장한다는 이유만으로 RAW 화살표를 그립니다.

### 빠른 self-check

- **회상 질문:** `add x0,t1,t2` 뒤 `sub t3,x0,t4`는 왜 RAW hazard가 아닌가요?
- [ ] rd/rs 표만 보고 x0 관련 false dependency를 즉시 제거할 수 있다.
- [ ] 공식 code에서 x0 두 줄 뒤 첫 실제 producer register를 찾을 수 있다.

## 11. 짧은 확인 문제와 전이 연습

### 개념 재구성

**문제:** RAW hazard가 성립하기 위한 producer와 consumer 조건을 x0 예외와 함께 재구성하세요.

**힌트:** 실제 rd write와 뒤 rs read가 필요합니다.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** 앞 instruction이 x0가 아닌 rd에 관찰 가능한 값을 쓰고 뒤 instruction이 그 rd를 source로 읽어야 RAW가 성립합니다. rd=x0 write는 producer가 아닙니다.

**채점 기준**
  - x0가 아닌 rd
  - source로 읽어야
  - RAW
  - producer가 아닙니다

</details>

### 변형 문제

**문제:** addi x0,s1,5; add t2,x0,s2; sub t3,t2,s3에서 첫 RAW hazard는 어느 pair입니까?

**힌트:** x0 write를 제거한 뒤 t2 producer를 찾으세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** addi x0→add 사이에는 RAW가 없고, 첫 RAW는 add가 만든 t2를 바로 읽는 sub이므로 add t2,x0,s2 → sub t3,t2,s3입니다.

**채점 기준**
  - RAW가 없고
  - t2
  - add t2,x0,s2
  - sub t3,t2,s3

</details>

### 오답 진단

**문제:** 학생이 addi x0,a0,5 뒤 addi x0,x0,10에서 x0 RAW hazard가 있다고 했습니다. 교정하세요.

**힌트:** 두 write 결과 중 architectural state에 남는 것이 있는지 보세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** 두 instruction 모두 x0에 쓰려는 결과가 버려지고 x0 read는 항상 0이므로 RAW hazard가 없습니다.

**채점 기준**
  - 결과가 버려지고
  - 항상 0
  - RAW hazard가 없습니다

</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 code와 Probeklausur Musterlösung und Hinweise.pdf 공식 해설 p40의 x0 설명.`
- `[개념 근거 · 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`로 표시했습니다. 페이지 번호를 추측해서 만들지 않았습니다.
