본문으로 건너뛰기
code0.HDL

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이 되는 이유를 설명하고, 조건을 원래대로 되돌리세요.

개념 다시 보기
준비
Main.bsv