본문으로 건너뛰기
code0.HDL

06검증 문제

고장 신호로 팬 속도 강제하기

1. 요구 동작

FanControl은 8비트 온도 temp로 팬 속도를 정합니다.

조건speed
fault가 13. 온도 값과 무관합니다
temp가 80 이상2
temp가 50–791
temp가 50 미만0

fault가 1이면 센서 값을 신뢰할 수 없으므로, 어떤 온도에서도 최고 속도 3으로 동작해야 합니다.

시작 코드는 컴파일되고 fault가 0인 세 행은 정확합니다. 그러나 fault가 1인 행은 fault가 없는 것처럼 0을 출력합니다. 임계값, 속도 인코딩, 포트는 그대로 두고 원인만 고치세요.

2. 같은 sink에 대한 여러 연결

같은 sink에 조건이 참인 연결이 여럿이면, 소스에서 나중에 작성한 연결이 출력에 반영됩니다. 조건의 내용은 우선순위에 영향을 주지 않습니다. 시작 코드에서는 두 when 블록이 같은 출력 io.speed를 구동합니다.

temp = 30, fault = true를 넣었을 때 조건이 참인 연결을 소스 순서대로 모두 적고, 이 규칙을 적용해 보세요.

3. 실행 전 예측

시작 코드가 출력할 네 행을 예측해 보세요. 공개 실행이 출력하지 않는 temp = 90, fault = true의 결과도 예측해 보세요. 수정한 설계는 이 입력에서도 3을 출력해야 합니다.

4. 실행 결과 해석

시작 코드는 0, 1, 2, 0을 출력합니다. 고장 블록은 3을 연결하지만, 온도 체인이 그 뒤에 작성되어 있습니다. 온도 체인은 .otherwise가 나머지 경우를 모두 처리하므로 항상 값을 연결합니다. 따라서 고장 블록의 연결은 출력에 반영되지 않습니다. 수정한 설계는 0, 1, 2, 3을 출력합니다.

주의. 고장 검사를 체인 안의 온도 분기 뒤에 두면 차가운 행은 3을 출력하지만, 뜨거운 고장 입력은 여전히 온도를 따릅니다. 출력되지 않는 행으로 수정 결과를 반드시 확인하세요.

5. 완료 조건

  • fault가 1이면 0부터 255까지 모든 온도에서 speed가 3입니다.
  • fault가 0이면 경계값이 정확합니다. 49는 0, 50과 79는 1, 80은 2입니다.
  • 모든 경로에서 speed가 구동됩니다.

6. 단계형 힌트

힌트 1

고장 입력에서는 두 when 블록이 모두 값을 연결합니다. 출력에 반영되는 연결은 하나뿐이며, 소스에서의 위치가 그 연결을 결정합니다.

힌트 2

고장 판단은 조건이 참인 마지막 연결이 되거나, 어떤 온도 조건보다 먼저 검사되어야 합니다. 두 배치 모두 올바릅니다. 온도 분기 뒤에 끼워 넣는 배치는 올바르지 않습니다.

개념 설명

when은 우선순위를 표현하지 않습니다. Chisel은 sink에 대한 조건부 연결을 모두 모은 뒤 프로그램 순서로 해석합니다. .elsewhen 체인은 처음으로 참인 분기를 선택하고, 서로 다른 블록 사이에서는 나중 블록이 우선합니다.

7. 추가 실험

fault보다 우선순위가 낮고 속도를 2로 강제하는 두 번째 입력 boost를 추가한다고 가정해 보세요. boost 블록을 고장 블록과 체인에 대해 어디에 둘지 정하고, 두 입력이 모두 1이고 temp = 10일 때의 속도를 예측해 보세요.

개념 다시 보기
준비

CheerpJ로 브라우저에서 실행합니다. 첫 실행에는 Java 약 14.5 MB와 JAR 약 47 MB를 내려받습니다. 컴파일에 1분 정도 걸릴 수 있습니다. 라이선스

Main.scala