10검증 문제
바이트를 명시적으로 줄이기
1. 폭 불일치가 발생하는 경로 읽기
lowNibble의 계약은 Bit#(8) 입력에서 하위 4비트를 골라 Bit#(4)로 반환하는 것입니다.
starter의 본문은 입력 전체를 그대로 반환합니다. 함수 시그니처에서 입력 폭과 반환 폭을
비교한 뒤, mkTop의 8'ha5 호출과 화면에 표시할 값을 확인해 보세요.
수정하기 전에는 8비트 식을 4비트 반환 타입에 맞출 수 없습니다. 실행하기 전에 실패하는 단계를 예측해 보세요. 실행은 시뮬레이션을 시작하지 못하고, 타입 검사에서 비트 폭 불일치 오류가 발생해야 합니다. 상위 비트를 버리는 변환이 소스에 적혀 있지 않은 것이 원인입니다. BSV는 폭을 줄이는 암묵적 변환을 하지 않습니다.
수정 범위는 lowNibble의 반환식입니다. package, 함수 시그니처와 mkTop은 그대로 두세요.
2. 데이터 손실 정책을 한 연산으로 명시하기
요구 동작은 포화, 니블 순서 변경, 조건부 마스킹이 아닙니다. 상위 비트를 버리고 하위 비트를 보존하는 폭 변환입니다. 목적지 타입에서 유지할 폭을 얻는 연산 하나면 충분합니다. 새 지역 값이나 상태는 추가하지 마세요.
수정한 뒤 실행에서 컴파일이 통과하면 폭 축소가 소스에 명시되었다는 뜻입니다. 8'ha5의
하위 니블 5가 표시되면 남긴 비트 영역도 올바릅니다.
3. 완료 조건
한 예시의 출력만 맞추지 말고 다음 계약을 만족해야 합니다.
- 입력과 반환 타입은 각각
Bit#(8),Bit#(4)로 유지됩니다. - 하위 비트만 1인 입력은 해당 비트를 보존합니다.
- 상위 비트만 1인 입력은 0을 반환합니다.
- 혼합 입력은
[7:4]를 버리고[3:0]을 그대로 반환합니다.
4. 단계형 힌트
힌트 1: 위반된 계약
현재 반환식이 함수의 반환 타입보다 넓습니다. BSV에서는 의도한 데이터 손실을 소스에 표현해야 합니다.
힌트 2: 보존할 비트
필요한 값은 입력의 하위 영역입니다. 확장이나 부호 해석 변경이 아니라 상위 위치를 버리는 폭 연산을 찾아보세요.
힌트 3: 사용할 primitive
truncate는 문맥의 목적지 폭에 맞춰 하위 비트를 유지합니다. 함수 시그니처를 바꾸지 말고
반환 위치에 적용하세요.
5. 추가 실험
완료한 뒤 반환 폭을 잠시 3비트로 바꾸고, 하위 니블이 1101인 입력을 사용해 보세요.
어느 세 비트가 남는지 먼저 계산한 뒤 실행합니다. 실험이 끝나면 필수 시그니처로
복원하세요. 4비트 마스크를 고정한 구현과 문맥에서 폭을 얻는 변환의 차이를 확인하는
실험입니다.