본문으로 건너뛰기
code0.HDL

14구현 문제

SyncReadMem 읽기 데이터에 valid 표시하기

1. 요구 동작

Scratchpad는 SyncReadMem에 16바이트를 저장합니다. 사용 측은 ren을 1로 올리고 raddr에 주소를 제시해 워드를 요청합니다. 모듈은 rdata에 그 워드가 실린 사이클에 rvalid를 1로 올립니다. 따라서 사용 측은 메모리의 읽기 지연을 몰라도 rvalid가 1인 사이클의 rdata만 받으면 됩니다.

리셋 직후 첫 사이클의 rvalid는 0입니다. 리셋 중에 요청이 있었더라도 마찬가지입니다.

2. Starter의 상태

메모리와 읽기 포트는 완성되어 있습니다. TODO 줄은 rvalid를 ren과 같게 만듭니다. 메모리가 요청한 사이클에 바로 응답한다고 가정한 구현입니다.

TODO 아래 대입을 메모리의 읽기 지연에 맞게 바꾸세요. 메모리, 포트, 테스트벤치는 그대로 둡니다.

3. 실행 전 예측

테스트벤치는 주소 0~3에 11, 22, 33, 44를 쓴 뒤 여섯 사이클 동안 요청을 보냅니다. 요청 순서는 주소 2 읽기, idle cycle, 주소 0 읽기, 주소 3 읽기, idle cycle, idle cycle입니다. 실제 사용 측처럼 rvalid가 1인 줄에서만 rdata를 출력합니다.

시작 코드를 실행하고 출력된 워드를 주소와 비교해 보세요. 이전 요청의 워드가 출력된 줄과, 어떤 요청에도 해당하지 않는 워드가 출력된 줄을 찾아보세요.

직전 클록 에지에서 읽기가 활성화되지 않았다면 SyncReadMem의 읽기 데이터는 정의되지 않습니다. 그 줄에 특정 값이 출력될 것이라고 가정하지 마세요.

수정 후 결과도 예측해 보세요. 주소 2의 값은 요청 다음 줄에 나타나야 합니다. 연속된 두 요청은 11과 44를 담은 valid 줄 두 개를 연달아 만들어야 합니다.

4. 수정 지점 찾기

SyncReadMem 읽기는 클록 에지에서 주소를 저장하고 다음 사이클에 데이터를 반환합니다. valid 플래그도 같은 수의 클록 에지만큼 늦어야 합니다. rvalid는 현재 요청이 아니라 한 사이클 전의 요청을 나타냅니다.

5. 실행 결과 해석

수정한 설계를 실행해 예측한 결과와 비교하세요. valid 줄마다 바로 윗줄에서 요청한 주소의 워드가 출력되어야 합니다. 사이클 1에서는 ren이 0인데도 rvalid가 1인 이유를 설명해 보세요.

6. 완료 조건

  • ren이 1인 사이클의 정확히 다음 사이클에만 rvalid가 1입니다. idle cycle과 연속 읽기에서도 같습니다.
  • rvalid가 1이면 rdata는 한 사이클 전에 요청한 주소의 워드입니다.
  • 리셋 직후 첫 사이클의 rvalid는 0입니다. 리셋 중에 ren이 1이었더라도 같습니다.
  • 같은 사이클에 다른 주소로 쓰기가 일어나도 플래그는 영향을 받지 않습니다.

7. 힌트

힌트 1

요청과 데이터 사이의 클록 에지 수를 세어 보세요. 플래그도 같은 수의 에지를 지나야 합니다.

힌트 2

레지스터로 ren을 한 사이클 늦추세요. 리셋 직후 플래그가 정의되도록 그 레지스터에 리셋 값을 줍니다.

개념 설명

동기 읽기 메모리는 요청 한 사이클 뒤에 데이터를 반환합니다. 그 데이터를 설명하는 신호도 데이터와 같은 사이클만큼 늦춰야 합니다. valid 비트는 제어 상태이므로 리셋 값이 필요하고, 메모리 내용에는 리셋이 필요 없습니다.

주소를 읽기 전에 그 위치에 값을 쓰세요. valid 플래그를 리셋해도 저장된 바이트는 초기화되지 않습니다. 같은 주소를 같은 사이클에 읽고 쓰면 읽기 데이터가 정의되지 않으며, 이 경우는 이 문제에서 데이터를 보장하는 범위에 포함되지 않습니다.

8. 추가 실험

수정한 rvalid는 그대로 두고 SyncReadMem을 Mem으로 바꾼다고 가정해 보세요. valid 줄의 rdata 값을 예측하고, 사용 측이 다시 올바른 워드를 받으려면 무엇을 더 바꿔야 하는지 정해 보세요.

개념 다시 보기
준비

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

Main.scala