22구현 문제
가장 낮은 번호의 요청 선택하기
1. 요구 동작
LowestRequest는 요청자 네 개를 처리합니다. req의 비트 i는 요청자 i의 요청이고,
data(i)는 요청자 i의 8비트 값입니다.
| 요청 상태 | out |
|---|---|
| 하나 이상 요청이 1 | 번호가 가장 낮은 요청자의 data |
| 요청이 모두 0 | 0 |
시작 코드는 out에 상수 0을 연결하므로 모든 요청 패턴에서 0이 출력됩니다. 이 상수를 두
규칙을 모두 구현하는 선택식으로 바꾸세요. 모듈 이름과 포트는 그대로 둡니다. io.req를
비트별로 나눈 Bool 목록 req는 그대로 사용할 수 있습니다.
2. 선택 신호의 형태 판단
코드를 쓰기 전에 선택 신호의 성질을 정리해 보세요. 요청은 동시에 여러 개가 1일 수 있으므로 조건이 겹칩니다. 겹친 조건 사이에는 우선순위가 필요하고, 참인 조건이 없을 때의 출력도 따로 정해져 있습니다. Learn 장의 계약 표에서 유틸리티마다 다음 두 경우의 동작을 확인하세요.
| 확인할 경우 | 질문 |
|---|---|
| 선택자가 겹칠 때 | 어떤 값을 출력할까요? |
| 참인 선택자가 없을 때 | 어떤 값을 반환할까요? |
3. 실행 결과 예측
공개 실행은 data를 11, 22, 33, 44로 두고 req를 최상위 비트부터 출력합니다. 수정한
설계를 실행하기 전에 0100, 0110, 1010, 1000, 0000의 올바른 out을 적어 보세요. 다섯 줄 가운데
요청이 겹치는 줄 하나와 요청이 없는 줄을 골라, 올바른 설계와 그럴듯한 두 가지 오답을
구별해 보세요.
4. 실행 결과 해석
상수를 바꾸고 실행해 다섯 줄을 예측과 비교하세요. 앞에서 표시한 두 줄에서, 겹친 데이터를 OR하는 선택자와 선택이 없을 때 마지막 값을 반환하는 선택자가 각각 무엇을 출력할지 적어 보세요. 두 줄의 차이를 보면 선택한 유틸리티가 예제 입력에서만 우연히 맞는 것이 아님을 확인할 수 있습니다.
5. 완료 조건
- 16개 요청 패턴 모두에서 가장 낮은 1 비트의
data가 선택됩니다. - 요청이 없으면
out은 0이며, 어떤data입력도 출력하지 않습니다. - 출력된 네 값뿐 아니라 임의의
data값에서 선택이 성립합니다. - 두 요청이 동시에 들어와도 한 요청자의 값만 반환하고 값이 섞이지 않습니다.
6. 단계형 힌트
힌트 1
요청이 없는 줄은 유틸리티 하나를 배제하고, 요청이 두 개인 줄은 다른 하나를 배제합니다. 남는 유틸리티를 확인해 보세요.
힌트 2
PriorityMux는 우선순위는 맞지만 default 인자가 없습니다. 명시적 default가 있고 목록에서
처음 참인 조건을 고르는 유틸리티는 추가 로직 없이 두 규칙을 만족합니다.
힌트 3
조건 목록은 Seq.tabulate로 elaboration 중에 만들 수 있습니다. req(i)와
io.data(i)를 쌍으로 묶으며, 목록 순서가 우선순위를 정합니다.
개념 설명
선택 유틸리티의 차이는 쉬운 입력의 출력값이 아니라 전제에 있습니다. Mux1H는 선택자가
정확히 하나만 참이어야 하며, 그 밖의 경우 결과는 정의되지 않습니다. 현재의 다중 입력
UInt 구현은 선택된 데이터를 OR하므로 우선순위를 구현하지 못합니다. PriorityMux는 겹침을
해결하지만 참인 선택자가 없으면 마지막 값을 반환합니다. MuxCase는 목록 순서로 겹침을
해결하고 명시적 default를 반환하므로 두 규칙에 모두 맞습니다.
7. 추가 실험
번호가 가장 높은 요청자가 선택되도록 규칙을 바꾼다고 가정해 보세요. 공개 실행의 다섯 줄을 예측하고, 코드에서 바꿔야 하는 유일한 부분을 찾아보세요.