본문으로 건너뛰기
code0.HDL

36검증 문제

경계 opcode 제외하기

1. 문제와 수정 범위

decodeSmall은 상위 4비트가 1010인 명령 가운데 하위 4비트 payload가 10보다 작은 경우에만 그 payload를 반환해야 합니다. 나머지 명령은 모두 0을 반환합니다. 리터럴 패턴은 올바르지만 뒤의 filter가 경곗값 10까지 통과시킵니다. 그래서 공개 실행의 payload 10 줄은 0이 아니라 10으로 출력됩니다.

filter만 수정하세요. 8'b1010_???? 패턴, default 분기와 그 위치, 함수 시그니처, mkTop은 그대로 둡니다. 패턴 매칭을 비트 마스크 연산으로 바꾸지 마세요.

2. starter 읽기와 실행 전 예측

  1. 첫 분기를 &&& 앞의 패턴과 뒤의 filter로 나누어 읽어 보세요.
  2. default 분기를 읽어 보세요. 패턴에서 걸러졌든 filter에서 걸러졌든, 첫 분기가 받지 않은 명령은 모두 여기서 처리됩니다.
  3. mkTop의 호출 세 개를 읽어 보세요. payload 9, payload 10, 다른 상위 비트를 가진 명령입니다.

실행 전에 시작 코드의 세 줄을 예측해 보세요. 9는 9, 10은 10, 다른 상위 비트는 0입니다. 틀린 줄은 가운데뿐입니다. payload 11도 예측해 보세요. 11은 이미 default로 넘어갑니다.

3. 최소 수정과 완료 조건

결함은 범위의 한 점, 즉 비교가 같음을 포함한다는 데 있습니다. filter의 비교만 고쳐 10이 통과하지 못하게 하세요. 수정한 뒤 실행에서 가운데 줄은 0이 되고 나머지 두 줄은 그대로여야 합니다. 세 결과가 각각 어느 분기에서 나왔는지 설명해 보세요.

입력기대 결과
상위 1010, payload 0부터 9payload 그대로(0 포함)
상위 1010, payload 10부터 150
다른 상위 비트하위 비트와 상관없이 0

분기 순서는 유지하므로 filter가 있는 분기가 default보다 먼저 검사됩니다. 완료 조건은 출력된 세 값이 아니라 가능한 명령 256개 전체에 적용됩니다. 값 하나를 따로 제외하지 말고 허용 범위를 규칙으로 표현하세요.

4. 단계형 힌트

힌트 1: 분기 하나 안의 두 검사

filter가 있는 분기는 두 검사를 차례로 수행합니다. 패턴이 명령 집합을 먼저 고르고, &&& 뒤의 filter가 맞은 경우의 범위를 더 좁힙니다.

힌트 2: 요구 조건을 글자 그대로 읽기

"10보다 작다"에 10이 들어가는지 판단해 보세요. 그다음 패턴이 아니라 비교 연산자를 보세요.

5. 추가 실험

default 분기를 filter가 있는 분기보다 위로 옮긴다고 가정해 보세요. 세 출력을 예측하고, filter가 있는 분기에 도달할 수 없게 되는 이유를 설명해 보세요.

개념 다시 보기
준비
Main.bsv