본문으로 건너뛰기
code0.HDL

41구현 문제

결과 폭으로 프레임 나누기

1. 문제와 수정 범위

FrameSplitter.fields는 12비트 프레임을 상위 4비트 kind와 하위 8비트 payload로 나누어 이 순서의 튜플로 반환해야 합니다. starter는 tuple2(0, 0)을 반환하므로 공개 실행은 sample 12'ha5c에 대해 kind = 0 payload = 00을 출력합니다.

starter의 TODO대로 split을 써서 method 본문을 구현하세요. 인터페이스, method의 반환 타입, 모듈 구조, mkTop은 그대로 둡니다. 비트 위치를 직접 적지 마세요.

2. starter 읽기와 실행 전 예측

  1. method 시그니처를 읽어 보세요. 입력은 Bit#(12), 결과는 Tuple2#(Bit#(4), Bit#(8))입니다. 결과 폭 두 개를 적고, 합이 입력 폭과 같은지 확인합니다.
  2. mkTop을 읽어 보세요. match 대입으로 튜플을 받아 kind, payload 순서로 출력합니다.
  3. 실행 전에 starter의 출력을 예측하고, 올바르게 고친 뒤 12'ha5c에 대한 출력도 예측해 보세요. 16진수 자리 가운데 어느 것이 kind이고 어느 두 자리가 payload일까요?

starter를 한 번 실행해 두 필드가 모두 0인지 확인해 보세요.

3. 최소 수정과 완료 조건

split은 벡터 하나를 받아 쌍을 반환합니다. 두 결과의 폭은 인자가 아니라 호출한 쪽이 기대하는 타입에서 정해집니다. method가 이미 결과 타입을 선언했으므로, 식을 쓰기 전에 나누는 관계가 정해져 있습니다. 반환값만 바꾼 뒤 다시 실행해 예측과 비교하세요. 첫 필드가 최상위 비트를 받는 이유도 설명해 보세요.

  • 모든 12비트 프레임에서 첫 필드는 상위 4비트, 둘째 필드는 하위 8비트와 같습니다.
  • 두 필드 사이에 빠지거나 겹치는 입력 비트가 없습니다.
  • 폭 관계는 직접 쓴 비트 범위가 아니라 선언된 결과 타입에서 옵니다.
  • 12'ha5c의 필드를 상수로 반환하면 sample에서만 맞습니다.

4. 단계형 힌트

힌트 1: 폭이 정해지는 곳

선언된 반환 타입이 split의 두 결과 폭을 정합니다. 타입 검사는 4 + 8 = 12도 확인하므로 두 필드가 입력을 남김없이 덮습니다.

힌트 2: split에 넘길 값

split의 인자는 하나입니다. method 안에서, 결과를 잘라 낼 12비트 전체 값에 해당하는 타입을 가진 값을 찾아보세요.

5. 추가 실험

결과 타입을 Tuple2#(Bit#(5), Bit#(7))로 바꾼다고 가정해 보세요. 12'ha5c에서 경계가 어디로 옮겨 가는지, 어떤 타입 수준의 합이 여전히 성립해야 하는지 예측해 보세요.

개념 다시 보기
준비
Main.bsv