DRAM DFE (Decision Feedback Equlization, ISI 제거, DDR, LPDDR)
#ISI ( Inter-Symbol Interference )
우리는 신호를 주고받을 때, 여러 Noise가 낀 상태로 신호를 주고받게 된다. 당연하다 디지털 신호를 결국 아날로그 신호를 받아서 변환해야 하기 때문이다. 이걸 어려운 말로 하면, ISI ( Inter-Symbol Interference )로 인해 신호에 왜곡이 생긴다고 한다.
ISI란 뭐냐면 쉽게 말해 앞의 신호가 뒤에 오는 신호들에게 영향을 줘서 생기는 신호의 왜곡을 말한다. Data가 '0' 또는 '1'이 들어왔다고 했을 때 해당 신호의 펄스가 시간적으로 확산되어 인접한 다른 Data의 판독을 방해하는 현상이다. 예를 들어 여러 사람이 줄 서서 순서대로 말하는데 앞사람의 말이 끝나기도 전에 뒷사람이 말하는 소리가 겹쳐 뒷사람의 말을 제대로 알아듣기 힘든 상황이라고 생각하면 된다.

이런 ISI 환경에서는 Data를 줄 때 Rx(Recvier) 단에서 신호 저하 및 Data 열화로 인해 정확한 Data를 받기가 어렵다. 음.. 결론적으로는 ISI 때문에 신호에 너프가 작용한다는 말이다. 이를 보완하고자 나온 방법이 DFE다.
#DFE ( Decision Feedback Equlization )
ISI 때문에 생기는 문제 상황은 Data Conversion이 생길 때 발생한다. 무슨 말이냐면 0에서 1로 바뀌거나 1에서 0으로 바뀔 때 문제가 생긴다. 즉, AC (Alternating Current) 신호일 때 뒤에 오는 신호가 온전히 전달되기 어렵다.
예를 들어보자, 1 --> 1 --> 0 순서로 신호가 들어온다고 하면 두 번째 1은 Fully 1로 차 있을 것이다. 다음 0을 인식하기 위해서는 신호가 0.5 이하로 내려가야 하는데 ISI 때문에 쭉 0으로 떨어지는 게 아니라 0.4 이런 식으로 간당간당하게 떨어진다.
그래서 신호의 특성을 개선 시키기 위해 AC일 때 이득을 보고 DC(Direct Current) 일 때는 조금 손해를 보게 만든 것이다. 손해를 어떻게 보냐면 1로 꽉 채우거나 0으로 다 비우지 않고 조금씩 남겨 두는 것이다.
이해를 돕기 위해 추상적인 예시를 들어보자. 만약 Input이 01100이라고 하면, (가중치 0.2라고 가정)
0.2 --> 0.8 --> 0.8 --> 0.2 --> 0.2 이런 식으로 동일한 Data가 있을 때 (DC)는 0.2를 손해를 보고 서로 다른 Data (AC)일 때는 0.2를 이득을 봄으로 평균적으로 신호를 개선시키는 방식이 DFE다. (@DFE가 없다면, 0 --> 0.6 --> 1 --> 0.4 --> 0 이런 식으로 신호가 바뀔 것이다)
그럼 궁금한 게 하나 생길 것이다. "오케이 이전 데이터랑 비교해서 현재 데이터를 조정한다는 건 알았어. 그럼 제~일 처음 들어오는 데이터는 뭐랑 비교하지?" 그래서 Spec에는 처음 데이터가 들어오기 전에 2UI를 0으로 깔아줘야 한다고 한다. 무슨 말인지 모르겠다면 그냥 제일 처음 들어오는 데이터는 앞에 데이터가 0이라고 생각하고 DFE 동작을 한다.
아래 그림은 4개의 Case로 나눠서 본 것이다. 검은색 선은 ISI가 없는 이상적인 신호를 의미한다.

