37구현 문제
튜플 필드 두 개 분해하기
1. 문제와 수정 범위
joinFields는 4비트 값 두 개를 담은 Tuple2를 받아, 튜플 순서대로 이어 붙인 값을
반환해야 합니다. 첫 필드가 상위 4비트, 둘째 필드가 하위 4비트가 됩니다. starter는 인자를
보지 않고 8'h00을 반환하므로 공개 실행은 a5가 아니라 joined = 00을 출력합니다.
joinFields의 본문만 수정하고, 필드는 match 대입으로 변수에 묶으세요. 함수
시그니처와 mkTop은 그대로 둡니다.
2. starter 읽기와 실행 전 예측
- 인자 타입을 읽어 보세요.
Tuple2의 구조는 하나뿐이므로 고를 분기가 없고, 필드에 이름만 붙이면 됩니다. - 반환 타입과 폭을 비교해 보세요. 4비트 필드 두 개가 8비트를 남김없이 채웁니다.
mkTop의 호출을 읽어 보세요. 첫 필드는4'ha, 둘째 필드는4'h5로 서로 쉽게 구별됩니다.
실행 전에 시작 코드의 출력 00과 올바르게 고친 뒤의 출력을 예측해 보세요. 입력 필드가
각각 결과의 어느 쪽에 놓이는지 정합니다.
3. 최소 수정과 완료 조건
먼저 분해하고, 그다음에 조립합니다. match 문 하나가 튜플의 각 위치에 새 변수를 하나씩
만들고, 다음 문장이 그 변수로 결과를 만듭니다. 패턴은 각 변수의 의미를, 결과 식은 각
변수의 위치를 정하므로 두 결정은 서로 독립입니다.
수정한 뒤 실행으로 새 출력을 확인하세요. 패턴은 그대로 두고 결과 식에서 두 변수의
순서만 바꾸면 5a가 출력되는 이유도 설명해 보세요.
- 튜플 패턴을 쓴
match대입이 두 필드를 모두 변수에 묶습니다. - 어떤 입력 쌍에서도 첫 필드는 상위 4비트, 둘째 필드는 하위 4비트에 놓입니다.
- 두 필드가 같거나 0이거나 모두 1이어도 위치가 유지됩니다.
8'ha5를 그대로 반환하면 화면의 예시에서만 맞습니다.
4. 단계형 힌트
힌트 1: match를 쓰는 이유
match 대입은 case 분기를 고르지 않고, 뒤따르는 문장에서 쓸 타입 있는 변수를
만듭니다. 구조가 이미 정해진 튜플과 구조체에 알맞습니다.
힌트 2: 패턴 만들기
튜플의 위치 수를 세고, 위치마다 새 패턴 변수를 하나씩 둔 튜플 패턴을 쓰세요.
힌트 3: 결과 조립하기
묶은 변수의 폭을 Bit#(8)의 상위 절반, 하위 절반과 비교해 보세요. 두 변수를 튜플
순서대로 비트 연결하면 폭이 정확히 맞습니다.
5. 추가 실험
패턴은 그대로 두고 결과의 두 절반만 바꿔 보세요. 실행하기 전에 새 출력을 예측하고, 확인한 뒤에는 요구된 순서로 되돌리세요.