02검증 문제
생성기 루프가 무시하는 매개변수 찾기
1. 요구 동작
Gains는 Scala method gain(in, doublings, bias) 하나로 8비트 출력 두 개를
구동합니다. gain은 덧셈기를 이어 붙여 in * 2^doublings + bias를 만듭니다.
| 출력 | 호출 | 값 |
|---|---|---|
x4p3 | gain(in, 2, 3) | 4 * in + 3 |
x2p1 | gain(in, 1, 1) | 2 * in + 1 |
두 출력 모두 256으로 나눈 나머지입니다.
2. 관찰되는 증상
시작 코드는 컴파일되고 실행됩니다. x2p1은 모든 입력에서 맞지만 공개 실행의 0이 아닌
입력에서는 x4p3이 틀립니다.
같은 method를 호출했는데 한 호출만 틀린 회로를 만드는 원인을 찾아 gain 자체를
고치세요. 포트와 두 호출의 인자는 바꾸지 않습니다.
3. 실행 전 예측
gain은 두 배 덧셈기를 하나 만들 때마다 ELABORATE 줄을 하나 출력하고, bias
덧셈기를 만들 때 한 줄을 더 출력합니다. 따라서 ELABORATE 줄의 수는 최적화 전에
생성기가 구성한 덧셈식의 수와 같습니다.
실행하기 전에, 올바른 gain이라면 각 호출이 출력할 doubling 줄의 수와 입력 1과 5일
때의 두 출력을 적어 보세요. 그다음 시작 코드를 실행해 ELABORATE 줄과 SIMULATE 줄을
차례로 비교해 보세요.
4. 원인 진단
SIMULATE 줄은 어느 출력이 틀렸는지 보여 주고, ELABORATE 줄은 왜 틀렸는지
보여 줍니다. 호출마다 doubling 줄을 세고, 그 수를 호출의 각 인자와 비교해 보세요.
덧셈기 수가 틀린 루프는 엉뚱한 Scala 값을 읽고 있습니다. 두 인자가 우연히 같은
호출에서는 이 결함이 드러나지 않습니다.
주의. 시뮬레이션 단계에서는 이 결함을 고칠 수 없습니다. 루프는 첫 poke 전에
이미 끝났습니다.
5. 완료 조건
- 모든 8비트 입력에서
x4p3은4 * in + 3을,x2p1은2 * in + 1을 256으로 나눈 나머지와 같습니다. - 각 호출은
doublings인자와 같은 수의 doubling 줄을 출력합니다. gain(in, 2, 3)에 맞춘 고정 반복 횟수는gain(in, 1, 1)을 틀리게 만듭니다. 수정은 어떤 인자에서도 맞아야 합니다.
6. 힌트
힌트 1
gain(2, 3)이 출력한 doubling 줄의 수를 두 인자와 나란히 놓아 보세요. 줄 수와 같은
인자는 어느 쪽일까요?
힌트 2
for 범위의 상한을 확인해 보세요. 루프가 읽지 않는 생성기 매개변수는 값을 바꿔도
회로가 달라지지 않습니다.
개념 설명
생성기에서 하드웨어의 모양을 정하는 입력은 Scala 매개변수뿐입니다. 매개변수를
바꿨는데 아무것도 달라지지 않거나 엉뚱한 부분이 달라진다면, 루프 상한과 Scala
if가 어떤 값을 읽는지 추적하세요. elaboration 중의 출력은 생성기가 실제로 만든
회로를 가장 빠르게 확인하는 수단입니다.
7. 추가 실험
gain(io.in, 0, 7)로 구동하는 세 번째 출력을 추가해 보세요. 고친 gain에서 이 호출의
ELABORATE 줄과 입력 10일 때의 값을 예측해 보세요. 그다음 시작 코드의 gain이었다면
같은 호출이 무엇을 출력하고 어떤 값을 계산했을지 구해 보세요.