30구현 문제
제어 흐름으로 1인 비트 세기
1. 문제와 수정 범위
countOnes는 8비트 입력에서 1인 비트의 개수를 반환해야 합니다. 0번 비트와 7번 비트도
검사 대상입니다. starter는 컴파일되지만 count를 0으로 초기화한 뒤 value를 읽지 않고
바로 반환합니다.
countOnes의 본문만 수정하세요. 함수 시그니처와 mkTop의 출력 rule은 그대로 둡니다.
2. starter 읽기와 실행 전 예측
반환 타입을 먼저 확인해 보세요. UInt#(4)는 0부터 8까지의 개수를 모두 표현할 수
있습니다. 다음으로 mkTop의 호출 세 개를 읽어 보세요. 각각 1과 0이 섞인 바이트, 모든
비트가 1인 바이트, 모든 비트가 0인 바이트를 전달합니다.
실행을 누르기 전에 결과를 예측해 보세요. 반환값이 value와 무관하므로 세 출력은 모두
0입니다. 타입이 맞아 컴파일은 성공합니다. 문법 오류가 아니라 입력이 출력에 연결되지 않은
동작 오류입니다.
3. 최소 수정과 완료 조건
반복할 때마다 다음 불변식이 성립하도록 작성하세요. i번 비트까지 검사한 뒤 count는
0번부터 i번까지 1인 비트의 개수와 같습니다.
| 구성 요소 | 결정 시점 | 역할 |
|---|---|---|
| 반복 횟수 | elaboration | 생성할 논리의 양을 정합니다 |
value[i] 검사 | 회로 동작 중 | 입력에 따라 증가 여부를 정합니다 |
count 대입 | 회로 동작 중 | 지역 변수로 누적합니다 |
반복 범위는 Integer 변수와 상수 경계로 0번부터 7번 비트까지로 고정합니다. 선택한 비트가
1일 때만 count를 1 늘리세요. 지역 변수에는 =를 쓰고, 레지스터 쓰기 <=는 쓰지
않습니다. 지역 변수에 여러 번 대입해도 조합 회로가 만들어지며, 8사이클짜리 순차 회로가
되지는 않습니다.
수정한 뒤 실행에서 섞인 바이트는 5, 모두 1인 바이트는 8, 모두 0인 바이트는 0이 출력되어야 합니다. 세 결과를 분기로 직접 반환하면 다른 비트 패턴에서 계약이 깨집니다.
4. 단계형 힌트
힌트 1: 불변식 확인하기
섞인 바이트 8'b10110101의 낮은 비트 두 개를 차례로 읽고, 검사할 때마다 count를 적어
보세요. 선택한 비트가 0이면 값이 그대로여야 합니다.
힌트 2: 정적 반복 만들기
초기화와 return 사이에 for 반복문 하나를 두세요. Integer 반복 변수, 상수 시작값과
종료 경계, 1씩 늘어나는 갱신이 필요합니다.
힌트 3: 지역 변수 갱신하기
반복 변수로 입력 비트 하나를 선택하세요. if로 조건을 검사하고, 참일 때만 누적값을
갱신합니다. 클록에 맞춰 상태를 쓰는 연산자는 필요하지 않습니다.
5. 추가 실험
수정을 마친 뒤 조건을 잠시 반대로 바꾸어 0인 비트를 세게 해 보세요. 세 입력 각각에서 새 결과와 원래 결과의 합이 8이 되는 이유를 설명하고, 조건을 원래대로 되돌리세요.