본문으로 건너뛰기
code0.HDL

52구현 문제

다형 벡터의 폭 전달하기

1. 문제와 수정 범위

다형 BDPI import는 벡터를 포인터로 받으며, 폭을 자동으로 전달받지 못합니다. 그래서 이 설계는 C 함수를 구체 타입으로 둡니다. foreignWidth는 8비트 폭 값 하나를 받고, 다형 BSV 함수 vectorWidth가 adapter에 쓰인 각 Bit#(n) 타입의 폭을 계산해야 합니다. starter는 모든 타입에서 0을 반환하므로 공개 실행은 17비트 값에 대해 width = 0을 출력합니다.

vectorWidth의 본문만 수정하세요. 함수 시그니처, method 세 개가 있는 인터페이스, adapter, 외부 함수 선언, mkTop은 그대로 둡니다.

2. starter 읽기와 실행 전 예측

  1. vectorWidth의 시그니처를 읽어 보세요. 폭은 인자의 비트가 아니라 타입 매개변수 n에 들어 있습니다.
  2. mkWidthAdapter를 읽어 보세요. 같은 정의가 Bit#(5), Bit#(17), Bit#(31) 세 타입에 쓰이고, 쓰일 때마다 n이 따로 정해집니다.
  3. 실행 전에 세 폭의 결과를 각각 예측해 보세요. 인자의 비트 패턴으로는 이 질문에 답할 수 없는 이유도 설명해 보세요. 17'h0과 17'h1ffff는 폭이 같습니다.

3. 최소 수정과 완료 조건

타입 수준의 수를 값으로 바꾼 뒤 8비트 결과로 변환하세요. 반환 식만 바꾸고 17비트 공개 경로를 실행합니다. 나머지 두 인스턴스화는 실행하지 않고 추론으로 확인합니다.

  • vectorWidth는 adapter에 쓰인 폭 5, 17, 31을 각각 8비트 값으로 반환합니다.
  • 같은 타입의 값은 비트와 상관없이 모두 같은 폭을 반환합니다.
  • adapter의 세 method는 각각 5, 17, 31을 보고합니다.
  • 17을 상수로 반환하면 공개 sample에서만 맞습니다.

4. 단계형 힌트

힌트 1: 폭이 있는 곳

폭은 함수 인자의 비트가 아니라 타입 매개변수에 속합니다. 값이 생기기 전인 elaboration 시점에 이미 정해져 있습니다.

힌트 2: 타입에서 값으로

BSV에는 numeric type을 Integer로 바꾸는 함수가 있습니다. 이 함수를 n에 적용하고, Integer를 선언된 반환 타입으로 변환하세요.

5. 추가 실험

adapter method 하나를 모든 비트가 0인 값과 모든 비트가 1인 값으로 각각 호출한다고 가정해 보세요. 실행하기 전에 두 호출이 같은 폭을 보고하는 이유를 예측하고, 확인한 뒤에는 원래 호출로 되돌리세요.

개념 다시 보기
준비
Main.bsv