본문으로 건너뛰기
code0.HDL

39검증 문제

FSM 동작 네 번 반복하기

1. 문제와 수정 범위

repeatIncrement는 같은 증가 동작을 정확히 네 번 실행한 뒤 끝나야 합니다. 반복 본문의 레지스터 대입은 실행될 때마다 정확히 1을 더하므로 결함이 아닙니다. 결함은 반복 횟수를 정하는 부분에 있습니다. 초깃값 0에서 starter의 상태 변화는 0 -> 1 -> 2 -> 3에서 끝납니다.

함수 시그니처, 두 seq의 중첩 구조, 증가식, mkTop은 그대로 두세요. 본문을 몇 번 실행할지 정하는 선언만 수정합니다.

2. starter 읽기와 실행 전 예측

repeatIncrement를 바깥에서 안쪽으로 읽어 보세요.

  1. 함수는 Stmt를 반환합니다.
  2. 바깥 seq 안에 repeat 제어가 있습니다.
  3. 안쪽 seq에는 증가 대입 하나가 있습니다.
  4. mkTop은 반환된 Stmt로 controller를 만들고, 완료된 뒤 count를 출력합니다.

실행 전에 출력될 최종값과 본문이 실행된 횟수를 따로 예측해 보세요. starter는 count = 3을 출력합니다. 대입을 하나 더 붙이면 이번 출력만 맞을 뿐, "같은 동작을 네 번 반복한다"는 계약은 표현하지 못합니다.

3. 최소 수정과 완료 조건

반복 한 번은 count <= count + 1의 실행과 반영을 하나 만듭니다. 같은 본문을 네 번 실행하면 됩니다. 본문 복제, 대입 추가, 최종 상수 쓰기는 최소 수정이 아닙니다.

수정한 뒤 실행 전에 0 -> 1 -> 2 -> 3 -> 4를 적고, 화살표마다 서로 다른 본문 실행인지 확인해 보세요. controller는 마지막 쓰기가 반영된 뒤에만 완료되어야 합니다.

finish가 controller 완료를 관찰하는 순간 count는 4여야 합니다. 세 번에서 멈추는 것도, 다섯 번까지 가는 것도 실패입니다. controller는 멈추지 않고 완료까지 진행해야 하며, 4는 직접 쓴 상수가 아니라 네 번 증가한 결과여야 합니다.

4. 단계형 힌트

힌트 1: 본문과 반복 제어 나누기

본문은 실행될 때마다 이미 1을 더합니다. 필요한 상태 전이 수와 controller가 본문을 실행하는 횟수를 비교해 보세요.

힌트 2: 하나 모자란 값의 위치

안쪽 seq의 대입이 아니라 repeat에 붙은 횟수 표현을 보세요. 본문 안에 동작을 더할 필요는 없습니다.

힌트 3: 유지할 구조

repeat는 고정된 작업량을 표현합니다. 증가식이나 FSM의 시작과 종료 구조는 그대로 두고 반복 횟수만 바로잡으세요.

5. 추가 실험

필수 수정을 확인한 뒤 별도 사본에서 count의 초깃값을 2로 바꾸고, 고정 횟수 반복의 최종값을 먼저 계산해 보세요. 같은 초깃값에서 while (count < 4)를 쓰면 전이가 몇 번 일어나는지도 비교해 보세요. 앞의 것은 작업량을, 뒤의 것은 목표 상태를 보장합니다. 명세에 맞는 반복을 고르는 연습이며, 채점하기 전에는 starter 구조로 되돌리세요.

개념 다시 보기
준비
Main.bsv