본문으로 건너뛰기
code0.HDL

20검증 문제

burst 길이 표 고치기

1. 요구 동작

BurstBeats는 3비트 burst 코드를 beat 수로 변환합니다.

코드01234567
beat 수124816000

코드 5, 6, 7은 예약 코드이며 0을 출력해야 합니다.

시작 코드는 컴파일되고 모든 코드의 결과를 출력하지만, 두 줄이 표와 다릅니다. lookup의 결함을 찾아 고치세요. 모듈 이름, 포트, default가 0인 MuxLookup 사용은 그대로 둡니다.

2. 실행 결과 비교

시작 코드를 실행하고 각 줄을 표와 비교해 보세요. 틀린 코드 두 개와 각 코드가 반환한 값을 적어 보세요. 두 증상의 원인은 하나입니다. 다만 한 증상은 처음에는 같은 결함으로 보이지 않습니다.

3. 원인 진단

틀린 코드마다 다음을 확인하세요.

  1. 매핑에서 키가 이 코드와 같은 항목은 몇 개일까요?
  2. 같은 키가 없으면 MuxLookup은 어떤 값을 반환할까요?
  3. 같은 키가 둘 이상이면 어느 항목이 출력을 결정할까요?

Learn 장의 변형 실험은 목록으로 만든 lookup이 키가 같은 두 항목을 어떻게 처리하는지 보여 줍니다.

4. 수정 후 확인

매핑을 고치고 다시 실행하세요. 여덟 줄 모두 표와 일치해야 합니다. 잘못된 키 하나가 두 증상을 함께 만든 과정을 설명해 보세요. 어느 코드가 자기 항목을 잃었고, 어느 코드가 그 항목의 값을 대신 받았는지 적어 보세요.

5. 완료 조건

  • 여덟 코드 모두 표의 beat 수를 반환합니다.
  • 정상 코드는 각각 정확히 한 번 키로 나타납니다.
  • 예약 코드는 목록에 적지 않고 default로 처리합니다.
  • 항목 하나를 지우는 것만으로는 수정이 되지 않습니다. 자기 키가 없는 코드는 default를 반환합니다.

6. 단계형 힌트

힌트 1

틀린 줄 하나는 default를 반환합니다. 그 코드는 매핑에 자기 키가 없습니다.

힌트 2

다른 틀린 줄은 이웃 코드의 값을 반환합니다. 두 번 적힌 키를 찾아보세요.

개념 설명

MuxLookup은 목록을 비교 연쇄로 변환합니다. 키는 서로 달라야 하지만 Chisel은 중복을 검사하지 않습니다. 이 구현에서는 키가 중복되면 목록에서 나중에 적힌 항목이 앞선 항목을 경고 없이 덮어씁니다. 그 항목을 가져야 할 코드는 일치하는 키가 없으므로 default 값을 반환합니다.

7. 추가 실험

16 beat 항목까지 키 2로 잘못 적었다고 가정하고 여덟 코드의 출력을 예측해 보세요. 이어서 실행하지 않고 소스만 읽어 이런 결함을 찾는 방법을 설명해 보세요.

개념 다시 보기
준비

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

Main.scala