본문으로 건너뛰기
code0.HDL

02검증 문제

마스크로 두 바이트 합치기

1. 요구 동작

byte_merge는 mask의 각 비트로 출력 비트의 출처를 정합니다. mask 비트가 1이면 new_byte의 같은 비트를, 0이면 old_byte의 같은 비트를 merged로 출력합니다. mask가 8'hF0이면 상위 4비트만 새 값으로 바뀌고 하위 4비트는 그대로 유지됩니다.

시작 코드는 컴파일되고 첫 번째 출력 줄도 맞습니다. 두 번째 줄은 mask = f0인데도 새 상위 비트가 나타나지 않습니다. 세 번째 줄은 mask = ff인데도 new_byte의 하위 16진 숫자만 출력에 전달됩니다.

포트, 세 assign 문, 공개 테스트벤치는 그대로 두세요. 데이터를 잃게 만드는 선언 하나를 찾아 고치면 됩니다.

2. 진단 순서

  1. kept는 old_byte에서 남길 비트를, taken은 new_byte에서 가져올 비트를 담습니다.
  2. 각 중간 wire가 실제로 몇 비트를 담을 수 있는지 선언에서 확인하세요.
  3. 8비트 식을 더 좁은 wire에 대입하면 남는 상위 비트가 어떻게 되는지 판단해 보세요.

실행하기 전에 선언된 폭을 그대로 적용해 세 줄을 손으로 계산해 보세요. 계산 결과는 시작 코드의 잘못된 출력과 일치해야 합니다. 일치하지 않는다면 new_byte에서 merged까지 지나는 모든 이름의 폭을 다시 확인하세요.

손 계산이 틀린 출력과 일치하면, 손실을 막는 가장 작은 선언 수정을 하고 다시 실행하세요. 세 줄이 모두 비트 단위 정의와 일치해야 합니다. 수정한 뒤에는 assign을 하나도 바꾸지 않아도 된 이유를 설명해 보세요. 식은 처음부터 올바랐고, 결과를 담는 이름 하나의 폭이 부족했을 뿐입니다.

3. 완료 조건

  • 상위 비트만, 하위 비트만, 전체, 아무 비트도 선택하지 않는 마스크를 포함한 모든 마스크에서 merged가 올바릅니다.
  • 출력에 보이는 세 값뿐 아니라 여러 바이트 패턴에서 비트 단위 정의와 일치합니다.
  • 중간 wire 두 개와 결합 assign 하나로 이루어진 구조를 유지합니다.

4. 단계형 힌트

힌트 1

마스크가 비트 3부터 0까지만 선택하면 결과가 항상 맞습니다. 그 4비트만 담을 수 있는 이름을 찾아보세요.

힌트 2

wire는 값을 저장하지 않지만, 선언한 범위가 폭을 결정합니다. 더 넓은 값을 대입하면 상위 비트는 경고 없이 절단됩니다.

힌트 3

두 중간 wire 선언의 범위를 각각에 대입되는 8비트 식과 비교해 보세요.

5. 추가 실험

taken 대신 kept가 4비트였다고 가정하고, 세 출력 줄 가운데 어느 줄이 틀리는지 예측해 보세요. 이 경우 merged의 상위 4비트는 taken에서만 오므로, 상위 절반에서 마스크 비트가 0인 위치는 이전 값 대신 0이 됩니다. 두 경우 모두 merged를 만드는 마지막 assign에서는 고칠 수 없습니다. 절단은 두 wire에 대입하는 시점에 이미 일어나기 때문입니다.

개념 다시 보기
준비
Main.v