48검증 문제
가져온 RTL에서 읽은 값 연결하기
1. 문제와 수정 범위
mapRead는 가져온 value method의 8비트 결과를 잃지 않고 호출자에게 넘겨야 합니다.
wrapper는 외부 레지스터에 값을 제대로 쓰고, ImportedReg.read의 결과를 mapRead에
통과시켜 반환합니다. starter는 타입 검사를 통과하지만 load에 쓴 값과 show가 출력하는
값이 다릅니다. 결함은 RTL 포트 선언이 아니라 결과를 바꾸는 함수에 있습니다.
mapRead만 수정하세요. mkTop, 두 인터페이스, mkRegisterReader, BVI 선언은 그대로
둡니다.
2. starter 읽기와 실행 전 예측
mkTop의 step guard부터 읽어 보세요. step == 0인 사이클에 load가 8'h6b를 쓰고,
다음 사이클에 show가 값을 읽습니다. 읽기가 쓰기보다 먼저 실행되는 문제는 아닙니다.
읽은 값은 다음 경로를 지납니다.
| 경계 | 역할 |
|---|---|
RTL Q_OUT | 외부 레지스터의 저장값을 출력합니다 |
ImportedReg.read | 포트 값을 Bit#(8) method 결과로 표현합니다 |
mapRead | 가져온 결과를 wrapper의 결과로 변환합니다 |
reader.read | show에 출력할 값을 제공합니다 |
실행 전에 컴파일 성공 여부와 출력값을 각각 예측해 보세요. 함수와 method의 타입이
맞으므로 컴파일은 성공하고, 출력은 6b가 아닙니다. mapRead의 인자로 어떤 값이
들어오는지, 현재 반환 식이 서로 다른 두 인자를 구별할 수 있는지 설명해 보세요.
3. 최소 수정과 완료 조건
Bit#(8) -> Bit#(8) 함수 타입과 rule 순서는 유지하세요. mapRead가 받은 8비트 전체를
보존하도록 반환 식만 고칩니다. 레지스터를 추가하거나 rule을 옮길 필요는 없습니다. 지금의
단계 전이가 이미 외부 레지스터에 쓰기 사이클을 준 뒤에 값을 읽습니다.
수정한 뒤 실행의 출력값은 앞 사이클의 load 인자와 같아야 하고, 임의의 8비트 값에서도
같아야 합니다. 결과는 경계를 기준으로 설명해 보세요. BVI method는 여전히 Q_OUT을
연결하고, mapRead는 BSV로 들어온 값을 더 이상 가리지 않습니다. 입력 하나만 맞추는 상수는
올바른 수정이 아닙니다.
4. 단계형 힌트
힌트 1: 포트 연결과 함수 구분하기
BVI 결과 포트가 끊겨 있다면 BSV 함수를 고쳐도 해결되지 않습니다. 이 문제에서는 가져온
값이 이미 mapRead의 인자로 도착합니다.
힌트 2: 정보 손실 확인하기
mapRead에 서로 다른 두 값이 들어왔을 때 현재 반환값이 달라지는지 확인해 보세요.
힌트 3: 수정 범위 좁히기
기존 인자를 결과의 출처로 쓰세요. 리터럴, 절단, 확장, 새 상태는 필요하지 않습니다.
5. 추가 실험
수정을 마친 뒤 load에 넘기는 값을 8'hc3으로 바꿔 보세요. 각 단계에서 실행되는 rule과
출력될 값을 먼저 예측하고 실행으로 확인합니다. 같은 수정으로 새 값도 그대로 출력되어야
합니다. 이 실험은 채점 대상이 아닙니다.