아마도 비메모리 반도체 설계를 지망하시는 분들이 입사시 면접에서 가장 많이 받는 질문중의 하나가 바로 “metastable이 무엇이며, 이를 어떻게 해결할 수 있는지 설명해 보세요” 가 아닌가 생각합니다.
실제로 미국 비메모리 반도체 설계(ASIC designer) 직종의 면접에서 가장 많이 질문으로 사용되는 문제가 무엇인지 이야기가 나온적이 있는데, 위의 문제가 가장 많이 사용되었다고 하네요.. (이 내용을 어디서 봤는지는 잊었습니다.)
학교에서 digital system을 배우시고, HDL을 배우시고, ASIC을 시작한지 얼마 안되는 분들이 간과하기 쉬운 문제가 바로 이 metastable문제이며, 시뮬레이션에서는 별다른 문제 없어보이는데, 칩이 죽는 큰 원인중의 하나입니다.
Metastable?
Metastable은 사전적 의미로 “준안정성”이라고 해석됩니다. 즉, 안정화된 값을 가지지 않은 상태인 것이지요.
로직의 출력 전압에 따라 논리적인 값 0/1을 판단하는 디지털 로직에서는 0/1로 판단될 수 없는 전압이 출력되는 경우 이때의 전압 수준을 “undefined voltage”라 부르고, 로직상으로는 이를 “metastable” 상태인 것으로 판단합니다.
플립 플롭에서의 metastable 상태 출력
Flipflop이 입력된 값을 정상적으로 출력단으로 전달하기 위해서는 clock edge의 앞뒤로 일정시간동안 데이터가 안정화 되어 있어야 하는데, 이를 setup time/hold time이라고 합니다.
만일 데이터가 setup/hold time동안 안정화되지 못하고 데이터가 변하면 플릿플롭의 출력 transition time이 비정상적으로 길어지게 되어서 결과적으로 0/1로 판단할 수 있는 수준의 voltage level에 도달하지 못하는 상태가 발생할 수 있습니다. 이런 경우가 바로 플립플롭에서 metastable출력이 발생하는 경우이며, 이 경우 아주 치명적인 논리적 오류를 발생시킬 수 있습니다.
따라서, 플립플롭을 사용하는 synchoronous 설계에서는 setup/hold 시간을 고려하여 설계를 합니다. 즉, 데이터가 다음 클럭의 setup time 이전에 도착하도록 하고, 같은 클럭의 hold time보다 늦게 데이터가 도착하도록 설계하는 것입니다.
Asynchronous input의 문제
플립플롭에 대한 asynchronous input은 이런 조작이 근본적으로 불가능하기 때문에, metastable상태가 발생할 수 있는 경우가 있습니다.
Asynchronous input이란 다른말로, 언제 들어와도 아주 큰 상관 없는 입력이겠죠? ^^;
그러니까, metastable을 피하기 위해 플립 플롭을 하나 더 추가하는 방법으로 metastable문제를 해결합니다.
즉, 첫번째 플립 플롭에서 metastable이 되더라도, 추가적으로 하나 더 플립플롭을 사용하면 에러가 의미있는 로직으로 전파되는 것을 막을 수 있다는 것이지요. 이러한 해결방법을 multistage flipflop혹은 multistage synchronizer라 부릅니다.
Clock Domain Crossing
사실 metastable문제는 clock domain crossing(CDC)때문에 복잡해집니다. CDC에 대한 이야기는 나중에 자세하게 이야기할 예정이고, 여기서는 간략히 소개만 하겠습니다.
클럭 도메인이라는 것은 동일 클럭 소스를 받는 FF들의 집합 정도가 될까요… 그런데, ASIC을 설계하다 보면 클럭 도메인이 여러개가 될 수 있고, 클럭 도메인 간에 데이터 전달이 일어납니다.
연관 있는 클럭, 예를 들면 주기가 25ns인 클럭과 50ns인 동일 소스에서 분주된 두개의 클럭인 경우, 두 클럭간의 연관성이 매우 크기 때문에 clock domain crossing에서 별로 고려할 사항이 없습니다. 단지 합성시 tool setting만 제대로 해주면 되죠. ^^;
하지만, 연관성 없는 두개의 클럭, 예를 들어 클럭 소스도 완전히 분리되어 있고, 주기도 제각각인 클럭 도메인에서 신호가 전달되는 것은 asynchronous와 별다를바 없는 상황인 것입니다. 따라서 클럭 도메인을 변경시키기 위한 synchronizer와 더불어 추가적으로 플립플롭을 하나 더 써서 metastable을 방지해야 합니다.
아주 간단한 구조적 CDC문제만 이야기 했는데, 사실 CDC에는 구조적인 CDC뿐 아니라 클럭 도메인을 넘어가는 두 신호(혹은 버스)가 다시 조합되어 사용될때 발생할 수 있는 문제인 reconvergence의 문제와 같이 고려해야할 사항이 몇개 더 있습니다. 이 이야기를 좀더 알고 싶으신 분은 cadence에서 나온 CDC 자료를 참조하시면 됩니다. 나중에 이 이야기도 더 해볼 기회가 있을거라고 생각합니다.
혹시 ASIC position에 면접 보시는 분들.. metastable은 꼭 기억하고 들어가세요.
추가> Timing 시뮬레이션 관련 내용은 이 posting을 보세요
DRAM 설계(e.g. DDR,DDR2,DDR3) 중 data path에서 CLK과 DQS 간의 domain crossing 문제가 있습니다…
요건 앞서 언급하신 synchronizer로는 해결할 수 없는 경우에 해당할 것 같습니다… (제 때 나와야 하므로)
write 때도 있고 read 때도 있고 하지만… read 때가 좀 더 복잡한 것 같구요… (CL 고려해야 하구 해서)
예전엔 logic과 async. delay로 설계한 후 무진장 simulation 돌려가며
metal option도 무지 많은 delay 튜닝을 한 것 같습니다만…
요샌 DLL 내 delay를 이용하는… 좀 더 깔끔한 scheme을 쓰는 것 같습니다.
음.. CLK와 DQS는 동종 소스에서 출발한 이종 엣지 클럭이 아닌가요? 이 경우는 synchronizer를 쓰지 않고, delay setting에 의한 margin만 잘 잡으면 되겠죠..
그리고, DDRn 자체에서는 circuit level 이므로, logic synthesis를 고려하지 않잖아요..SPICE 돌리고 파형보고 알아서 잘 넣으셔야겠습니다. 🙂
넹… freq. 자체가 다른 것은 아니니까요;;
그래도 delay 맞추는 노가다가 꽤 심한 것 같아요…
(물론 전 안해봤지만 ㅋㅋ;;)
Write시 CLK과 DQS 사이의 delay 차이는 -0.25*tCK~+0.25*tCK의 범위를 갖고 있어 이를 만족해야 하구요…
Read시 내부 지연된 외부 CLK과 DLL clock(DQS로 나갈) 간의 domain corosing이구요…
High speed로 갈수록 setup/hold 문제가 심해져서 어디선가? DQS의 delay를 calibration하는 모드도 있구요…
모르는게 있어서 검색해서 와떠니 여기군요..
많은 도움 되었습니다..ㅋ
도움이 되셨다니 다행입니다. ^^; 그 이후의 부분을 적기로 해 놓고 아직도 안 쓰고 있는 게으름..
초보 엔지니어 입니다. ^^
툴 돌리면서 틈틈이 읽으며 공부하고 있지요.
아직은 위의 리플들이 눈에 들어오지 않지만,
저도 타인에게 도움을 줄 수 있는 레벨이 되기 위해 노력해야겠습니다. ㅋㅋ
정말 babyworm님의 블로그는 안보고 살래야 살 수가 없네요. 구글링하다가 또 들어오게 되네요…
오래전에 봤던 글타레지만, 또 간만에 async interface 설계할 일이 있다보니, 이렇게 또 보게 되네요…
아무튼, 존경합니다..^^;;;
엇.. 너무 부담스러운 칭찬이신데요.. ^^;
Pingback: Synchronizer 시뮬레이션 문제 | Babyworm: Processor Architect.
안녕하세요, 금번 MPW에서 metastable관련 issue 해결을 못하고있어서 찾아보다 들어왔는데 좋은글이 너무 많네요 감사합니다! 근데 register slicing을 해야 할 것 같은데… timing이 다 어그러져서 큰일이됬네요 ㅎㅎㅎ
그리고 다른 글들 보다보니까 emcore 관계자분 같은데 저는 국산 CPU관련 과제 수행하고 있는 대학원생입니다 ㅎㅎ 다시한번 좋은글 감사드립니다!
너무 늦게 reply하네요. 좋은일하고 계시군요 🙂 응원하겠습니다. 저는 EISC를 예전에 10년정도 했었고, 지금은 다른 회사에서 다른 일을 하고 있습니다.