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. 진단 순서
kept는old_byte에서 남길 비트를,taken은new_byte에서 가져올 비트를 담습니다.- 각 중간
wire가 실제로 몇 비트를 담을 수 있는지 선언에서 확인하세요. - 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에 대입하는
시점에 이미 일어나기 때문입니다.