본문으로 건너뛰기
code0.HDL

26구현 문제

폭 검사를 만족하는 suffix 만들기

1. 시그니처를 폭 방정식으로 읽기

appendTag는 n비트 입력 뒤에 4비트 suffix 4'hd를 붙입니다. 반환 폭 m은 Add#(n, 4, m) proviso에 따라 n + 4입니다. starter에서는 함수 시그니처를 먼저 읽고, 수정 가능한 taggedValue 선언과 반환문을 확인해 보세요. mkTop의 4비트 호출에서는 m = 8이 되어야 하며, 입력이 상위 4비트를, d가 하위 4비트를 차지해야 합니다.

실행하기 전에 공개 호출의 결과 폭과 4'hd의 위치를 예측해 보세요. ?는 정해진 비트 표현을 만들지 않습니다. 공개 예시만 8'had로 만드는 고정 결과도 다른 입력 폭에서 실패합니다. 수정 범위는 TODO가 표시된 선언입니다. 시그니처, proviso, 반환문, package와 mkTop은 그대로 두세요.

2. 식의 구조를 타입 관계와 일치시키기

필요한 식은 인자의 n비트와 suffix의 4비트를 합쳐야 합니다. 연결식의 결과 폭은 실행 중 계산 없이 피연산자 폭의 합이 됩니다. 첫 피연산자가 상위 비트를 차지하므로 순서도 요구 배치와 같아야 합니다. 형변환, 확장, 레지스터와 8비트 고정 상수는 필요하지 않습니다.

수정한 뒤 실행에서는 해당 호출의 m = 8이 성립해 컴파일되어야 합니다. 표시된 두 16진수 자리에서 입력과 suffix의 위치를 각각 확인하세요.

3. 완료 조건

다음 계약은 특정 예시가 아니라 허용되는 모든 입력 폭에 적용됩니다.

  • Add#(n, 4, m)과 polymorphic 시그니처를 유지합니다.
  • 결과 폭은 항상 n + 4입니다.
  • 결과 [m-1:4]는 입력 비트와 같습니다.
  • 하위 4비트는 항상 1101입니다.
  • 1비트, 2비트, 4비트 입력이 모두 같은 배치 규칙을 따릅니다.

4. 단계형 힌트

힌트 1: 타입 관계 계산

2비트 입력에 대해 Add#(2, 4, m)을 계산해 보세요. 반환 폭을 8로 고정할 수 없는 이유가 드러납니다.

힌트 2: 폭이 더해지는 연산

n비트 값과 4비트 값을 피연산자로 받고, 결과 폭이 두 폭의 합이 되는 연산을 고르세요.

힌트 3: suffix 위치

연결식은 상위 필드부터 작성합니다. 입력을 상위에 두고 지정된 suffix를 하위에 두어 taggedValue를 초기화하세요.

5. 추가 실험

mkTop에 Bit#(2) 입력과 Bit#(6) 결과를 임시로 추가하고 같은 함수를 호출해 보세요. 실행하기 전에 6비트 배치를 계산합니다. 실험이 끝나면 추가한 코드는 제거하세요. proviso가 각 호출에서 새로운 m을 결정하는지 확인하는 실험입니다.

개념 다시 보기
준비
Main.bsv