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 호출로
바꿀 수 없습니다. 이 실험은 채점 조건이 아닙니다.