본문으로 건너뛰기
code0.HDL

40검증 문제

준비된 뒤에만 완료하기

1. 문제와 수정 범위

done은 앞선 작업이 모두 유효해진 뒤에만 참이 되어야 합니다. waitForReady가 지킬 순서는 외부 조건 대기, result에 8'h2a 쓰기, 완료 표시입니다. starter는 done을 맨 먼저 씁니다. 그래서 ready가 거짓이고 result가 0인 상태에서도 finish가 실행될 수 있습니다.

waitForReady 안의 문장 순서만 수정하세요. 함수 시그니처, 기존 await와 두 쓰기, mkTop은 그대로 둡니다. 플래그를 더하거나 ready를 일찍 올려 문제를 가리지 마세요.

2. starter 읽기와 실행 전 예측

  1. waitForReady의 레지스터 인자 세 개를 확인하세요.
  2. seq 안의 문장을 대기, 실제 작업, 완료 표시로 분류해 보세요.
  3. mkTop의 advance를 읽어 보세요. cycle이 3일 때 ready를 참으로 씁니다.
  4. finish의 guard를 읽어 보세요. FSM 인터페이스의 done이 아니라 함수가 쓰는 done 레지스터를 봅니다.

실행 전에 다음을 예측해 보세요. 첫 문장이 반영된 시점에 아직 실행되지 않은 문장은 무엇일까요? 그 시점에 finish가 출력할 result는 얼마일까요? starter는 result = 00을 출력합니다. 리터럴이 틀린 것이 아니라 완료 시점이 틀린 것입니다.

3. 최소 수정과 완료 조건

결과 쓰기는 ready가 참이어야 유효하고, 완료 쓰기는 결과가 반영되어야 유효합니다. 세 문장의 식은 이미 맞으므로 새 상태나 대입을 추가하지 마세요. 의존하는 문장이 그 조건을 만드는 문장 뒤에 오도록 순서만 바꿉니다.

수정한 뒤 실행 전에 상태를 추적해 보세요.

구간resultdoneFSM
ready가 거짓인 동안0거짓대기 중
환경이 ready를 참으로 반영한 뒤0거짓await 통과 가능
다음 동작 반영 뒤8'h2a거짓진행 중
그다음 동작 반영 뒤8'h2a참종료 허용

준비 신호 전에는 결과와 완료 플래그가 모두 초기 상태여야 합니다. 준비 신호 뒤에는 FSM이 멈추지 않고 결과를 먼저 반영해야 합니다. finish가 실행되는 순간 result는 이미 8'h2a여야 합니다. 준비가 늦어지면 대기 시간만 늘어나고 상태 순서는 바뀌지 않습니다.

4. 단계형 힌트

힌트 1: 완료 플래그의 의미

done == True는 필요한 앞선 효과가 모두 반영되었다는 증거입니다. 작업을 시작하라는 요청이 아닙니다.

힌트 2: 문장의 역할

함수 안에는 진행을 막는 대기 지점, 실제 데이터를 쓰는 대입, 사용하는 쪽이 읽는 완료 대입이 하나씩 있습니다. 식은 고칠 필요가 없습니다.

힌트 3: 의존 관계로 순서 정하기

실제 작업은 준비 신호에, 완료는 실제 작업에 의존합니다. 각 단계를 그 단계를 유효하게 만드는 상태 뒤에 두세요.

5. 추가 실험

필수 수정을 확인한 뒤 advance가 ready를 올리는 사이클을 잠시 바꿔 보세요. 전체 대기 시간은 달라지지만, 준비 전 result == 0과 완료 전 result == 8'h2a라는 순서는 그대로일 것이라고 예측하고 확인해 보세요. 채점하기 전에는 원래 환경으로 되돌리세요.

개념 다시 보기
준비
Main.bsv