21구현 문제
점검 과제 A: 네 연산 가운데 하나 선택하기
1. 요구 동작
SelectOp은 작은 ALU의 한 조각입니다. 2비트 sel이 4비트 입력 a, b에 적용할 비트
연산을 지정하고, y는 그 연산의 결과입니다.
sel | 연산 | y의 비트 i |
|---|---|---|
| 0 | AND | a와 b의 비트 i가 모두 1일 때 1 |
| 1 | OR | 두 입력 중 하나라도 비트 i가 1일 때 1 |
| 2 | XOR | 두 비트가 다를 때 1 |
| 3 | NOR | 두 비트가 모두 0일 때 1 |
Chisel 식으로는 차례대로 a & b, a | b, a ^ b, ~(a | b)입니다.
y는 세 입력만으로 정해지는 조합 회로입니다. 입력이 바뀌면 같은 사이클 안에서 y도
바뀌어야 하며, 클록 에지를 기다리는 레지스터를 두면 계약을 만족하지 않습니다.
2. 시작 코드의 상태
시작 코드는 컴파일이 되도록 y에 상수 0을 연결합니다. 따라서 공개 실행의 모든 줄이
y=0000을 출력합니다.
이 과제에는 고칠 한 줄짜리 오류가 없습니다. IO 번들 아래의 본문을 직접 작성해야 합니다.
TODO 줄을 모든 sel 값에 맞는 선택식으로 바꾸세요. 포트와 Main은 그대로 두고,
레지스터는 추가하지 않습니다.
3. 시작 코드 읽기
IO 번들이 포트 이름과 폭을 정합니다. sel은 2비트이므로 값이 정확히 네 개이고, 남는
값이 없습니다. y는 4비트로 각 연산 결과와 폭이 같으므로 0 확장이나 절단이 끼어들지
않습니다. 계약 어디에도 클록이 등장하지 않습니다.
4. 실행 전 예측
공개 실행은 (a, b) 쌍 (1100, 1010), (0011, 0101), (1111, 0000)을 인가하고, 각
쌍에서 sel을 0부터 3까지 바꾸며 y를 출력합니다. 올바른 설계가 출력할 열두 값을 비트
단위로 계산해 적어 보세요. (1100, 1010)의 네 줄은 1000, 1110, 0110, 0001입니다.
5. 수정과 설명
Learn 장의 선택 유틸리티 가운데 선택 신호가 상수와 비교되는 키 하나인 것을 고르고,
sel 값마다 항목 하나를 적습니다. 실행해 열두 줄을 예측과 비교하세요. 앞의 두 입력
쌍에서는 각각 sel=3의 결과가 나머지 세 결과와 다른 이유를 설명해 보세요.
(1111, 0000)에서는 NOR와 같은 결과를 내는 다른 연산을 찾아보세요.
6. 완료 조건
- 출력된 열두 줄뿐 아니라 1024가지
(sel, a, b)조합 모두에서y가 1절의 표와 같습니다. - 입력이 바뀌면 클록 에지 없이 같은 사이클 안에서
y가 바뀝니다. 결과를 레지스터에 저장해 한 에지 뒤에 출력하는 설계는 계약을 만족하지 않습니다. sel = 3은a와b의 NOR입니다. NAND도, XOR의 반전도 아닙니다.
7. 단계형 힌트
힌트 1
연산 네 개와 2비트 선택 신호 하나는 Learn 장의 "같은 선택을 다섯 가지로 쓰기" 예제와 같은 형태입니다. 선택 신호는 서로 독립인 조건 목록이 아니라 상수와 비교하는 키 하나입니다.
힌트 2
첫 인자 목록에 키와 default를, 둘째 인자 목록에 key -> value 쌍의 표를 받는
유틸리티는 when도 레지스터도 필요하지 않습니다. 키 네 개를 모두 적으면 default에는
도달하지 않지만, default에도 같은 타입의 값이 필요합니다.
힌트 3
각 연산을 키와 짝지을 때 괄호로 감싸세요. 괄호가 없으면 ->가 비트 연산자보다 먼저
결합하므로 컴파일 오류가 발생하며, 오류 위치는 연산자가 아니라 쌍을 가리킵니다.
8. 추가 실험
a, b, y를 5비트로 넓히거나 3비트로 줄여 보세요. 제출 코드에서 바뀌는 줄과 공개
출력에서 바뀌는 줄을 찾아보세요. 이어서 다섯째 연산을 추가한다고 가정해 보세요. sel이
1비트 넓어지고 항목이 없는 키가 생깁니다. 그 키에서 유틸리티가 반환하는 값이 무엇인지,
그 값이 원하는 값인지 확인해 보세요.