17구현 문제
ready-valid 밸브를 양방향으로 닫기
1. 요구 동작
Valve는 생산자 쪽 in과 소비자 쪽 out 사이의 Decoupled 연결에 놓입니다.
open | 동작 |
|---|---|
| 1 | 생산자의 값이 소비자에 전달되고, 소비자의 ready가 생산자에 전달됩니다 |
| 0 | 어느 방향으로도 전달되지 않습니다 |
생산자와 소비자는 모든 사이클에서 같은 전송을 인식해야 합니다. 생산자가 값을 넘겼다고 판단하는 사이클과 소비자가 값을 받는 사이클은 정확히 같아야 합니다.
2. Starter의 상태
정방향 연결은 완성되어 있습니다. out.valid와 out.bits는 생산자를 따르고,
out.valid에는 open 조건이 걸려 있습니다. 역방향의 in.ready는 0으로 고정된 임시
값입니다. 생산자는 전송을 한 번도 확인하지 못하므로 같은 값을 계속 제시합니다.
TODO 아래 대입을, 실제로 값이 통과하는 사이클을 알리는 식으로 바꾸세요. 포트와 정방향
대입은 그대로 둡니다.
3. 실행 전 예측
공개 테스트벤치가 생산자와 소비자 역할을 모두 맡습니다. 소비자의 ready와 open은
정해진 패턴을 따릅니다.
| 출력 | 의미 |
|---|---|
offer | 생산자가 현재 제시하는 값. sent=1인 사이클 다음에 1 증가합니다 |
sent | 생산자가 본 in.ready |
got | 소비자가 그 사이클에 받은 값. 받지 않았으면 - |
시작 코드를 실행하기 전에 소비자가 1을 몇 번 받을지 예측해 보세요. 같은 값을 여러 번
받는 결과가 아무것도 받지 않는 결과보다 나쁜 이유도 생각해 보세요. 올바른 밸브에서는
got이 -가 아닌 사이클에서만 sent가 1이고, 소비자는 1, 2, 3, 4를 한 번씩 받습니다.
4. 수정 지점 찾기
ready-valid 연결의 전송은 같은 사이클에 valid와 ready가 모두 1일 때 일어납니다.
소비자 쪽 valid에는 이미 open 조건이 있습니다. 생산자 쪽 fire가 소비자 쪽
fire와 같은 사이클에서만 참이 되려면 in.ready가 무엇을 반영해야 하는지 정해 보세요.
5. 실행 결과 해석
수정한 밸브를 실행해 보세요. sent는 got에 값이 있는 줄에서만 1이어야 하고, got은
1, 2, 3, 4 순서로 나타나야 합니다. 사이클 2는 open이 0이고 소비자가 준비된 줄입니다.
이 줄에서 in.ready가 어떤 값을 보고하는지, 그리고 그 이유를 설명해 보세요.
6. 완료 조건
open이 1이면in.ready는 소비자의ready를 따릅니다.open이 0이면 소비자가 준비되어 있어도 생산자 쪽 전송은 일어나지 않습니다.- 모든 사이클에서
in.fire와out.fire가 같습니다. 값이 사라지거나 중복되지 않습니다. ready를 그대로 연결하는 것만으로는 부족합니다.open이 0이고 소비자가 준비된 사이클을 확인하세요.
7. 힌트
힌트 1
시작 코드에서 1이 반복되는 원인은 생산자가 모르는 소비자 쪽 전송입니다. 반대 방향으로
틀리면 값이 사라집니다.
힌트 2
역방향 신호에도 정방향과 같은 조건이 필요합니다. 소비자의 ready와 open을 함께
사용하세요.
개념 설명
Decoupled는 양방향 신호를 묶은 인터페이스입니다. 연결 중간에 넣는 로직은 두 방향을
모두 처리해야 합니다. valid에만 조건을 걸면 두 끝이 서로 다른 사이클을 전송으로
인식합니다. 양쪽의 fire는 같은 사건을 나타내야 합니다.
8. 추가 실험
밸브가 in.bits가 짝수일 때만 열린다고 가정해 보세요. 정방향과 역방향 로직에서 바뀌는
부분을 정하고, 공개 입력 가운데 소비자에 도달하는 값을 예측해 보세요.