04구현 문제
덧셈기의 자리올림 보존하기
1. 요구 동작
adder4는 4비트 입력 두 개를 더해 5비트 sum으로 출력합니다. 가장 큰 결과인
15 + 15 = 30을 표현하려면 5비트가 필요합니다. sum의 최상위 비트가 덧셈의 자리올림입니다.
시작 코드는 컴파일되고 3 + 4는 7을 출력합니다. 그러나 9 + 8은 1, 15 + 15는 14를
출력합니다. 15를 넘는 결과는 모두 정확히 16만큼 작습니다. 포트 목록과 공개 테스트벤치는
그대로 두고 TODO 아래 assign만 다시 쓰세요.
2. 폭 계산
연결 연산자 안의 피연산자는 각자 자신의 폭으로 계산됩니다. 4비트 두 개를 더한
a + b는 중괄호 안에서 4비트 결과가 됩니다. 그 앞에 상수 1'b0이 붙으므로 bit 4는
항상 0입니다.
| 입력 | 4비트 합 | 시작 코드 출력 | 기대 출력 |
|---|---|---|---|
| 3 + 4 | 7 | 7 | 7 |
| 9 + 8 | 1 | 1 | 17 |
| 15 + 15 | 14 | 14 | 30 |
시작 코드 출력과 기대 출력이 다른 줄은 모두 16만큼 차이가 나며, 16은 bit 4의 가중치입니다. 모듈 장의 expression-width 예제가 같은 규칙을 평균 계산으로 추적합니다.
TODO 아래 assign만 다시 쓰고 실행해 보세요. 큰 두 줄이 17과 30을 출력해야 합니다.
수정한 뒤에는 기존 줄에서 덧셈 폭을 결정한 부분이 무엇인지, 그리고 5비트 sum 포트만으로는
덧셈을 넓힐 수 없었던 이유를 설명해 보세요.
3. 완료 조건
- 0 + 0부터 15 + 15까지 입력 256쌍 모두에서
sum이a + b와 같습니다. - 16부터 30까지의 결과에서 bit 4가 0으로 고정되지 않고 자리올림을 나타냅니다.
adder4의 포트 이름과 폭은 바꾸지 않습니다.
4. 단계형 힌트
힌트 1
덧셈 자체가 비트를 잃는 것은 아닙니다. 덧셈이 계산되는 폭에서 자리올림이 절단됩니다.
힌트 2
중괄호 밖의 덧셈은 가장 넓은 피연산자와 대입 대상의 폭으로 계산됩니다. 대입 대상이 5비트이면 덧셈 결과에 자리올림을 담을 비트가 생깁니다.
힌트 3
bit 4를 0으로 고정하는 것은 연결 연산자 안의 상수입니다. 연결 연산자가 정말 필요한지부터 다시 판단해 보세요.
5. 추가 실험
sum이 4비트뿐인데 overflow 여부는 알아야 한다고 가정해 보세요. 추가할 출력 포트와,
그 포트가 더 넓은 내부 결과의 어느 비트를 전달해야 하는지 적어 보세요.