본문으로 건너뛰기
code0.HDL

49구현 문제

가져온 RTL의 parameter 설정하기

1. 문제와 수정 범위

importedInitialValue는 실행 중에 바뀌는 데이터 포트가 아니라 RTL init parameter의 값을 정합니다. 고정된 BVI 선언과 wrapper는 이 상수를 생성자 인자로 받아 parameter에 이미 연결해 두었습니다. 문제는 이 상수가 잘못된 초기 상태를 고른다는 점입니다. starter는 올바른 하드웨어를 만들고 실행되지만, 첫 read에서 요구된 8'h2a가 아니라 00이 출력됩니다.

importedInitialValue 선언의 값만 수정하세요. 타입 Bit#(8), mkInitializedRegister, BVI 선언, mkTop은 그대로 둡니다.

2. starter 읽기와 실행 전 예측

먼저 elaboration 시점의 경로를 따라가 보세요.

단계값의 역할
importedInitialValue만들 인스턴스의 설정값을 제공합니다
mkImportedReg의 인자wrapper가 이 값을 BVI 모듈에 넘깁니다
parameter init외부 RegN의 초기 상태를 정합니다

다음으로 실행 시점의 관찰을 보세요. mkTop.show는 쓰기 없이 바로 read를 호출합니다. 실행 전에 starter의 컴파일 성공 여부와 첫 출력값을 예측해 보세요. parameter 값이 정해지는 시점과 method가 값을 읽는 사이클을 구분해 원인을 설명해 보세요.

3. 최소 수정과 완료 조건

수정할 수 있는 8비트 상수가 요구된 초기 상태 2a를 나타내게 하세요. BVI의 parameter 대입을 바꾸거나 초기화용 rule, 별도의 쓰기를 추가하지 않습니다.

수정한 뒤 실행에서, 앞선 write 없이 실행된 첫 read가 2a를 출력해야 합니다. 수정 이유는 두 시점으로 나누어 설명해 보세요. 상수를 바꾸면 빌드할 때 다른 parameter 값을 가진 RTL 인스턴스가 만들어집니다. 실행 중의 method 프로토콜과 포트 연결은 바뀌지 않습니다.

4. 단계형 힌트

힌트 1: 값이 쓰이는 시점

BVI parameter의 오른쪽 값은 사이클마다 전달되는 신호가 아닙니다. 하드웨어 인스턴스를 만들 때 정해집니다.

힌트 2: 수정할 선언

고정된 wrapper가 생성자 인자로 쓰는 Bit#(8) 상수를 찾아보세요. 수정할 수 있는 선언은 이것 하나뿐입니다.

힌트 3: 표현 방식

요구된 2a를 폭을 명시한 16진수 리터럴로 쓰세요. method나 rule은 고치지 않습니다.

5. 추가 실험

수정을 마친 뒤 다른 8비트 초기값을 골라 첫 read를 예측해 보세요. parameter를 바꾸면 다시 빌드해야 반영됩니다. 이미 만들어진 인스턴스의 parameter는 실행 중 method 호출로 바꿀 수 없습니다. 이 실험은 채점 조건이 아닙니다.

개념 다시 보기
준비
Main.bsv