32구현 문제
비트 연산 선택하기
1. 목표와 수정 범위
selectOp는 4비트 피연산자 a, b와 2비트 선택 값 sel을 받아 4비트 결과를 반환하는
순수 함수입니다. sel이 적용할 비트 단위 연산을 결정합니다.
sel | 결과 |
|---|---|
| 0 | a & b (AND) |
| 1 | a | b (OR) |
| 2 | a ^ b (XOR) |
| 3 | ~(a | b) (NOR) |
네 선택 값 모두 결과가 정의되어 있습니다. 비워 두는 경우는 없습니다. starter는 ?를
반환하므로 출력은 위 연산 표가 아니라 컴파일러의 선택에 따라 정해집니다.
수정 범위는 TODO가 있는 selectOp 본문입니다. 함수 시그니처와 mkTop은 그대로
두세요.
2. starter 읽기와 예측
mkTop은 a = 1100, b = 1010으로 네 선택 값을 한 번씩 호출하고, 마지막에는 두
피연산자가 모두 0인 입력으로 sel = 3을 호출합니다. 실행하기 전에 다섯 결과를 손으로
적어 보세요. AND는 두 피연산자에서 모두 1인 비트만 남깁니다. OR는 어느 한쪽이라도 1인
비트를 남깁니다. XOR는 서로 다른 비트를 1로 만듭니다. NOR는 OR가 0으로 만드는 비트에만
1을 둡니다. 수정하지 않은 starter를 한 번 실행해 각 줄을 예측과 비교하세요. 우연히 같은
값이 출력되어도 해당 연산이 구현되었다는 뜻은 아닙니다.
3. 구현과 실행 결과 해석
sel에 대한 선택문으로 네 경우를 나누고, 각 경우를 두 피연산자로 계산하세요. 다시
실행하면 1100과 1010에 대한 네 줄은 1000, 1110, 0110, 0001이어야 하고,
피연산자가 모두 0인 NOR는 1111이어야 합니다.
함수에는 클록도 상태도 없습니다. 결과는 인자만으로 정해지므로, 공개 실행이 출력하지 않는 피연산자 조합에서도 같은 규칙이 성립해야 합니다.
4. 완료 조건
- 0부터 3까지 각 선택 값이 256가지 피연산자 조합 전체에 자신의 연산을 적용합니다.
mkTop이 출력하는 두 피연산자만 맞추어서는 완료가 아닙니다. - NOR는 OR의 보수입니다. 두 피연산자의 비트가 모두 0인 위치에서만 결과 비트가 1입니다.
- 결과 폭은
Bit#(4)이고 함수 시그니처는 그대로입니다. - 어떤 선택 값도 정의되지 않은 결과나
don't-care value를 반환하지 않습니다.
5. 단계형 힌트
힌트 1
?는 값의 결정을 컴파일러에 맡깁니다. 함수는 네 식 가운데 하나를 골라야 하고, 그
선택을 바꾸는 입력은 a나 b가 아니라 sel입니다.
힌트 2
sel에 대한 case 또는 조건 연산자의 연쇄로 네 선택 값을 모두 다루세요. 각 분기는
장의 연산자 표에 있는 비트 단위 연산자 하나를 a와 b에 적용한 식입니다.
힌트 3
NOR 연산자는 따로 없습니다. 두 피연산자의 OR에 보수 ~를 적용해 만들고, 보수가 a
하나가 아니라 OR 전체에 적용되도록 괄호를 유지하세요.
6. 추가 실험
필수 구현을 마친 뒤 mkTop의 피연산자를 a = 4'b0101, b = 4'b0101로 바꿔 보세요.
실행하기 전에 네 결과를 먼저 예측해 보세요. 같은 피연산자에서는 AND와 OR가 일치하고
NOR는 그 보수이며, XOR만 0이 됩니다. 제출하기 전에 원래 피연산자로 복원하세요.