본문으로 건너뛰기
code0.HDL

10검증 문제

지연선에서 사라진 단 찾기

1. 요구 동작

delay2는 2단 지연선입니다. 상승 에지마다 첫 단 stage1은 din을 저장하고, 출력 단 dout은 그 에지 이전에 stage1이 가지고 있던 값을 저장합니다.

상승 에지stage1dout
kk에서 샘플링한 dink−1에서 샘플링한 din

din의 값은 stage1에 샘플링된 다음 상승 에지 뒤에 dout에 나타납니다. 공개 출력에서는 stage1에 나타난 줄보다 한 줄 뒤입니다. 리셋은 active-high 동기 리셋이며 두 단을 모두 0으로 만듭니다.

2. 현재 증상

시작 코드는 컴파일되고 실행되며 리셋도 동작합니다. 그러나 공개 출력의 모든 줄에서 stage1과 dout이 같고, dout은 din을 한 줄 뒤가 아니라 같은 줄에서 반복합니다. 설계가 레지스터 하나처럼 동작하는 것입니다.

포트, 내부 stage1, 동기 리셋, 공개 테스트벤치는 그대로 두세요. 두 번째 단이 첫 단과 합쳐지는 원인을 찾아 always 블록을 고치면 됩니다.

3. 파형으로 진단하기

테스트벤치는 tb와 그 아래 전체를 기록하므로 파형에는 din, dout과 함께 tb.dut.stage1이 있습니다. 텍스트 출력의 각 줄은 상승 에지의 갱신이 끝난 뒤인 하강 에지에서 출력됩니다.

  1. 수정하기 전에 올바른 지연선의 dout 열 열 줄을 예측합니다. n번째 줄의 dout은 n − 1번째 줄의 din입니다.
  2. 파형에서 stage1과 dout이 바뀌는 상승 에지를 비교합니다. 정상적인 2단 파이프라인에서는 같은 입력 값에 대해 두 신호가 서로 다른 에지에서 바뀝니다.
  3. 두 신호가 같은 에지에서 함께 바뀌는 지점을 찾고, 어떤 문장 때문에 dout이 stage1이 방금 받은 값을 읽었는지 판단합니다.

4. 수정과 확인

두 단이 모두 에지 이전 값을 읽도록 가장 작은 수정을 하고 다시 실행하세요. 그다음 아래 두 항목을 확인합니다.

확인 항목기대
텍스트 출력dout 열이 din보다 한 줄 늦습니다
파형모든 값에 대해 dout이 stage1보다 상승 에지 하나 뒤에 바뀝니다

마지막으로, 시작 코드의 시뮬레이션 결과와 합성된 하드웨어는 서로 일치하지만 요구 동작과는 일치하지 않는 이유를 설명해 보세요.

5. 완료 조건

  • 리셋이 없을 때 각 상승 에지 뒤의 dout은 직전 상승 에지에서 샘플링한 din과 같습니다.
  • dout은 상승 에지에서만 바뀝니다.
  • 실행 도중 리셋하면 두 단이 모두 0이 됩니다. 리셋 직전 stage1에 있던 값은 dout에 도달하지 않으며, 리셋 뒤 첫 출력은 0입니다.

6. 단계형 힌트

힌트 1

같은 에지에서 갱신되는 두 레지스터는 서로의 에지 이전 값을 읽어야 합니다. 파형을 보면 시작 코드의 두 단은 그렇게 동작하지 않습니다.

힌트 2

클록 블록 안의 문장이 어떤 대입을 쓰는지 확인해 보세요. 한 종류의 대입은 대상을 즉시 갱신하므로 다음 줄이 이미 새 값을 읽습니다.

힌트 3

테스트벤치 장의 nonblocking 예제가 두 대입을 나란히 비교합니다. 이 블록의 모든 분기에 클록 논리용 대입을 쓰세요.

7. 추가 실험

시작 코드의 대입 종류는 그대로 두고, else 분기의 두 문장 순서를 바꿔 dout을 먼저 대입해 보세요. 실행하기 전에 출력을 예측해 보세요. 그다음 이 버전은 우연히 통과하는데 원래 버전은 통과하지 못하는 이유를 설명해 보세요. 또 세 번째 단이나 두 번째 always 블록이 추가되면 문장 순서에 의존하는 방식이 쉽게 깨지는 이유도 함께 설명해 보세요.

개념 다시 보기
준비
Main.v