20검증 문제
burst 길이 표 고치기
1. 요구 동작
BurstBeats는 3비트 burst 코드를 beat 수로 변환합니다.
| 코드 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| beat 수 | 1 | 2 | 4 | 8 | 16 | 0 | 0 | 0 |
코드 5, 6, 7은 예약 코드이며 0을 출력해야 합니다.
시작 코드는 컴파일되고 모든 코드의 결과를 출력하지만, 두 줄이 표와 다릅니다. lookup의
결함을 찾아 고치세요. 모듈 이름, 포트, default가 0인 MuxLookup 사용은 그대로 둡니다.
2. 실행 결과 비교
시작 코드를 실행하고 각 줄을 표와 비교해 보세요. 틀린 코드 두 개와 각 코드가 반환한 값을 적어 보세요. 두 증상의 원인은 하나입니다. 다만 한 증상은 처음에는 같은 결함으로 보이지 않습니다.
3. 원인 진단
틀린 코드마다 다음을 확인하세요.
- 매핑에서 키가 이 코드와 같은 항목은 몇 개일까요?
- 같은 키가 없으면
MuxLookup은 어떤 값을 반환할까요? - 같은 키가 둘 이상이면 어느 항목이 출력을 결정할까요?
Learn 장의 변형 실험은 목록으로 만든 lookup이 키가 같은 두 항목을 어떻게 처리하는지 보여 줍니다.
4. 수정 후 확인
매핑을 고치고 다시 실행하세요. 여덟 줄 모두 표와 일치해야 합니다. 잘못된 키 하나가 두 증상을 함께 만든 과정을 설명해 보세요. 어느 코드가 자기 항목을 잃었고, 어느 코드가 그 항목의 값을 대신 받았는지 적어 보세요.
5. 완료 조건
- 여덟 코드 모두 표의 beat 수를 반환합니다.
- 정상 코드는 각각 정확히 한 번 키로 나타납니다.
- 예약 코드는 목록에 적지 않고 default로 처리합니다.
- 항목 하나를 지우는 것만으로는 수정이 되지 않습니다. 자기 키가 없는 코드는 default를 반환합니다.
6. 단계형 힌트
힌트 1
틀린 줄 하나는 default를 반환합니다. 그 코드는 매핑에 자기 키가 없습니다.
힌트 2
다른 틀린 줄은 이웃 코드의 값을 반환합니다. 두 번 적힌 키를 찾아보세요.
개념 설명
MuxLookup은 목록을 비교 연쇄로 변환합니다. 키는 서로 달라야 하지만 Chisel은 중복을
검사하지 않습니다. 이 구현에서는 키가 중복되면 목록에서 나중에 적힌 항목이 앞선 항목을
경고 없이 덮어씁니다. 그 항목을 가져야 할 코드는 일치하는 키가 없으므로 default 값을
반환합니다.
7. 추가 실험
16 beat 항목까지 키 2로 잘못 적었다고 가정하고 여덟 코드의 출력을 예측해 보세요. 이어서 실행하지 않고 소스만 읽어 이런 결함을 찾는 방법을 설명해 보세요.