10검증 문제
레인마다 연산 모듈 두기
1. 요구 동작
LaneDistance는 AbsDiff 하위 모듈로 서로 독립적인 절댓값 차이 네 개를 계산합니다.
d(i)는 x(i)와 y(i)의 차이의 절댓값입니다. x = 10, 50, 200, 7, y = 3, 80, 200, 9이면
각 레인은 7, 30, 0, 2를 출력해야 합니다.
시작 코드는 컴파일되고 실행되지만 네 레인이 모두 2를 출력합니다. 레인 값보다 먼저 출력되는
ELABORATE AbsDiff 줄도 하나뿐입니다.
LaneDistance의 결함을 찾아 고치세요. AbsDiff는 올바르므로 본문과 모든 포트를 그대로
둡니다.
2. 인스턴스 수와 연결 순서
Module(...)은 실행될 때마다 인스턴스를 하나 배치합니다. 호출 뒤에 오는 반복문은 그
인스턴스를 복제하지 않고 다시 사용합니다.
시작 코드를 읽으며 다음을 세어 보세요.
elaboration중에Module(new AbsDiff)가 실행되는 횟수- 네 번의 반복에서
unit.io.a에 만들어지는 연결과 그 순서
3. 실행 전 예측
시작 코드의 ELABORATE 줄 수와 네 레인 값을 예측하고, 모든 레인이 특정 레인 하나의 값을
출력하는 이유를 적어 보세요. 수정한 설계의 두 관찰 결과도 예측해 보세요.
4. 실행 결과 해석
시작 코드는 AbsDiff를 하나만 elaboration합니다. 반복문은 네 번 실행되지만 매번 같은
하위 모듈 입력에 연결하며, 마지막 연결이 반영됩니다. 하위 모듈은 x(3)과 y(3)을 받고,
모든 d(i)가 그 출력 하나인 2를 읽습니다. 수정한 설계는 ELABORATE AbsDiff를 네 줄
출력한 뒤 7, 30, 0, 2를 출력합니다. 인스턴스 수는 elaboration 중에 결정되며,
시뮬레이션 중에 인스턴스 하나가 네 결과를 동시에 계산할 수는 없습니다.
5. 완료 조건
x(i)가 크거나 작거나 같은 모든 입력에서 각 레인이 자기 쌍의 절댓값 차이를 출력합니다.- 한 레인의 입력을 바꿔도 다른 레인의 출력은 바뀌지 않습니다.
- 회로에는 레인마다
AbsDiff가 하나씩 있습니다.
6. 단계형 힌트
힌트 1
반복문보다 먼저 실행된 Module(...) 호출은 인스턴스를 하나만 만듭니다. 네 레인이 그
인스턴스 하나를 공유합니다.
힌트 2
각 레인의 연결이 서로 다른 하위 모듈에 도달하려면 반복마다 인스턴스를 만들어야 합니다. 한 줄의 위치만 바꾸면 됩니다.
개념 설명
하위 모듈은 서브루틴이 아니라 하드웨어입니다. 인스턴스 하나를 반복문에서 재사용해도 시간을 나누어 쓰지 않습니다. Chisel은 입력에 대한 연결을 모두 모아 마지막 연결을 반영합니다. 병렬 결과에는 병렬 인스턴스가 필요하며, 인스턴스 수는 생성기의 Scala 코드가 결정합니다.
7. 추가 실험
포트가 Vec(8, UInt(8.W))로, 반복이 8회로 늘었다고 가정해 보세요. 결함이 있는 설계와
수정한 설계의 ELABORATE 줄 수, 그리고 결함이 있는 설계가 모든 레인에 출력할 레인 값을
예측해 보세요.