모든 이야기

다른 DRAM bank를 여는 간격에도 짧은 값과 긴 값이 있다

서로 다른 DRAM bank의 행을 차례로 열면 모두 독립적으로 준비될 것 같다. DDR4에서는 두 bank가 어느 bank group에 속하는지도 중요하다. 같은 group의 다른 bank를 연속 활성화할 때와 다른 group으로 넘어갈 때 적용하는 최소 ACT 간격이 다를 수 있다. 이것을 구분하는 값이 tRRD_L과 tRRD_S다.

bank는 열린 행 등의 상태를 따로 갖는 배열 단위이고, bank group은 여러 bank를 묶는 상위 조직이다. Alliance DDR4 데이터시트의 functional block diagram과 tRRD timing 그림은 이 제품의 16bank를 네 group으로 나누며, 다른 group의 연속 ACT에는 short, 같은 group 안의 서로 다른 bank에는 long 간격을 표시한다.

bank 주소만 보면 놓치는 관계

주소를 읽을 때 bank 번호가 다르다는 사실만 확인하면 충분하지 않다. 예를 들어 G0의 B0와 G0의 B1은 다른 bank지만 같은 group이다. G0의 B0와 G1의 B0는 group이 다르다. 이 두 명령쌍의 ACT 간격에는 각각 L과 S가 적용된다.

설명용으로 tRRD_S=4ns, tRRD_L=8ns를 가정하자. 모두 처음부터 idle인 bank이고 다른 제약은 활성화 구간을 막지 않는다고 놓는다. 네 bank를 같은 group 안에서 연속 열면 0, 8, 16, 24ns가 가장 빠른 일정이다. 네 group에 하나씩 분산하면 0, 4, 8, 12ns가 가능하다.

활성화 대상group 관계가상 ACT 시점
G0:B0→B1→B2→B3연속해서 같음0, 8, 16, 24ns
G0:B0→G1:B0→G2:B0→G3:B0연속해서 다름0, 4, 8, 12ns

이는 row를 여는 시작 시각의 비교다. 마지막 데이터가 언제 나오는지, 요청 순서를 바꿀 수 있는지, column 전송이 겹치는지까지 계산한 성능 수치는 아니다. 또한 실제 speed bin에서는 ns minimum과 nCK minimum을 함께 요구할 수 있다. clock이 빨라졌다고 같은 clock 개수만 유지해 ns 조건을 어기면 안 된다.

tRRD가 짧아져도 다섯 번째 ACT는 별도로 검사한다

tRRD를 검사할 때는 바로 앞 ACT 하나만 보면 부족하다. 해당 rank의 가장 최근 ACT에서 tRRD_S가 지났는지, 새 ACT가 향하는 group의 가장 최근 ACT에서 tRRD_L이 지났는지를 함께 확인한다. 중간에 다른 group의 ACT가 끼어 있어도 같은 group의 기록이 없어지는 것은 아니다. 원저자가 공개한 Ramulator의 DDR4 timing 구현도 short 제약은 rank에, long 제약은 bank-group에 따로 둔다. 구현 예이며 실제 제품의 최종 기준은 해당 데이터시트다.

이 차이를 드러내기 위해 별도의 가상 조건 tRRD_S=4ns, tRRD_L=10ns를 놓자. G0:B0를 0ns, G1:B0를 4ns에 열었다. G0:B1을 8ns에 열면 바로 앞 G1과는 4ns 간격이지만, 이전 G0 ACT와는 8ns밖에 지나지 않았다. 따라서 최소 시점은 max(4+4, 0+10)=10ns다. “직전 group만 다르면 short를 쓴다”는 규칙은 이 명령열을 잘못 허용한다.

여러 ACT가 짧은 시간에 모이는 정도를 제한하는 tFAW는 여기에 더해지는 별도 규칙이다. 위 표처럼 4ns씩 간격을 두더라도 다섯 번째 ACT가 네 활성화 창을 위반할 수 있다. 반대로 tFAW가 여유 있어도 대상 group의 long 간격이 아직 끝나지 않았으면 기다려야 한다.

두 규칙은 하나로 대체되지 않는다. 구현이나 trace를 읽을 때 “다른 bank니까 ACT 가능” 또는 “tFAW가 끝났으니 ACT 가능”이라는 단일 조건은 부족하다. 대상 bank가 idle인지, rank와 대상 group의 최근 ACT가 언제였는지, 최근 네 ACT 창은 어떤지 각각 확인해야 한다. 같은 bank를 다시 여는 경우에는 이전 행 닫기와 row cycle 제한까지 필요하다.

group 분산도 무조건 좋은 schedule을 보장하지 않는다. 요청을 재정렬해 group 간격을 줄일 수 있더라도 뒤로 미룬 요청의 지연이 커질 수 있다. 이미 열린 행의 locality를 버리고 group만 고르게 만들면 새 ACT와 PRE가 더 생길 수도 있다. 최적화 목표는 group 번호의 균등 분포 자체가 아니라 실제 요청을 합법적인 제약 안에서 잘 처리하는 것이다.

timing 이름의 S와 L은 요청 관계를 말한다

tRRD_S와 tRRD_L은 빠른 mode와 느린 mode를 마음대로 골라 쓰는 선택지가 아니다. 어떤 값이 적용되는지는 명령쌍의 주소 관계로 정해진다. datasheet에서 두 값을 복사할 때도 “bank가 다름”과 “bank group이 다름”을 구별해야 한다. 여기서 한 단어를 빠뜨리면 controller model이 허용하지 않는 일정까지 계산할 수 있다.

디버깅에는 ACT trace에 group과 bank를 함께 붙이는 방법이 유용하다. 전체 명령열의 최근 ACT 시각과 group별 최근 ACT 시각을 따로 기록하고, 다음 후보를 각각 S와 L의 minimum에 비교한다. 그다음 tFAW와 bank 상태를 별도로 검사하면 어느 제약이 대기를 만들었는지 드러난다.

다른 bank의 행을 여는 데도 간격이 필요한 이유는 DDR4의 병렬도가 무제한 독립 실행을 뜻하지 않기 때문이다. tRRD를 제대로 읽는 기준은 bank 수보다 ACT가 공유하는 rank와 group의 기록이다. 두 범위의 시간선을 유지해야 분산 배치의 이득과 스케줄 재정렬의 대가를 정확하게 비교할 수 있다.