본문으로 건너뛰기
code0.HDL

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)에서 값 포트와 호출 표시 포트를 구분합니다.

단계값 또는 동작
mkTopload에 8'h5a를 전달합니다
wrappermapWrite의 결과로 가져온 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처럼 상위와 하위 비트가 모두 섞인 값으로 바꾸고, 실행하기 전에 출력을 예측해 보세요. 같은 수정으로 새 값도 그대로 저장되어야 합니다. 이 실험은 채점 조건이 아닙니다.

개념 다시 보기
준비
Main.bsv