19검증 문제
잘못 번호 매겨진 opcode 찾기
1. 요구 동작
OpcodeDecode는 7비트 명령어 opcode를 해석합니다. 정상 인코딩은 다섯 개입니다.
| 명령어 | 인코딩 | memory | control |
|---|---|---|---|
| load | 0x03 | 1 | 0 |
| op-imm | 0x13 | 0 | 0 |
| store | 0x23 | 1 | 0 |
| branch | 0x63 | 0 | 1 |
| jal | 0x6f | 0 | 1 |
다섯 인코딩에서 valid는 1이고 나머지 패턴에서는 0입니다. 비정상 입력에서는
memory와 control도 0입니다. bits는 입력 비트를 그대로 출력합니다.
시작 코드는 컴파일되고 대부분의 명령어를 바르게 해석하지만, 정상 명령어 하나를
비정상으로 판정합니다. 명령어 형식과 어긋나는 선언을 찾아 고치세요. 모듈 이름, 포트,
Opcode.safe 사용은 그대로 둡니다.
2. 실행 결과 비교
시작 코드를 실행해 보세요. 공개 실행은 enum 폭을 출력한 뒤 정상 인코딩 다섯 개와 비정상 패턴 0x05를 해석합니다. 코드를 읽기 전에 출력된 각 줄이 위 표와 일치하는지 표시해 보세요.
3. 원인 진단
Opcode.safe의 플래그는 입력 비트가 Opcode에 선언된 값 중 하나와 같을 때만 1입니다.
정상 패턴이 거부되었다면 그 이름에 Chisel이 실제로 부여한 번호를 확인하세요. 선언을
한 줄씩 읽으며 각 값의 번호를 적어 보세요.
번호가 틀린 이름이 있다면, 디코더가 거부해야 할 다른 패턴을 대신 허용하고 있지는 않은지도 확인하세요.
4. 수정 후 확인
틀린 항목 하나만 고치고 다시 실행하세요. 정상 인코딩의 모든 줄이 표와 일치하고, 0x05는 여전히 거부되어야 합니다. 수정 전에 그 항목이 받은 번호와, 시작 코드가 그 번호 때문에 허용하던 패턴을 설명해 보세요.
5. 완료 조건
- 표의 다섯 인코딩만 유효하고 나머지 123개 패턴은 모두 유효하지 않습니다.
- 정상 입력과 비정상 입력 모두에서
memory와control이 맞습니다. bits는 항상 입력과 같습니다.- 인코딩 표 자체를 고쳐야 합니다. 출력 하나에 예외 조건을 추가하면 원인이 가려질 뿐입니다.
6. 단계형 힌트
힌트 1
출력을 명세와 비교해 보세요. 거부되는 정상 opcode가 하나이므로 의심할 enum 항목도 하나입니다.
힌트 2
인자 없는 Value는 번호를 건너뛰지 않습니다. 명시적 인코딩 뒤에 오는 Value가 어떤
번호를 받는지 규칙을 떠올려 보세요.
힌트 3
비트 패턴이 외부 계약이라면 계약에 속한 모든 항목에 인코딩을 직접 적으세요.
개념 설명
ChiselEnum의 명시적 인코딩은 외부에서 정한 형식을 표현합니다. 명시적 값 뒤의 인자
없는 Value는 이전 번호에 1을 더한 번호를 받습니다. 이 규칙은 내부 상태에는 편리하지만
opcode 표에서는 오류가 됩니다. 이 오류는 두 증상으로 나타납니다. 의도한 패턴은 거부되고,
바로 앞 항목보다 1 큰 패턴은 잘못 허용됩니다.
7. 추가 실험
실행하지 않고 시작 코드와 수정한 설계에서 0x24의 해석 결과를 예측해 보세요. 이어서 branch 항목을 올바른 인코딩으로 jal 아래로 옮기면 결과가 어떻게 될지 예측해 보세요.