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 읽기와 실행 전 예측
- method 시그니처를 읽어 보세요. 입력은
Bit#(12), 결과는Tuple2#(Bit#(4), Bit#(8))입니다. 결과 폭 두 개를 적고, 합이 입력 폭과 같은지 확인합니다. mkTop을 읽어 보세요.match대입으로 튜플을 받아kind,payload순서로 출력합니다.- 실행 전에 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에서 경계가
어디로 옮겨 가는지, 어떤 타입 수준의 합이 여전히 성립해야 하는지 예측해 보세요.