26검증 문제
start 바이트에서 프레임 체크섬 다시 시작하기
1. 요구 동작
FrameSum은 프레임마다 바이트를 더해 256으로 나눈 나머지를 sum에 유지합니다.
각 클록 에지에서 sum은 다음 규칙으로 바뀝니다.
valid | start | 에지 뒤의 sum |
|---|---|---|
| 1 | 1 | data. 새 프레임이 시작됩니다 |
| 1 | 0 | sum + data |
| 0 | 무관 | 그대로 |
리셋은 sum을 0으로 만듭니다.
2. 관찰되는 증상
리셋 직후의 첫 프레임은 올바르게 더해집니다. 그 뒤의 프레임은 합이 기대보다 크게
출력되고, 유휴 사이클 동안 start가 1로 남아 있어도 결과가 달라집니다.
회로가 출력하는 trace로 결함을 찾아 sum이 계약을 따르게 하세요. 하드웨어는
FrameSum에 있습니다. TracedFrameSum은 같은 하드웨어에 사이클 카운터와 printf를
추가한 클래스이고, 공개 실행은 이 클래스를 시뮬레이션합니다. TracedFrameSum과
포트는 바꾸지 않습니다.
3. 실행 전 예측
printf는 when (io.valid) 안에 있으므로 바이트를 받는 에지에서만 출력됩니다.
출력 값은 에지 직전의 값입니다. 사이클 번호, start, data, 그리고 바이트를
더하기 전 레지스터의 sum이 한 줄에 나옵니다.
공개 테스트벤치는 프레임 세 개를 넣고 프레임이 끝날 때마다 포트의 sum을
FRAME 줄로 출력합니다. 프레임 3에서는 유휴 사이클 하나 동안 start를 1로
유지합니다.
실행하기 전에 프레임별 FRAME 줄을 적어 보세요. trace 줄마다 다음 trace 줄에 나와야
할 sum도 적어 보세요. 그다음 시작 코드를 실행해 보세요.
4. 원인 진단
trace는 두 줄씩 짝지어 읽습니다. start 바이트는 이전 합을 대체하므로, start=1인 줄
다음 줄의 sum은 start 줄의 data와 같아야 합니다. 이 관계가 처음 깨지는 짝을 찾고
사이클 번호로 시점을 확인해 보세요.
sum을 구동하는 두 when 블록은 차례로 실행되는 문장이 아니라 한 사이클의
하드웨어입니다. 같은 에지에서 두 조건이 모두 참이면 sum에 대한 연결 중 하나만
적용됩니다. 어느 연결이 적용되는지 판단하고, start가 1이고 valid가 0인 에지에서
첫 번째 블록이 무엇을 하는지도 확인해 보세요.
5. 완료 조건
- 유효한 start 바이트는 합을 자신의
data로 바꿉니다. start 바이트가 0이거나 다른 start 바이트 바로 뒤에 와도 같습니다. start가 없는 유효 바이트는 합에 더해지고, 결과는 256으로 나눈 나머지입니다.valid가 0인 에지에서는start가 1이어도 아무것도 바뀌지 않습니다.- 리셋은 합을 0으로 만듭니다. 유효한 start 바이트가 들어온 에지에서도 리셋이 우선합니다.
6. 힌트
힌트 1
start와 valid가 모두 1일 때 sum에 대한 연결 중 어느 쪽이 적용될까요? 조합
회로 장의 마지막 연결 규칙은 레지스터에도 적용됩니다.
힌트 2
sum이 바뀔지 말지는 valid가 정하므로 valid를 바깥 조건으로 두세요. 그 안에서
start로 두 가지 새 값 가운데 하나를 고릅니다.
개념 설명
printf는 회로의 일부입니다. 리셋 중이 아닐 때 레지스터의 에지 직전 값을 출력하며,
감싸는 when 조건이 참일 때만 출력됩니다. valid로 조건을 걸면 받은 바이트마다
한 줄이 나옵니다. 수정한 설계에서는 중간에 리셋이 없는 연속한 두 출력 줄로 유효 바이트
하나를 반영하기 전후의 합을 비교할 수 있습니다. 두 줄 사이에 유휴 사이클이 있어도 같습니다.
7. 추가 실험
printf를 when (io.valid) 밖으로 옮겨 모든 에지에서 출력되게 해 보세요. 프레임 3에서
trace 줄이 몇 개 나오는지, 유휴 사이클 줄의 start와 sum이 무엇인지 예측해 보세요.