본문으로 건너뛰기
code0.HDL

07검증 문제

상태 워드 형식 맞추기

1. 형식 명세

주변 장치는 다음 배치의 16비트 상태 워드를 사용합니다.

비트필드폭
15valid1
14–12channel3
11–0count12

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으로 가고 나머지 필드가 한 비트씩 상위로 이동했다고 가정해 보세요. 예제 입력의 묶인 워드를 예측하고, 그 결과를 만드는 선언 변경을 적어 보세요.

개념 다시 보기
준비

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

Main.scala