10검증 문제
지연선에서 사라진 단 찾기
1. 요구 동작
delay2는 2단 지연선입니다. 상승 에지마다 첫 단 stage1은 din을 저장하고, 출력 단
dout은 그 에지 이전에 stage1이 가지고 있던 값을 저장합니다.
| 상승 에지 | stage1 | dout |
|---|---|---|
| k | k에서 샘플링한 din | k−1에서 샘플링한 din |
din의 값은 stage1에 샘플링된 다음 상승 에지 뒤에 dout에 나타납니다. 공개 출력에서는
stage1에 나타난 줄보다 한 줄 뒤입니다. 리셋은 active-high 동기 리셋이며 두 단을 모두
0으로 만듭니다.
2. 현재 증상
시작 코드는 컴파일되고 실행되며 리셋도 동작합니다. 그러나 공개 출력의 모든 줄에서 stage1과
dout이 같고, dout은 din을 한 줄 뒤가 아니라 같은 줄에서 반복합니다. 설계가 레지스터
하나처럼 동작하는 것입니다.
포트, 내부 stage1, 동기 리셋, 공개 테스트벤치는 그대로 두세요. 두 번째 단이 첫 단과
합쳐지는 원인을 찾아 always 블록을 고치면 됩니다.
3. 파형으로 진단하기
테스트벤치는 tb와 그 아래 전체를 기록하므로 파형에는 din, dout과 함께
tb.dut.stage1이 있습니다. 텍스트 출력의 각 줄은 상승 에지의 갱신이 끝난 뒤인 하강
에지에서 출력됩니다.
- 수정하기 전에 올바른 지연선의
dout열 열 줄을 예측합니다. n번째 줄의dout은 n − 1번째 줄의din입니다. - 파형에서
stage1과dout이 바뀌는 상승 에지를 비교합니다. 정상적인 2단 파이프라인에서는 같은 입력 값에 대해 두 신호가 서로 다른 에지에서 바뀝니다. - 두 신호가 같은 에지에서 함께 바뀌는 지점을 찾고, 어떤 문장 때문에
dout이stage1이 방금 받은 값을 읽었는지 판단합니다.
4. 수정과 확인
두 단이 모두 에지 이전 값을 읽도록 가장 작은 수정을 하고 다시 실행하세요. 그다음 아래 두 항목을 확인합니다.
| 확인 항목 | 기대 |
|---|---|
| 텍스트 출력 | dout 열이 din보다 한 줄 늦습니다 |
| 파형 | 모든 값에 대해 dout이 stage1보다 상승 에지 하나 뒤에 바뀝니다 |
마지막으로, 시작 코드의 시뮬레이션 결과와 합성된 하드웨어는 서로 일치하지만 요구 동작과는 일치하지 않는 이유를 설명해 보세요.
5. 완료 조건
- 리셋이 없을 때 각 상승 에지 뒤의
dout은 직전 상승 에지에서 샘플링한din과 같습니다. dout은 상승 에지에서만 바뀝니다.- 실행 도중 리셋하면 두 단이 모두 0이 됩니다. 리셋 직전
stage1에 있던 값은dout에 도달하지 않으며, 리셋 뒤 첫 출력은 0입니다.
6. 단계형 힌트
힌트 1
같은 에지에서 갱신되는 두 레지스터는 서로의 에지 이전 값을 읽어야 합니다. 파형을 보면 시작 코드의 두 단은 그렇게 동작하지 않습니다.
힌트 2
클록 블록 안의 문장이 어떤 대입을 쓰는지 확인해 보세요. 한 종류의 대입은 대상을 즉시 갱신하므로 다음 줄이 이미 새 값을 읽습니다.
힌트 3
테스트벤치 장의 nonblocking 예제가 두 대입을 나란히 비교합니다. 이 블록의 모든 분기에 클록 논리용 대입을 쓰세요.
7. 추가 실험
시작 코드의 대입 종류는 그대로 두고, else 분기의 두 문장 순서를 바꿔 dout을 먼저
대입해 보세요. 실행하기 전에 출력을 예측해 보세요. 그다음 이 버전은 우연히 통과하는데 원래
버전은 통과하지 못하는 이유를 설명해 보세요. 또 세 번째 단이나 두 번째 always 블록이
추가되면 문장 순서에 의존하는 방식이 쉽게 깨지는 이유도 함께 설명해 보세요.