본문으로 건너뛰기
code0.HDL

11검증 문제

상태 기계에서 잘못된 전이 찾기

1. 요구 동작

rise_fsm은 상태 기계 장에서 만든 두 상태 상승 검출기입니다. 상태는 직전 상승 에지에서 샘플링한 level을 기억합니다. 0이면 LOW, 1이면 HIGH입니다. Mealy 출력 rise는 상태가 LOW인데 이번 사이클의 level이 1일 때 1입니다. 리셋은 active-high 동기 리셋이며 기계를 LOW로 보냅니다.

현재 상태level다음 상태rise
LOW0LOW0
LOW1HIGH1
HIGH0LOW0
HIGH1HIGH0

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가 level AND (직전에 샘플링한 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입니다. 상태표에서 어느 열이 바뀌고, 다음 상태 논리는 바꿔야 할까요? 실행하기 전에 공개 패턴에 대한 출력 열을 먼저 예측합니다.

개념 다시 보기
준비
Main.v