본문으로 건너뛰기
code0.HDL

29검증 문제

레지스터의 상위 바이트 보존하기

1. 문제와 수정 범위

patchLow는 저장된 word의 하위 8비트만 replacement로 바꾸고 상위 8비트는 보존해야 합니다. starter의 patchLow는 replacement를 0 확장해 레지스터 16비트 전체에 쓰므로 기존 상위 바이트가 사라집니다.

mkBytePatcher 안의 patchLow 구현만 수정하세요. BytePatcher 인터페이스, load, word, mkTop은 그대로 둡니다.

2. starter 읽기와 실행 전 예측

인터페이스의 method 세 개를 먼저 읽고 각각의 계약을 정리해 보세요. 다음으로 load와 patchLow가 레지스터의 어느 비트에 쓰는지 비교합니다. 결함은 patchLow에만 있습니다. mkTop은 step에 따라 적재, 패치, 출력을 서로 다른 사이클에 실행합니다.

step실행되는 동작클록 에지 뒤 wordReg
0load(16'habcd)16'habcd
1patchLow(8'h34)현재 starter: 16'h0034
2word 출력변화 없음

starter는 컴파일됩니다. 실행을 누르기 전에 출력이 16'h0034일 것이라고 예측하고, 결과로 확인해 보세요. 컴파일 오류가 아니라 실행 중 상태 전이가 잘못된 경우입니다.

3. 최소 수정과 완료 조건

다음 상태의 7번부터 0번 비트는 replacement에서, 15번부터 8번 비트는 현재 레지스터에서 와야 합니다. 레지스터에 부분 선택 쓰기를 하면 BSV가 현재 값을 읽고, 선택한 비트만 바꾼 전체 값을 클록 에지에서 기록합니다. 오른쪽 식은 이미 필요한 값을 제공하므로 쓰기 대상만 요구 범위로 좁히세요.

  • 7번부터 0번 비트를 바꾸고 15번부터 8번 비트를 보존합니다.
  • 기존 레지스터 쓰기의 대상에 비트 선택을 적용합니다.
  • 공개 method의 이름과 타입을 바꾸지 않습니다.

수정한 뒤 실행의 마지막 값은 16'hab34여야 합니다. 상위 바이트가 00이거나 ff여도 그대로 남아야 하고, 패치를 반복하면 가장 최근 값이 하위 바이트에 남아야 합니다. 상수 16'hab34를 직접 쓰는 구현은 현재 상태를 보존하지 못합니다.

4. 단계형 힌트

힌트 1: 잘못된 쓰기 범위 찾기

오른쪽 값보다 <= 왼쪽을 보세요. 현재 쓰기 대상은 wordReg의 몇 비트를 덮어쓸까요?

힌트 2: 범위 계산하기

인자 폭은 8비트이고 대상은 최하위 바이트입니다. 최하위 비트에서 시작하는 8비트 범위를 구해 보세요. 범위 밖의 비트는 쓰기 대상에 넣지 않습니다.

힌트 3: 기존 쓰기 형식 유지하기

BSV는 <= 왼쪽에 부분 선택을 허용합니다. 연산자를 유지하고, 왼쪽은 하위 8비트로 좁히세요. 오른쪽에는 그 폭에 맞는 replacement를 사용합니다. 임시 레지스터나 비트 연결은 필요하지 않습니다.

5. 추가 실험

수정을 마친 뒤 show 앞에, 다른 바이트로 patchLow를 한 번 더 호출하는 단계를 잠시 추가해 보세요. 최종 상위 바이트는 처음 적재한 값이고 하위 바이트는 마지막 패치 값일 것이라고 예측한 뒤 확인하고, 추가한 단계는 지우세요.

개념 다시 보기
준비
Main.bsv