07검증 문제
상태 워드 형식 맞추기
1. 형식 명세
주변 장치는 다음 배치의 16비트 상태 워드를 사용합니다.
| 비트 | 필드 | 폭 |
|---|---|---|
| 15 | valid | 1 |
| 14–12 | channel | 3 |
| 11–0 | count | 12 |
StatusWord는 Status 입력 in을 word로 묶고, 평탄한 입력 raw를 Status 출력
out으로 풉니다. valid = 1, channel = 5, count = 0x123이면 word는 d123이어야
합니다. raw = a00f는 valid = 1, channel = 2, count = 00f로 읽혀야 합니다.
시작 코드는 컴파일되고 실행되지만 출력된 두 행 모두 표와 다릅니다. 원인을 찾아 묶기와 풀기가 모두 표를 따르도록 고치세요. 포트 이름, 필드 이름, 필드 폭은 그대로 둡니다.
2. 배치의 출처
두 변환은 asUInt와 asTypeOf 한 줄씩이며, 비트 위치를 직접 지정하지 않습니다. 두
변환이 배치를 어디에서 가져오는지 먼저 확인하세요. 그다음 그 출처를 최상위 비트부터 필드
단위로 표와 비교해 보세요.
3. 실행 전 예측
코드가 정하는 순서로 필드를 배치해 시작 코드가 출력할 16비트 워드를 적어 보세요. a00f도
같은 방식으로 풀어 보세요. 예측 결과는 시작 코드의 891d, 그리고 channel=7 count=401과
일치해야 합니다.
4. 실행 결과 해석
891d는 1, 0001_0010_0011, 101 순서로 이루어집니다. count가 valid 바로 아래에
있고, channel이 최하위 3비트에 있습니다. 풀기 결과는 같은 배치를 반대로 적용한
것입니다. 두 변환이 같은 선언을 사용하므로 오류 하나가 양쪽 모두에 나타납니다. 수정 후
출력은 d123과 valid=1 channel=2 count=00f입니다.
5. 완료 조건
- 모든 필드 값 조합이 명세된 비트 위치로 묶입니다.
- 모든 16비트
raw값이 명세된 필드로 풀립니다. - 묶기와 풀기가 서로 일치합니다. 한 방향만 고치면 완료가 아닙니다.
6. 단계형 힌트
힌트 1
asUInt와 asTypeOf는 주변 장치의 형식을 알지 못합니다. 두 변환은 Bundle 선언에서만
비트 배치를 읽습니다.
힌트 2
먼저 선언한 필드가 최상위 비트를 차지합니다. Status의 두 번째와 세 번째 필드 순서를
표와 비교해 보세요. 묶기 방향만 Cat으로 고치면 풀기 방향은 여전히 틀립니다.
개념 설명
외부 형식을 기술하는 Bundle은 명세 그 자체이며, 필드 순서가 곧 비트 배치입니다. 선언을
고치면 그 선언을 사용하는 모든 변환이 함께 바뀝니다. 사용하는 곳마다 비트를 직접 잘라
쓰면 두 방향이 서로 어긋날 수 있습니다.
7. 추가 실험
형식이 바뀌어 valid가 비트 0으로 가고 나머지 필드가 한 비트씩 상위로 이동했다고
가정해 보세요. 예제
입력의 묶인 워드를 예측하고, 그 결과를 만드는 선언 변경을 적어 보세요.