본문으로 건너뛰기
code0.HDL

06구현 문제

valid로 쓰이지 않는 payload 보호하기

1. 유효성 규약

Decoded 구조체의 두 필드는 다음 규약을 따릅니다.

  • valid가 True이면 payload는 해석할 수 있는 명령 값입니다.
  • valid가 False이면 호출자는 payload를 읽거나 비교하거나 출력하지 않습니다.

타입은 두 번째 규칙을 강제하지 않습니다. 결과를 만드는 decodeCommand와 결과를 사용하는 호출자가 함께 이 규약을 지켜야 합니다. 이 문제에서 고칠 대상도 무효 payload의 특정 값이 아니라, 이 규약을 깨는 valid 값입니다.

2. 경계에서 현재 동작 확인하기

case에 명시된 분기 네 개는 3'd0부터 3'd3까지를 각각 8'h11, 8'h22, 8'h44, 8'h88로 변환합니다. 이 대응은 이미 올바릅니다. 나머지 code를 처리하는 default는 valid: True를 반환하므로, 존재하지 않는 명령이 정상 명령처럼 보입니다.

mkTop은 서버가 고정한 실행 코드이므로 수정하지 마세요. mkTop은 경계에 인접한 두 값만 관찰합니다. code 3에서는 valid와 payload를 함께 출력하고, code 4에서는 valid만 출력합니다. 실행하기 전에, starter의 code 4 결과를 받은 호출자가 0을 실제 명령 값으로 처리하게 되는 과정을 설명해 보세요.

3. 최소 범위로 수정하기

default 분기의 결과만 고치세요. 유효한 code 네 개의 valid와 payload는 그대로 두고, code 4부터 7까지는 모두 valid == False가 되게 합니다.

무효 payload에는 약속된 비트 패턴이 없습니다. ?는 이 값에 의존하지 않는다는 의도를 드러내고, 컴파일러가 구현을 자유롭게 고르게 합니다. 무효 payload를 상수 0으로 두어도 동작 규약은 만족합니다. 어느 쪽이든 정확성은 valid 값과, valid == False일 때 payload를 관찰하지 않는 호출자가 보장합니다.

4. 실행 결과 해석하기

수정한 뒤 실행에서 code 3은 valid=1, payload=88을, code 4는 valid=0만 보여야 합니다. 무효 결과의 payload까지 출력하는 확인 코드는 작성하지 마세요. 그런 출력은 ?를 안전하게 만든 전제, 즉 무효 payload를 관찰하지 않는다는 규약을 깨뜨립니다.

5. 완료 조건

  • code 0부터 3까지 기존 payload와 valid == True를 유지합니다.
  • code 4부터 7까지 빠짐없이 valid == False를 반환합니다.
  • 무효 결과를 받는 모든 경로는 payload를 사용하기 전에 멈춥니다.

6. 단계형 힌트

힌트 1

호출자가 payload를 사용해도 되는지 판단할 때 먼저 확인하는 필드를 찾아보세요.

힌트 2

3비트 입력 가운데 명시된 분기 네 개에 해당하지 않는 값은 모두 default로 처리됩니다.

개념 설명

don't-care value는 값을 감추는 기능이 아닙니다. 별도의 제어 정보가 모든 관찰을 막는다는 규약이 있을 때만 그 비트를 자유롭게 정해도 됩니다. 이 문제에서는 valid가 그 제어 정보입니다. valid가 payload를 물리적으로 숨기지는 않습니다.

7. 추가 실험

코드는 바꾸지 말고 무효 payload가 서로 다른 두 상수라고 가정해 보세요. 무효 payload를 읽거나 출력하지 않은 채, 각 경우에 호출자가 내릴 유효·무효 판정을 예측합니다. 이 비트가 달라져도 규약에 따른 판정은 달라지면 안 되는 이유를 설명해 보세요. 고정된 mkTop은 그대로 두세요.

개념 다시 보기
준비
Main.bsv