15구현 문제
카운터 증가시키기
1. 문제와 계약
Counter.bump는 호출 한 번마다 8비트 상태를 정확히 한 단계 갱신하는 Action method입니다.
반환값은 없습니다. starter의 갱신 식은 ?이므로 특정한 다음 상태를 보장하지 않습니다.
현재 도구로 공개 실행을 하면 마지막 값이 요구값 3이 아니라 십진수 170으로
표시됩니다. 170은 ?에 선택된 임의 비트 패턴일 뿐 카운터 동작이 아닙니다.
수정 범위는 mkCounter의 TODO 한 곳입니다. 인터페이스, value method, 제공된 mkTop은
그대로 두세요. 세 번 호출한 최종 결과만 맞추지 말고, 임의의 현재 상태에서 호출 한 번이
수행할 상태 전이를 표현해야 합니다.
2. Starter 읽기와 상태 추적
starter/Main.bsv를 다음 순서로 확인해 보세요.
- 인터페이스 반환 타입으로
bump와value의 역할을 구분합니다. count의 타입과 초기값을 찾습니다.driverule이 매 사이클bump를 한 번 호출하는 과정을 추적합니다.showrule이 세 번의 호출이 끝난 뒤에만value를 읽는 조건을 확인합니다.- 코드를 쓰기 전에 현재 상태와 다음 상태의 관계를 문장으로 설명합니다.
리셋 직후 count는 0입니다. 각 사이클 경계에서 상태는 차례로 1, 2, 3이 되어야 합니다.
<=는 method 실행 도중 레지스터를 즉시 바꾸지 않고, 다음 사이클에 보일 값을 예약합니다.
따라서 새 레지스터, rule, guard, 반환문을 추가할 필요가 없습니다. 기존 레지스터의 다음
상태만 결정하는 수정이 최소 수정입니다.
공개 실행에서는 십진수 3이 표시되어야 합니다. bump는 계속 Action method여야 하며,
호출 한 번마다 상태 전이도 하나씩 대응해야 합니다. 최종 예시를 상수로 지정하는 구현은 한
번과 두 번 호출한 중간 상태를 만족하지 못합니다.
3. 단계별 힌트
힌트 1 — method 종류 확인하기
Action method는 문장으로 호출합니다. 이 문제의 효과는 반환값이 아니라 예약된 레지스터
쓰기입니다.
힌트 2 — ?의 의미 확인하기
?은 임의 비트 패턴을 허용합니다. 다음 상태는 최상위 모듈의 steps가 아니라
mkCounter가 소유한 현재 레지스터 상태에서 계산해야 합니다.
힌트 3 — 상태 전이 표현하기
호출 한 번의 계약은 8비트 범위에서 한 번 증가하는 것입니다. 기존 레지스터와 일반 산술
연산으로 <= 오른쪽에 그 관계를 표현하세요.
4. 추가 실험
필수 구현을 마친 뒤 count의 초기값을 8'hfe로 바꾸고, bump를 두 번 호출했을 때의
중간 상태를 먼저 예측해 보세요. 8비트 최댓값 다음에 0으로 돌아가는 동작까지 설명할 수
있으면, 초기값 0에만 맞춘 구현과 일반적인 상태 전이를 구분할 수 있습니다.