50구현 문제
스칼라 BDPI carrier 폭 줄이기
1. 문제와 수정 범위
mkScalarAdapter.encode는 32비트 BSV 값을 scalarCarrier에 통과시킨 뒤
foreignEchoByte에 넘깁니다. 이 외부 함수 선언은 8비트 carrier를 받고 반환합니다. C 쪽이
기대하는 값은 입력의 하위 바이트입니다. 그런데 수정할 수 있는 scalarCarrier가 0을
반환하므로 모든 입력이 8'h00으로 경계를 넘고, 공개 실행은 32'h1234에 대해
carrier = 00을 출력합니다.
scalarCarrier의 본문만 수정하세요. Bit#(32) -> Bit#(8) 타입, 인터페이스, adapter, 외부
함수 선언, mkTop은 그대로 둡니다.
2. starter 읽기와 실행 전 예측
scalarCarrier의 시그니처를 읽어 보세요. 반환 타입이 목표 폭을 이미 정하고 있습니다.- 결과가
encode를 거쳐foreignEchoByte로 가는 경로를 따라가 보세요. 기본 실행에서는else쪽에 같은 시그니처로 인자를 그대로 반환하는 BSV 대역 함수가 정의됩니다. 따라서 화면에는 C 경계를 넘을 값이 그대로 출력됩니다.PRACTICE_REAL_BDPI를 정의하면import쪽이 쓰이며, 빌드할 때 C 구현도 연결해야 합니다. 타입 계약은 같습니다. - 실행 전에 starter의 출력을 예측하고, 올바르게 고친 뒤
32'h1234에 대한 출력도 예측해 보세요. 어느 바이트가 남고 어느 비트가 버려질까요?
3. 최소 수정과 완료 조건
이 변환은 절단입니다. 하위 8비트를 남기고 상위 24비트를 버립니다. 반환 식만 바꾼 뒤 다시 실행해 예측과 비교해 보세요. sample뿐 아니라 모든 32비트 입력에서 출력이 하위 바이트만으로 정해지는 이유도 설명해 보세요.
- 모든 32비트 입력에서 carrier는 입력의 하위 8비트와 같습니다.
- 상위 24비트만 바꾸면 carrier는 바뀌지 않습니다.
- 함수 타입과 외부 함수 선언은 바뀌지 않습니다.
8'h34를 상수로 반환하면 화면의 sample에서만 맞습니다.
4. 단계형 힌트
힌트 1: 폭은 이미 정해져 있습니다
반환 타입이 목표 폭을 8비트로 고정합니다. 산술이 아니라 폭 변환 문제입니다.
힌트 2: 쓸 변환
상위 비트를 버리고, 남길 비트 수를 기대 결과 타입에서 정하는 BSV 표준 변환 함수를 쓰세요.
5. 추가 실험
상위 24비트만 다르고 하위 바이트는 여전히 8'h34인 입력을 넣어, carrier가 그대로인
이유를 예측해 보세요. 다음에는 하위 바이트를 바꾸고 새 carrier를 예측해 보세요. 확인한
뒤에는 원래 입력으로 되돌리세요.