본문으로 건너뛰기
code0.HDL

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.readshow에 출력할 값을 제공합니다

실행 전에 컴파일 성공 여부와 출력값을 각각 예측해 보세요. 함수와 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과 출력될 값을 먼저 예측하고 실행으로 확인합니다. 같은 수정으로 새 값도 그대로 출력되어야 합니다. 이 실험은 채점 대상이 아닙니다.

개념 다시 보기
준비
Main.bsv