# ADR-0033 — 레이턴시 모델: 가정 및 알려진 단순화

## Status

Accepted

## Context

이 시뮬레이터는 분석적·이벤트 기반 성능 모델이지, 사이클 정확(cycle-accurate)
시뮬레이터나 RTL 수준 시뮬레이터가 아니다. 실제 HW의 많은 효과들이 설계상
근사되거나 생략되었다. 모델 전체를 감사·리뷰할 수 있도록 유지하기 위해,
본 ADR은 그런 가정들을 한 곳에 통합한다. 개별 컴포넌트 ADR(ADR-0015,
ADR-0017, ADR-0004)들이 *메커니즘*을 정의하고, 본 문서는 *충실도의 한계*를
정의한다.

## Decisions

### D1. 정밀하게 모델링되는 것

- **방향 에지별 BW 점유** (`available_at`을 통한 FIFO 직렬화) —
  ADR-0015 D2.
- **컴포넌트별 스위칭/오버헤드 레이턴시** (`overhead_ns` attr).
- **HBM pseudo-channel별 병렬성**: 주소 기반 PC 선택을 동반한
  stateless `pc_avail[N]` 배열로 (ADR-0034 D3). 버스트 granularity는 조정 가능
  (`burst_bytes`, 기본 256B). 각 PC의 `available_at`은 read와 write가 공유한다
  (실제 HW의 명령 버스가 PC별로 공유되기 때문).
- **HBM 방향 전환 페널티 메커니즘**: PC별 last-direction 추적 +
  설정 가능한 `switch_penalty_ns`. 기본값 0 — D2 참조.
- **와이어 청크 스트리밍 (Phase 2c)**: 각 와이어는 payload가 있는
  Transaction을 `flit_bytes` 단위의 `Flit` 객체로 분해한다(기본 = HBM
  `burst_bytes` = 256B). 와이어는 각 flit을 `prop_ns + flit_nbytes/bw_gbs`
  이후에 개별적으로 방출하므로 링크의 대역폭이 실제 HW의 wormhole 시맨틱대로
  flit 도착률을 조절한다.
- **방향 에지별로 분리된 Store** (Phase 2c 핵심 수정): 와이어는
  `src.out_ports[dst]`와 `dst.in_ports[src]` 사이의 *유일한* 통로이다.
  이전에는 둘이 동일한 `simpy.Store`로 별칭되어 있었다. 와이어가 청크화된
  flit을 되돌려 넣을 때 목적지의 `fan_in`이 와이어가 대역폭 지연을 적용하기
  전에 그것을 끌어가, flit의 절반이 병목을 우회할 수 있었다.
- **Flit 인지 pass-through** (`TransitComponent`, `HbmCtrlComponent`):
  각 flit을 직렬로 전달하며 트랜잭션 오버헤드는 첫 flit 도착 시점에 한 번만
  적용된다(헤더 디코드 모델). 이후의 flit들은 추가 지연 없이 파이프라인을
  통과한다. 다중 hop 경로 전반에서 wormhole이 자연스럽게 발현된다.
- **HBM CTRL의 flit별 PC commit**: HBM CTRL에 도착하는 각 flit은
  `max(env.now, pc_avail[pc]) + chunk_time`에 PC commit을 스케줄하며,
  `is_last` flit이 마지막 PC commit을 기다린 후 `txn.done`을 신호한다.
- **Flit 비인지 컴포넌트(기본)는 ``_fan_in``에서 flit을 재조립**하여
  레거시 `_forward_txn` 경로가 실행되도록 한다. 이는 아직 flit 인지
  처리로 마이그레이션되지 않은 컴포넌트(예: `MCpuComponent`,
  `IoCpuComponent`의 sub-txn 생성기)에 대한 하위 호환성을 보존한다. 그런
  컴포넌트들은 *leg 경계마다 한 번* 재조립하며, hop마다는 아니다 —
  flit 인지 라우터 체인을 통한 다중 hop wormhole 타이밍이 보존된다.

### D2. 근사됨 (알려진 방향성 오차와 함께)

| 효과 | 실제 HW | 본 모델 | 오차 방향 |
|--------|---------|-----------|----------------|
| 라우터 출력 포트 중재 | Round-robin / weighted | 와이어 에지 FIFO + 직렬 워커 | 사이클당 한 txn일 때 공정; multi-stream 공유는 flit 수준에서 모델링 안 됨 |
| HBM 스케줄러 / 쓰기 버퍼 | FR-FCFS + watermark drain | FIFO, 재정렬 없음 | 교번이 조밀한 혼합 R/W에 대해 비관적 — 기본 `switch_penalty_ns = 0`은 이상적 스케줄러가 amortize한다고 가정 |
| Flit ↔ burst granularity | 32B flit < 256B burst | `flit_bytes = burst_bytes = 256B` | sub-flit 미세 타이밍 노이즈; 매우 작은 와이어 중재 윈도우에서만 영향 |
| 와이어 수준 RR 공정성 | 공유 링크에서 사이클별 multi-flow 중재 | 에지마다 단일 직렬 와이어 프로세스 | 주어진 에지에 한 트랜잭션만 in-flight일 때만 공정. 동일 에지에서 동시 멀티 스트림 트래픽은 FIFO 순서로 직렬화됨 |

### D3. 무시됨 (범위 외)

- 뱅크 수준의 row buffer 충돌 페널티 (충돌 없음 가정 — 최적 케이스;
  모델은 PC 내부에 뱅크별 상태를 갖지 않으므로 동일 뱅크 재사용을 감지할 수 없다).
- HBM tRP / tRCD / tFAW / tRC 타이밍 제약 (정상 상태의
  `burst_time = burst_bytes / pc_bw_gbs`에 흡수).
