본문으로 건너뛰기
code0.HDL

07구현 문제

value method로 비공개 상태 공개하기

1. 공개 범위와 수정 범위

패키지는 export한 이름만 밖으로 공개합니다. 이 문제에서 공개되는 것은 Tally 인터페이스와 mkTally이고, 호출자가 사용할 수 있는 method는 increment와 value뿐입니다. mkTally 안의 count 레지스터는 비공개이므로 호출자가 직접 읽을 수 없습니다.

TODO 아래 value method의 식만 완성하세요. count의 값이 인터페이스를 거쳐 호출자에게 전달되어야 합니다. 공개 상태를 새로 추가하거나 count를 복제하지 마세요. 기존 레지스터가 유일한 상태 원본입니다. increment와 mkTop은 바꾸지 않습니다.

2. starter 읽기와 예측

수정하기 전에 다음 세 곳을 찾아보세요.

  1. interface Tally의 method 두 개와 각 반환 타입
  2. mkTally 안의 비공개 레지스터 count
  3. increment와 value 두 method의 구현

mkTop의 drive rule은 increment를 세 번 호출하고, 그 뒤에 show rule이 value를 출력합니다. 현재 value는 ?이므로 컴파일은 되어도 출력값이 count와 아무 관계가 없습니다. 실행하기 전에 이 출력을 상태를 관찰한 값이라고 할 수 있는지 판단해 보세요.

3. 수정과 설명

value가 현재 count를 반환하도록 식 하나를 작성하세요. 수정한 뒤 실행하고, 받아들여진 세 번의 increment가 출력값에 반영되는 이유를 설명해 보세요. value method는 조합 논리로 레지스터의 현재 값을 읽으므로 show가 실행되는 사이클의 count를 그대로 보여 줍니다.

4. 완료 조건

  • value가 현재 count를 반환합니다.
  • count는 모듈 내부의 비공개 상태로 남습니다.
  • increment method는 바뀌지 않습니다.
  • 초기값 0과 각 increment 뒤의 상태가 모두 value로 관찰됩니다. 마지막 값 3을 고정해 반환하는 구현은 이 조건을 만족하지 못합니다.

5. 단계형 힌트

힌트 1

공개 method는 새 레지스터를 만들지 않고 이미 있는 상태를 관찰해야 합니다.

힌트 2

value method는 = 뒤에 식 하나로 정의할 수 있습니다. 인터페이스 밖으로 전달해야 하는 값을 저장한 비공개 선언을 찾아보세요.

개념 설명

패키지의 공개 인터페이스와 모듈의 비공개 상태는 분리되어 있습니다. 모듈 안에서 선언한 상태는 모듈 밖에서 보이지 않습니다. 호출자가 관찰할 수 있는 값은 value method가 반환하는 값뿐입니다.

6. 추가 실험

필수 수정을 마친 뒤 mkTop의 increment 호출 횟수를 한 번 또는 다섯 번으로 바꿔 보세요. 실행하기 전에 마지막 출력값을 예측합니다. 채점 조건은 아니며, value가 특정 실행 결과에 맞춘 값이 아니라 실제 상태를 보고하는지 확인하는 실험입니다. 제출하기 전에는 원래 횟수로 되돌리세요.

개념 다시 보기
준비
Main.bsv