11검증 문제
상태 기계에서 잘못된 전이 찾기
1. 요구 동작
rise_fsm은 상태 기계 장에서 만든 두 상태 상승 검출기입니다. 상태는 직전 상승 에지에서
샘플링한 level을 기억합니다. 0이면 LOW, 1이면 HIGH입니다. Mealy 출력 rise는
상태가 LOW인데 이번 사이클의 level이 1일 때 1입니다. 리셋은 active-high 동기 리셋이며
기계를 LOW로 보냅니다.
| 현재 상태 | level | 다음 상태 | rise |
|---|---|---|---|
LOW | 0 | LOW | 0 |
LOW | 1 | HIGH | 1 |
HIGH | 0 | LOW | 0 |
HIGH | 1 | HIGH | 0 |
2. 현재 증상
시작 코드는 컴파일되고 실행됩니다. 공개 입력 패턴에는 상승이 네 번 있지만 출력 마지막 줄은
rises=1입니다. 첫 번째 상승 뒤로는 상승을 하나도 보고하지 않습니다.
상태표와 다른 전이 하나를 찾아 고치세요. 포트, 상태 이름, 출력 논리, 공개 테스트벤치는 그대로 둡니다.
3. 예측한 뒤 출력 읽기
실행하기 전에 상태표만 보고 패턴 0110_1110_0101의 열두 사이클에 대한 rise 열을 적고
상승 횟수를 세어 보세요. 그다음 실행해서 출력된 rise가 예측과 처음 달라지는 사이클을
표시합니다.
그 사이클은 원인이 아니라 증상입니다. 출력 논리는 상태와 입력만 읽으므로, level은 맞는데
rise가 틀렸다면 그 순간의 상태가 틀린 것입니다. 파형에 tb.dut.state를 추가하고, 상태가
바뀌어야 했는데 바뀌지 않은 에지를 찾아보세요.
4. 수정과 확인
case의 각 분기를 상태표의 두 행과 하나씩 맞춰 보고, 어긋나는 분기를 고친 뒤 다시
실행합니다. 다음을 확인하세요.
| 확인 항목 | 기대 |
|---|---|
| 상승 횟수 | level이 0에서 1로 바뀔 때마다 rise가 정확히 한 사이클 동안 1입니다. 1 사이에 0이 하나만 있어도 마찬가지입니다 |
| 상태 변화 | state는 상승 에지에서만 바뀌고, 매 에지 뒤 상태표를 따릅니다 |
| 출력 변화 | rise는 Mealy 출력이므로 사이클 중간에 level이 바뀌면 함께 바뀔 수 있습니다 |
5. 완료 조건
- 어떤 입력 패턴에서도, 상승 에지 직전 사이클 안에서 측정한
rise가levelAND (직전에 샘플링한 level이 0)과 같습니다. - 리셋 뒤에는 직전 level을 0으로 간주하므로, 리셋 동안 계속 1이던 level은 리셋 직후 첫 사이클에서 다시 상승으로 보고됩니다.
- 채점은 공개 패턴과 다른 입력을 씁니다. 긴 1 구간, 1 사이의 0 하나, 1 구간 중간의 리셋이 들어 있습니다. 실패하면 첫 번째로 틀린 사이클의 입력, 기대값, 실제값을 알려 줍니다.
6. 단계형 힌트
힌트 1
첫 번째 상승은 검출하므로 LOW 상태에서 level이 1인 행은 맞습니다. 두 번째 상승을
보려면 그 전에 무엇이 일어나야 할까요?
힌트 2
두 번째 상승을 보려면 상태가 다시 LOW가 되어야 합니다. 상태표에서 HIGH를 LOW로
되돌리는 행은 어느 것이고, 코드에 그 전이가 있나요?
힌트 3
HIGH 분기를 level의 두 값에 대해 각각 읽어 보세요. 두 결과 가운데 하나가 상태표와
맞지 않습니다.
7. 추가 실험
출력을 바꿔 하강을 검출하게 해 보세요. fall은 상태가 HIGH인데 이번 사이클의 level이
0일 때 1입니다. 상태표에서 어느 열이 바뀌고, 다음 상태 논리는 바꿔야 할까요? 실행하기 전에
공개 패턴에 대한 출력 열을 먼저 예측합니다.