01구현 문제
생성기 루프로 상수 곱셈기 만들기
1. 요구 동작
Scalers는 8비트 입력 in에서 8비트 출력 두 개를 만듭니다. x10은 in * 10을,
x7은 in * 7을 256으로 나눈 나머지입니다.
두 출력은 Scala method scale(in, factor) 하나에서 나옵니다. scale은 곱셈
연산자 없이 덧셈기만으로 곱을 구성합니다.
| 이름 | 종류 | 의미 |
|---|---|---|
factor, bit | Scala Int | elaboration 중에 값이 정해집니다 |
term | 8비트 하드웨어 노드 | in * 2^bit를 256으로 나눈 나머지. in에서 시작해 반복마다 두 배가 됩니다 |
total | 하드웨어 노드 | 지금까지 더한 합 |
factor에서 1인 비트마다 그 비트의 term을 total에 더합니다. 10은 2진수로
1010이므로 비트 1과 비트 3의 term, 곧 in*2 + in*8을 더합니다.
2. 관찰되는 증상
시작 코드는 컴파일되고 실행도 되지만 루프가 total에 아무것도 더하지 않습니다.
그래서 모든 입력에서 두 출력이 0입니다.
루프 안의 TODO 줄을 바꿔, factor가 0부터 255 사이의 어느 값이든 올바른
덧셈기를 만들게 하세요. 포트, term을 두 배로 만드는 줄, scale 호출 두 개는
그대로 둡니다.
3. 실행 전 예측
scale은 회로를 만드는 동안 호출마다 한 번 실행되는 Scala 코드입니다. 시뮬레이션
중에 반복하는 하드웨어가 아닙니다. factor와 bit의 값은 elaboration 중에
알 수 있습니다. in, term, total은 하드웨어 노드를 가리키며, 그 신호 값은
시뮬레이션이나 실제 회로 동작 중에 바뀔 수 있습니다.
실행하기 전에 다음을 적어 보세요.
ELABORATE줄의 개수, 그리고 그 줄이SIMULATE줄 사이에 끼는지 여부- 입력 3일 때
x10과x7 - 입력 30일 때 결과가 8비트로 잘린 뒤의
x10과x7
그다음 시작 코드를 실행해 SIMULATE 줄을 예측과 비교해 보세요.
4. 덧셈기를 만드는 조건
term을 더할지는 factor만으로 정해집니다. factor는 시뮬레이션 전에 고정되는
Scala 값이므로 Scala if로 판단할 수 있습니다. Scala if는 mux를 만들지 않고,
생성할 하드웨어를 고릅니다.
Scala Int의 비트 하나를 검사하는 일은 평범한 정수 연산입니다. 비트가 1이면
total이 이전 total과 현재 term을 더하는 새 덧셈기 노드를 가리키게 하세요.
비트가 0이면 아무것도 생성하지 않습니다.
주의. 비트 bit를 판단할 때는 두 배로 만드는 줄이 실행되기 전의 term을
써야 합니다.
5. 완료 조건
- 공개 실행이 넣는 다섯 값뿐 아니라 모든 8비트 입력에서
x10은in * 10을,x7은in * 7을 256으로 나눈 나머지와 같습니다. - 두 출력은 계속 같은
scalemethod에서 나옵니다. 한 factor에서만 맞는 수정은 완료가 아닙니다. ELABORATE줄은 호출마다 정확히 한 번, 모든SIMULATE줄보다 먼저 출력됩니다.
6. 힌트
힌트 1
덧셈기의 존재 여부를 정하는 값이 회로를 만드는 동안 알려진 값인지, 시뮬레이션
중에 wire가 전달하는 값인지 구분해 보세요. Scala if의 조건에는 앞의 값만 쓸 수
있습니다.
힌트 2
Scala 정수 연산으로 factor를 bit만큼 오른쪽으로 shift한 뒤 가장 낮은 비트를
검사하세요. if 본문에서는 이 장의 Doubler가 x를 다시 대입하는 방식대로
var total을 다시 대입합니다.
개념 설명
생성기는 Scala 값으로 회로의 모양을 정합니다. 같은 scale 코드에서 factor 10은
term 두 개를, factor 7은 term 세 개를 더하는 서로 다른 덧셈기 회로가 나옵니다.
elaboration이 끝난 하드웨어에는 if가 남지 않고, if가 고른 덧셈기만
남습니다.
7. 추가 실험
scale(io.in, 255)로 구동하는 세 번째 출력 x255를 추가해 보세요. 이 factor에서
루프가 더하는 term의 개수와 입력 1, 2일 때의 출력을 예측한 뒤, in * 255를
256으로 나눈 나머지와 비교해 보세요.