- 리프레시, ECC, 열 throttling, 전력 게이팅.
- 클럭 도메인 교차, PLL lock 시간.
- 하위 버퍼 점유로 인한 상위 backpressure (입력 포트는 unbounded
  `simpy.Store`를 사용).
- 라우터에서의 sub-flit 사이클 수준 중재 (flit granularity가 본 모델의
  최소 단위).

### D4. 워크로드 민감도

위 단순화들이 결과에 의미 있게 영향을 미치는 워크로드:

- **무작위 scatter/gather**: 뱅크 충돌 무시 → 모델이 낙관적.
- **혼합 R/W가 강한 워크로드** (예: GEMM 바이어스 누적): HBM 스케줄러
  부재. 기본 `switch_penalty_ns = 0`은 이상적 amortization을 가정;
  0이 아닌 값은 교번당 비관적 비용을 모델링.
- **고동시성 (한 링크에 활성 흐름 >10개)**: HoL blocking과 VC 제한이
  모델링되지 않음 → 모델이 낙관적.
- **매우 작은(sub-flit) 트랜잭션**: flit 양자화 노이즈.
- **단일 와이어상의 동시 multi-flow**: 와이어는 flit 수준에서 직렬
  FIFO이므로 단일 에지 내에서의 흐름별 공정성은 모델링되지 않는다.
  Pre-edge 병합(여러 source가 라우터에 도착하여 동일한 downstream
  와이어로 전달되는 경우)은 flit 인지 라우터의 직렬 워커를 통해 올바르게
  모델링된다.

### D5. 검증 정책

D4의 워크로드에 대해 절대값 결론을 내리기 전에 실제 HW나 사이클 정확
시뮬레이터와 cross-check 할 것. 모델은 모델링된 영역 내에서의 **상대적
비교**에 대해서는 여전히 정확하다.

### D6. 향후 작업

참고: 라우터에서의 multi-stream 병합은 올바르게 모델링되고 있다 — 각
in_port가 자신의 fan_in 프로세스를 가지며 모두 공유 인박스로 push하고,
라우터 워커가 인박스 FIFO 순서로 전달한다. 서로 다른 상위 스트림의 flit들이
flit granularity에서 자연스럽게 인터리브된다. 아래 항목들은 별개의 관심사이며,
예상되는 워크로드 영향 순으로 정렬되어 있다.

**영향이 큼 (워크로드 정확도 격차)**:

- [ ] PC 내의 **뱅크 수준 충돌 모델링** (`track_banks: true`로 opt-in).
  현재는 동일 뱅크 재사용이 없다고 가정; 무작위 scatter/gather 워크로드는
  이 부분에서 낙관적이다.
- [ ] write buffer + watermark drain을 동반한 **HBM 스케줄러** (설계
  논의에서의 Tier 2). 기본 `switch_penalty_ns=0`은 이상적 amortization의
  stand-in; 버스티한 혼합 R/W 워크로드는 명시적 모델링으로부터 이득을 본다.
- [ ] 유한한 컴포넌트 버퍼에 대한 **Backpressure** 모델링. 버퍼 점유가
  상위 stall을 유발하는 고동시성/지속적 포화 상황에서 중요.
- [ ] **청크 스트리밍과 op_log 통합**: 현재 op_log는 청크화되지 않는
  PE 내부 명령 메시지(DmaReadCmd, DmaWriteCmd, GemmCmd, MathCmd)에 대해
  발화한다. 통합은 flit 인지 컴포넌트들이 트랜잭션당 op_log start/end
  hook(첫 flit에 start, is_last에 end)을 함께 방출하도록 요구한다.

**영향이 작음 (학술적 / 특정 use case)**:

- [ ] **사이클 정확 라우터 중재 정책** (우선순위·age를 동반한 RR, iSLIP).
  FIFO 인박스는 스트림 간 flit 도착 시간이 약간씩 다를 때 이미 근사적으로
  공정하다(유사한 비율의 워크로드에서 흔한 경우). 실질적 영향은 (a)
  우선순위/QoS 모델링, (b) 지속적 포화에서의 스트림별 tail latency 분석에서만
  나타난다. makespan이나 평균 레이턴시 연구에는 결정적이지 않음.
- [ ] 더 미세한 와이어 중재 사이클을 위한 **Sub-flit (32B) granularity**.
  본 모델의 `flit_bytes`는 burst(256B)와 같지만, 실제 HW는 32B flit마다
  중재한다. 대부분 워크로드에서는 영향이 작다(작은 메시지에 대한 sub-flit
  타이밍 노이즈).

## Consequences

- 모든 모델 충실도 질문에 대한 단일 리뷰 지점. 레이턴시를 건드리는 향후
  모든 PR은 본 문서의 해당 절을 갱신해야 한다.
- 워크로드별 규모 오차 envelope이 명시적이다.
- 빌더측 `pc_bw_gbs = hbm_to_router_bw_gbs / num_pcs` 유도가
  yaml의 수동 일관성에 의존하지 않고 코드 내에서 ADR-0017 D8의 불변성을
  강제한다.
- 와이어 전송 시간은 터미널의 `drain_ns` 주입을 통해서가 아니라
  병목 링크 통과당 한 번 부과된다(Phase 2c flit별 타이밍). 단일 트랜잭션은
  `drain + commit_time + small_overheads`에 도달; 다중 hop은 wormhole
  파이프라이닝을 보존; multi-stream 병합은 공유 와이어의 FIFO에서 올바르게
  직렬화된다.

## Cross-references

- ADR-0015 — 컴포넌트 / 포트 / 와이어 모델.
- ADR-0017 — 큐브 NOC 아키텍처 및 HBM 연결성.
- ADR-0004 — 메모리 시맨틱, 로컬 HBM.
- ADR-0034 — HBM 컨트롤러 내부 설계.