이처럼 DFE는 이전 데이터와 현재 데이터를 비교해서 Feedback을 해서 신호를 조절한다. 참고로 이전 데이터 1개만 비교하면 1-tap이라고 하고 4개의 데이터를 참고해서 비교하면 4-tap이라고 한다.
DFE 는 Rx(Write) 단에서만 적용할 수 있으며 High Speed일 때만 작동하게 만들어놨다. LPDDR5에서는 6400Mbps 이상일 때, LPDDR6에서는 9600Mbps이상일 때만 지원한다고 한다. 또한 Per-Pin 별로 Weight의 Step을 변경할 수도 있고, LPDDR5에는 Byte별로 Control 하거나, LPDDR6에는 DQ0에 있는 Weight를 모든 DQ에 동일하게 적용하거나 하는 방법이 있다.
Weight를 주는 방식은 2가지로 나눌 수 있는데 효과는 동일하다. 1) Input 자체에 가중치를 주는 방식, 2) Input의 0 or 1을 구분하는 Reference Voltage(Vref)에 가중치를 주는 방식이 있다. 또한 추가적으로 Feedback 하는 방법은 여러 가지가 있을 수 있지만 2가지만 알아보자
#1) Direct Feedback
앞 신호를 알게 되면 해당 데이터가 뭔지에 따라 Direct, 바로 Feedback을 하는 것이다. 아래 그림에서 Strobe라고 하는 것은 들어오는 데이터를 DRAM이 인식하는 동작이라고 생각하면 된다. 즉, Direct Feedback은 결과를 확인하고 이에 따라 Weight를 더하여 다음 데이터를 조절하는 방식이다. 아래 그림은 개념적인 측면을 간단한 그림으로 그린 것이다.

해당 방식은 데이터를 확인하고 Feedback을 해야 하기 때문에 Timing적으로 타이트하다. 그러니 더욱 고속으로 갈수록 해당 방식으로는 힘들다. 이를 보완하고자 구현한 방식인 Unrolling Feedback이다.
#2) Unrolling Feedback
해당 방식은 앞 데이터의 결과를 기다리기 전에 Case별(0일 때, 1일 때)로 "미리" Weight를 더해 놓는 방식이다. 이렇게 되면 나중에 선택만 해주면 되기 때문에 Timing 적으로 이득을 볼 수 있다. 하지만 조건을 추가했기 때문에 Current 소모가 상대적으로 더 많다.
사실 DFE는 Input Level (혹은 Reference Voltage)를 낮추거나 높이거나 둘 중 하나인데 둘 다 미리 해 놓는 것이라 하나는 필요 없는 동작을 하게 된다는 말이다.
조금 헷갈린다면.. 예를 들어 0 --> 1 이렇게 데이터가 입력된다고 생각해 보면, 둘은 정말 거의 동시에 들어오는 수준이라 1의 입장에서는 앞 데이터가 뭔지도 모른다. 그래서 조금이라도 빨리 앞 데이터가 뭔지 알아야 하는데 앞 데이터가 0인지 알고 그다음에 동작을 하기엔 시간이 너무 부족하다. 그래서 앞 데이터가 0일 때 Case 하나. 또, 1일 때 Case 하나 이렇게 2개의 Case일 때의 Weight를 미리 더해 놓는다. 그러니 일단 미리 해 놓고 데이터가 나오면 앞 데이터에 맞게 바로 선택 함으로 시간을 단축시킬 수 있는 것이다. 이렇게 동작하는 회로를 Unrolling 회로라고 한다. (@Unrolling이 펼치다의 뜻이니까 하나로 돼 있던걸 펼쳐서 2개로 만들었다 이런 뜻 아닐까 싶다)

해당 논문도 있다. (Implementation of 1st–Tap Loop-Unrolling for High-Speed DFE)
https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE02242620
#마무리
이렇게 DFE에 대해 간단한 개념 및 구현 방식에 대해 알아봤다. 나름 열심히 공부하며 정리한 내용이지만 틀릴 수도 있고 내용이 부실할 수도 있다. 그럼에도 누군가에겐 도움이 되길 바라며 DFE를 마무리한다!