19 / 24 · 개념
flush와 reset에서 거래 회계 유지하기
취소와 전달을 구분하고 유효 비트, 외부 응답과 기대 큐를 함께 처리합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
폐기도 설계가 약속한 사건이다
reset은 회로를 알려진 제어 상태로 돌려놓고, flush는 특정 진행 중인 작업을 취소합니다. 두 경우 모두 단순히 data를 0으로 만드는 것만으로 충분하지 않습니다. valid가 1로 남아 있으면 0이라는 새 가짜 거래가 출력될 수 있습니다. 반대로 데이터 비트가 남아 있어도 valid=0이면 그 값은 거래가 아닙니다. 이전 장의 버퍼는 full 비트를, FIFO는 count와 포인터를, FSM은 상태와 output-valid를 계약에 맞게 정리해야 합니다.
이번 단일 클록 과정은 동기 reset이 높은 에지에는 양 끝의 모니터도 수락·전달을 세지 않고, 그 에지가 모든 outstanding을 취소한다고 정합니다. 따라서 reset을 한쪽에만 적용한 채 다른 쪽에서 이전 valid를 전달로 세면 계약이 어긋납니다. 실제 인터페이스에서는 reset 전달 범위와 준비 신호 정책을 함께 문서화해야 합니다. reset 해제 뒤 처음의 새 입력은 새로운 거래이며 이전 출력과 섞이면 안 됩니다.
| 사건 | accepted | delivered | canceled | outstanding |
|---|---|---|---|---|
| A,B,C 수락 | 3 | 0 | 0 | 3 |
| A 전달 | 3 | 1 | 0 | 2 |
| B,C flush | 3 | 1 | 2 | 0 |
| 새 D 수락 | 4 | 1 | 2 | 1 |
| D 전달 | 4 | 2 | 2 | 0 |
취소를 허용하면 불변식은 accepted-delivered-canceled=outstanding입니다. canceled는 아직 전달되지 않은 거래에만 한 번 적용합니다. 이미 전달한 A를 flush 때 다시 취소하거나 B,C를 완료 횟수로 세면 회계가 틀립니다. 기준 큐에서도 B,C를 삭제하거나 취소 기록으로 옮긴 뒤 새 D를 넣어야 합니다. 단순히 기대 큐를 비웠다는 사실만으로 이전 출력이 새 구간에 안 나오는지는 확인되지 않으므로 새로운 구간의 tag를 사용합니다.
외부 메모리에 이미 보낸 요청은 내부 valid를 지워도 물리적으로 사라지지 않을 수 있습니다. 늦은 응답을 구분하려면 요청과 응답에 세대 epoch를 붙이거나, 이전 요청이 모두 돌아올 때까지 새 실행을 막는 방법을 씁니다. epoch를 한 비트만 쓰고 너무 빨리 두 번 바꾸면 아주 늦은 응답의 옛 값이 현재 값과 같아질 수 있으므로 최대 outstanding과 수명에 맞춰 재사용 정책을 정해야 합니다. 이번 capstone에는 외부 지연 응답이 없어 내부 버퍼 취소만 다룹니다.
선택적 flush에서는 모든 단계를 무조건 비우지 않습니다. 예를 들어 분기보다 앞선 정상 작업은 유지하고 뒤의 잘못된 경로만 취소해야 할 수 있습니다. 그때는 순서 번호 또는 선택 마스크와 commit 시점의 의미가 필요합니다. 유효하지 않은 거래가 저장소 갱신이나 forwarding에 참여하지 않도록 제어부도 함께 검사합니다.
테스트는 비어 있을 때, 한 항목이 정지할 때, full일 때, 입출력이 동시에 예정된 에지에 reset을 넣어 보세요. 각 사건에서 전달로 셀 항목과 취소로 셀 항목을 먼저 손으로 적습니다. 시작 시 reset 한 번만 주는 시험은 진행 중 취소 오류를 발견하지 못합니다. 기능 보존과 리셋 경계는 별도의 중요한 동작 계약입니다.
직접 생각해 보기
5개를 수락하고 2개를 전달한 뒤 남은 3개를 flush했습니다. 다음에 2개를 수락하고 1개를 전달했다면 누적 accepted,delivered,canceled,outstanding은 얼마인가요?
해설 보기
accepted=7,delivered=3,canceled=3,outstanding=1입니다. 7-3-3=1로 맞습니다. flush한 세 항목은 성공 전달로 세지 않습니다.