본문으로 건너뛰기
code0.HDL

32구현 문제

비트 연산 선택하기

1. 목표와 수정 범위

selectOp는 4비트 피연산자 a, b와 2비트 선택 값 sel을 받아 4비트 결과를 반환하는 순수 함수입니다. sel이 적용할 비트 단위 연산을 결정합니다.

sel결과
0a & b (AND)
1a | b (OR)
2a ^ 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이 됩니다. 제출하기 전에 원래 피연산자로 복원하세요.

개념 다시 보기
준비
Main.bsv