04구현 문제
+&로 자리올림 보존하기
1. 요구 동작
CarryAdder는 4비트 부호 없는 입력 두 개를 더해 5비트 sum에 출력해야 합니다.
다섯째 비트는 자리올림을 담습니다. 따라서 0 + 0부터 15 + 15까지 모든 입력 쌍에서
실제 합을 그대로 출력해야 하며, 최댓값은 30입니다.
시작 코드에서는 합이 16 이상이면 출력이 실제 합보다 정확히 16 작습니다. sum 포트의 폭은
충분하며, 자리올림은 포트에 도달하기 전에 이미 사라집니다.
TODO 줄의 식만 바꾸세요. 세 포트 선언은 그대로 둡니다.
2. 폭이 결정되는 시점
덧셈 결과의 폭은 연산자가 정합니다. 연결은 도착한 폭을 sink의 폭에 맞춰 0 확장하거나 절단할 뿐입니다. 시작 코드를 읽을 때는 식과 연결을 나누어 계산해 보세요.
| 확인할 것 | 질문 |
|---|---|
| 오른쪽 식 | io.a + io.b의 결과는 몇 비트일까요? |
| 연결 | 그 폭의 값이 5비트 포트로 갈 때 무엇이 추가될까요? |
3. 실행 전 예측
공개 실행은 (3, 4), (9, 8), (15, 15)를 인가합니다. 각 행에서 시작 코드가 출력할
값과 올바른 덧셈기가 출력할 값을 먼저 적어 보세요. 9 + 8의 실제 합은 2진수로
1_0001입니다.
4. 실행 결과 해석
시작 코드는 7, 1, 14를 출력합니다. 4비트에 들어가는 합은 첫 행뿐입니다. 나머지 두 행에서는 덧셈 결과가 4비트로 만들어지면서 비트 4가 이미 버려졌고, 연결은 그 값 위에 0을 채웠습니다. 식이 만들지 않은 비트는 포트를 넓혀도 복원되지 않습니다. 수정 후에는 7, 17, 30이 출력됩니다.
5. 완료 조건
- 출력된 세 행뿐 아니라 모든 4비트 입력 쌍에서 정확한 합을 출력합니다.
- 합이 16 이상이면 자리올림이 비트 4에 나타납니다.
- 입력은 4비트,
sum은 5비트를 유지합니다.
6. 단계형 힌트
힌트 1
덧셈 결과의 폭은 연결보다 먼저 연산자가 결정합니다. 데이터 타입 장의 폭 규칙 표에서
+의 결과 폭을 확인해 보세요.
힌트 2
Chisel에는 결과가 가장 넓은 피연산자보다 1비트 넓은 덧셈 연산자가 하나 더 있습니다. 피연산자는 그대로 두고 연산자만 바꾸세요.
개념 설명
데이터 경로의 덧셈기는 대개 폭을 넘으면 wraparound하도록 설계하므로 +는 피연산자
폭을 유지합니다. +&는 자리올림까지 결과에 포함합니다. 연결은 도착한 폭을 조정할
뿐이므로, 자리올림의 보존 여부는 포트가 아니라 연산자에서 결정됩니다.
7. 추가 실험
제출 코드는 바꾸지 마세요. 같은 4비트 입력에 a = 3, b = 5를 넣고 뺄셈한다고
가정해 보세요. 일반 뺄셈과 확장형 뺄셈이 5비트 부호 없는 포트에 어떤 값을 출력할지
예측하고, 두 결과 모두 음수가 아닌 이유를 피연산자 타입으로 설명해 보세요.