01구현 문제
rule 하나로 세기
1. 목표와 수정 범위
완성된 mkIntroCounter는 value를 0, 1, 2, 3, 4, 5 순서로 반환하고, 이후에는 5를
유지해야 합니다. 현재 step은 같은 값을 다시 기록하므로 첫 값인 0에서 멈춥니다.
counting도 계속 true입니다.
TODO가 붙은 기존 레지스터 대입문 하나에서 다음 상태 계산만 고치세요. 나머지 rule과
method는 이 연습의 수정 대상이 아닙니다.
2. starter를 손으로 진단하기
mkTop보다 mkIntroCounter를 먼저 읽어 보세요. count의 초기값을 확인한 다음, step
안 대입문의 오른쪽 식이 읽는 값과 클록 에지에서 기록될 값을 구분합니다.
| 시점 | 읽은 count | 기록할 값 | 다음 관찰 값 |
|---|---|---|---|
| 첫 rule 실행 | 0 | 0 | 0 |
| 다음 rule 실행 | 0 | 0 | 0 |
같은 행이 계속 반복됩니다. 수정하지 않은 상태에서 실행을 누르기 전에, 모든 value가
0이고 모든 counting이 true일 것이라고 예측해 보세요. 실행 결과로 이 진단을 확인한 뒤
대입문을 수정합니다.
3. 수정 후 trace 예측하기
수정한 코드를 곧바로 실행하지 마세요. rule이 한 번 실행될 때 현재 값의 다음 값을 예약한다는 조건으로 다음 표를 먼저 작성해 보세요.
| 화면의 cycle | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
value | 0 | 1 | 2 | 3 | 4 | 5 | 5 |
counting | true | true | true | true | true | false | false |
목표 trace는 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 유지입니다.
4. clock edge를 기준으로 결과 해석하기
실행의 각 행을 예측 표와 비교해 보세요. value가 4로 보이는 사이클에서 대입문
오른쪽은 사이클에 진입할 때의 이전 상태 4를 읽습니다. 계산한 5는 같은 사이클에는 보이지
않고, 클록 에지에서 레지스터에 반영됩니다. 따라서 다음 관찰에서 value가 5로
바뀝니다. 이때부터 step은 더 실행되지 않고 5가 유지됩니다.
5. 단계형 힌트
힌트 1
현재 대입문은 읽은 값과 기록할 값이 같습니다. 두 번째 열과 세 번째 열이 달라지려면 오른쪽 식이 어떤 상태 전이를 나타내야 하는지 먼저 말로 적어 보세요.
힌트 2
기록할 값은 사이클에 진입할 때의 count보다 하나 큰 다음 값입니다. 이 계산을 기존
대입문 하나에 표현하세요.
6. 채점에서 확인하는 동작
채점은 실행 중에 관찰되는 상태 변화와 method 결과를 확인합니다.
value는 0에서 시작하고, 5에 도달할 때까지 정확히 1씩 증가합니다.- 5에 도달한 뒤에도
value는 계속 5입니다. counting은value가 0부터 4일 때 true이고, 5일 때부터 false입니다.
7. 변형: 3에서 멈추기
필수 수정을 확인한 뒤 정지 여부와 counting을 결정하는 값을 잠시 3으로 바꿔 보세요.
실행하기 전에 0 -> 1 -> 2 -> 3 -> 유지를 적고, 2에서 계산한 3이 어느 클록 에지에서
반영되는지 표시해 보세요. 3이 처음 보일 때 counting이 false인지 확인합니다. 필수
해답을 제출하기 전에는 정지 값을 다시 5로 복원하세요.