본문으로 건너뛰기
code0.HDL

30검증 문제

일시 정지 동안 tick 분주기의 phase 유지하기

1. 요구 동작

TickDivider는 활성화된 사이클을 다섯 개마다 한 번 표시합니다.

신호동작
phase활성화된 사이클을 0부터 4까지 세고 순환합니다. en이 1인 에지에서 증가하고, en이 0인 에지에서 값을 유지합니다
ticken이 1이고 phase가 4인 사이클에 1입니다

따라서 일시 정지는 다음 tick을 늦출 뿐, 다섯 개를 세는 과정을 처음부터 다시 시작하지 않습니다. 리셋은 phase를 0으로 만듭니다.

2. 관찰되는 증상

en이 계속 1이면 tick이 올바르게 나옵니다. 그러나 일시 정지가 끝난 뒤에는 다음 tick이 기대보다 늦게 나옵니다.

파형에서 일시 정지 동안 phase가 어떻게 바뀌는지 찾아 설계를 고치세요. 포트, wrap, tick 줄, 공개 테스트벤치는 그대로 둡니다.

3. 실행 전 예측

공개 테스트벤치는 파형을 기록합니다. 활성화된 사이클 7개, 일시 정지 3 사이클, 활성화된 사이클 10개를 차례로 넣습니다. tick이 1인 사이클마다 TICK in cycle n을 출력하고, 사이클 번호는 테스트벤치 기준으로 1부터 셉니다. 마지막에 VCD를 dump.vcd로 복사합니다.

실행하기 전에 활성화된 사이클을 세어, 올바른 분주기의 tick 세 개가 나올 사이클 번호를 예측해 보세요. 그다음 시작 코드를 실행해 TICK 줄과 비교하세요.

4. 파형 읽기

파형에서 io_en, phase, wrap, io_tick을 찾으세요. phase는 레지스터이므로 상승 에지에서만 바뀝니다.

io_en이 0인 일시 정지 구간의 에지를 확인하세요. 일시 정지 직전의 phase와 io_en이 다시 1이 될 때의 phase를 비교해 보세요. 그다음 파형에 보이는 변화를 만드는 분기를 코드에서 찾아보세요.

5. 완료 조건

  • 일시 정지의 길이와 관계없이 활성화된 사이클을 이어서 세어 5번째, 10번째, 15번째 사이클마다 tick이 1입니다.
  • phase가 4일 때 일시 정지가 시작되면 tick은 다음 활성화 사이클로 미뤄지고, en이 0인 동안 tick은 0입니다.
  • 리셋은 어느 시점에서든 phase를 0으로 만듭니다.

6. 힌트

힌트 1

일시 정지 뒤 첫 활성화 사이클에서 파형의 phase는 얼마일까요? 원래는 얼마여야 할까요?

힌트 2

어떤 에지에서 대입되지 않은 레지스터는 값을 유지합니다. en이 0일 때 설계가 phase에 무엇을 대입하는지 확인해 보세요.

개념 설명

텍스트 출력은 증상이 나타난 시점을 보여 주고, 파형은 그 증상을 만든 상태를 보여 줍니다. 이 문제에서 TICK 줄은 tick이 늦었다는 사실을 알려 주고, phase 파형은 세던 값이 사라진 에지를 정확히 보여 줍니다.

7. 추가 실험

io.en && wrap을 fire라는 이름의 val에 연결하고 tick을 fire로 구동해 보세요. TICK 줄이 달라지는지 예측한 뒤, 파형에 fire가 별도 이름으로 남는지, 같은 값을 전달하는 tick만 남는지 확인해 보세요.

개념 다시 보기
준비

CheerpJ로 브라우저에서 실행합니다. 첫 실행에는 Java 약 14.5 MB와 JAR 약 47 MB를 내려받습니다. 컴파일에 1분 정도 걸릴 수 있습니다. 라이선스

Main.scala