09구현 문제
하위 모듈로 세 값 정렬하기
1. 요구 동작
Sort3는 세 입력을 오름차순으로 정렬해 min, mid, max에 출력합니다. 비교 소자는
Sort2 하위 모듈뿐입니다. Sort2는 두 값을 비교해 작은 값을 lo, 큰 값을 hi로
출력합니다.
시작 코드에는 인스턴스가 두 개 있습니다.
| 인스턴스 | 입력 | 결과 |
|---|---|---|
first | in(0), in(1) | 두 값의 순서 |
second | first.io.hi, in(2) | second.io.hi가 최댓값 |
남은 두 작은 값은 서로 비교되지 않은 채 min과 mid로 연결됩니다. 따라서 일부 입력
순서에서는 정렬되지 않은 결과가 출력됩니다.
TODO 위치에서 Sort2를 하나 더 인스턴스화하고, 두 입력을 구동한 뒤 min과 mid를
그 출력에서 가져오세요. Sort2와 max 연결은 그대로 둡니다. 정렬은 하위 모듈이
담당하며, 인라인 Mux 논리로 대체하지 않습니다.
2. 아직 비교되지 않은 값 찾기
입력 2, 3, 1을 first와 second에 차례로 넣고 각 lo, hi를 적어 보세요. second
이후에도 출력 위치가 정해지지 않은 두 값과, 그 값을 전달하는 출력을 찾아보세요.
3. 실행 전 예측
공개 실행은 입력 세 개짜리 행 네 개를 출력합니다. 시작 코드가 우연히 올바르게 정렬하는
행과 그렇지 않은 행을 예측해 보세요. 완성된 회로의 Sort2 인스턴스 수도 예측해 보세요.
4. 실행 결과 해석
시작 코드는 3,1,2를 1,2,3으로, 200,7,100을 7,100,200으로 정렬합니다. 그러나
2,3,1은 2,1,3으로, 9,9,4는 9,4,9로 출력합니다. 실패한 두 행에서는 가장 작은 값이
in(2)로 들어와 second.io.lo에 도달했고, first.io.lo는 그보다 컸습니다. 수정 후에는
모든 행이 오름차순이며 회로에는 Sort2 인스턴스가 세 개 있습니다. 실행된
Module(new Sort2) 호출마다 인스턴스가 하나씩 생성됩니다.
5. 완료 조건
- 동일한 값과 극단값 0, 255를 포함한 세 8비트 값의 모든 순서가 오름차순으로 출력됩니다.
max는 여전히second에서 가져오며, 모든 하위 모듈의 입력 포트가 구동됩니다.- 비교 소자는
Sort2만 사용합니다.
6. 단계형 힌트
힌트 1
second를 지나면 최댓값은 확정됩니다. 남은 두 후보는 서로 다른 하위 모듈에서 나오며
아직 비교되지 않았습니다.
힌트 2
하위 모듈의 입력은 부모 모듈 안에서 sink이며, 부모 자신의 출력처럼 구동해야 합니다. 새
인스턴스의 두 입력에 후보를 하나씩 연결하세요. lo와 hi는 각각 min과 mid에
필요한 값을 출력합니다.
개념 설명
계층 구조는 인스턴스 사이의 배선입니다. Module(...) 호출 하나가 하위 모듈의 사본 하나를
배치하고, 부모가 그 입력을 구동해 사본이 받을 값을 정합니다. 이 세 입력 정렬기에서는
남은 두 후보를 비교해야 min과 mid에 연결할 값을 정할 수 있습니다.
7. 추가 실험
Sort2 인스턴스로 입력 네 개를 정렬하는 네트워크를 그려 보세요. 각 비교기가 받는 값을
표시하고, 모듈 장에서 ELABORATE 줄을 세던 방식으로 설계의 인스턴스 수를 세어 보세요.