47구현 문제
가져온 RTL에 쓰는 값 연결하기
1. 문제와 수정 범위
mkRegisterWriter는 이미 가져온 레지스터의 write method를 호출합니다. 그런데 수정할 수
있는 mapWrite 함수가 값을 경계 앞에서 바꿔 버립니다. starter는 컴파일되고 실행도 되므로
BVI 문법 오류가 아니라 데이터 경로의 결함입니다. load에 전달한 8비트 값과 나중에
출력되는 저장값이 일치하지 않습니다.
mapWrite의 값 변환만 수정하세요. 두 인터페이스, mkTop, mkRegisterWriter, BVI 선언은
그대로 둡니다. 클록, 리셋, schedule을 바꿔도 이 결함은 해결되지 않습니다.
2. starter 읽기와 실행 전 예측
mapWrite의 인자와 반환 타입을 먼저 확인하세요. 다음으로 mkRegisterWriter.load가 함수
결과를 어느 method에 넘기는지 읽습니다. 마지막으로 BVI의 method write(D_IN) enable(EN)에서
값 포트와 호출 표시 포트를 구분합니다.
| 단계 | 값 또는 동작 |
|---|---|
mkTop | load에 8'h5a를 전달합니다 |
| wrapper | mapWrite의 결과로 가져온 write를 호출합니다 |
| BVI 경계 | 결과가 D_IN에 연결되고, 호출한 사이클에 EN이 1이 됩니다 |
| 외부 레지스터 | 저장된 값이 다음 단계에서 read로 출력됩니다 |
실행 전에 결과를 예측해 보세요. 타입 오류가 없으므로 컴파일은 성공하고, 출력되는
저장값은 5a가 아닙니다. 그 이유를 mapWrite의 인자와 반환값의 관계로 설명해 보세요.
3. 최소 수정과 완료 조건
Bit#(8) -> Bit#(8) 함수 타입을 유지하면서 요청된 비트 패턴이 그대로 전달되게 하세요.
호출 순서를 바꾸거나 가져온 레지스터를 새로 만들지 않습니다. 새 상태, 형변환, method
호출은 필요하지 않습니다.
수정한 뒤 실행에서 load의 인자와 출력된 저장값이 같아야 합니다. 0이 아닌 비트가
섞인 어떤 8비트 값에서도 마찬가지입니다. 수정이 맞는 이유도 설명해 보세요. 함수는 폭도
의미도 바꾸지 않고, D_IN과 EN은 여전히 고정된 Action method가 제어합니다. 특정
sample만 맞추는 상수는 완료 조건을 만족하지 않습니다.
4. 단계형 힌트
힌트 1: 경계의 계약
외부 RTL까지의 연결은 이미 완성되어 있습니다. 입력 데이터를 그대로 두는 변환만
필요합니다. 클록, 리셋, schedule은 관련이 없습니다.
힌트 2: 수정 위치
mapWrite 안에서, 호출자가 요청한 8비트를 담은 값과 현재 반환되는 값을 비교해 보세요.
힌트 3: 가장 작은 수정
함수의 반환 식 하나만 기존 인자에 직접 의존하게 바꾸세요. 폭을 바꾸는 연산은 넣지 않습니다.
5. 추가 실험
수정을 마친 뒤 mkTop이 넘기는 값을 8'ha5처럼 상위와 하위 비트가 모두 섞인 값으로
바꾸고, 실행하기 전에 출력을 예측해 보세요. 같은 수정으로 새 값도 그대로 저장되어야
합니다. 이 실험은 채점 조건이 아닙니다.