Monday, December 1, 2014

[오늘의 반도체 용어] What is Metastable


이번에는 front-end 엔지니어가 반드시 알아야할 Metastable에 대하여 알아보도록 하자. metastable은 말 그대로 '준안정'을 말한다. 한글로 쓰니까 먼가 괜찮아 보이는 용어 같지만 실제로 Digital 회로에서 가장 문제가 되는 부분이 이 Metastable 님 되시겠다.  좀 더 쉽게 풀어서 설명하면 Digital에서 신호는 0 또는 1 이다. 그러나 metastable은 0도 아니고 1도 아닌 상태를 말하는데 이것을 이전 포스팅([반도체기초] High Impedance(z) and Unknow(x))에서 설명한 unknown 상태가 되는 것이다. 이 상태가 되면 이후 로직에 영향을 주기 때문에 설계자가 원하는 대로 동작하지 않게 된다. 따라서 metastable은 로직 설계 엔지니어라면 반드시 조심해야할 문제인 것이다.

그렇다면 이 metastable은 왜 생기는 것이며 어떻게 없앨 수 있는 것일까?

엔지니어가 디버깅할 때 가장 중요한 것이 필자는 '원인'을 찾는 것이라고 생각한다. 모든 문제는 원인만 찾는 다면 십중팔고 50%는 이미 해결했다고 봐도 과언이 아니다. 그러나 이 세계에서 눈에 보이는 것이 많지 않고 인간이라는 존재가 항상 실수를 할 수 밖에 없기에 정확한 원인을 찾는것이 정말 쉽지 않다는 것이 문제이다.

이야기가 조금 샛는데 다시 돌아와서 metastable이 발생하는 원인은 무엇일까? 보통 비동기(asynchronous)로 인하여 발생하게 된다. 동기(Synchronous)방식으로 설계된 회로는 정확한 엣지에서 신호를 주고 받기 때문에 설계자가 신호를 어느정도 예측할 수 있는데 비동기(asynchronous) 신호는 언제 신호를 받을지 알 수가 없기 때문에 자칫하면 metastable 신호가 만들어지게 되는 것이다. 보통은 서로 다른 소스의 clock 간에 데이터나 신호를 주고 받게 되면 발생하게 된다.(CDC 라고 하나 다음 포스팅에서 다룰 예정)

해결책은 무엇인가!? 가장 일반적인 방법은 Synchronizer(Flip-Flop 2개를 연달아 사용)를 사용하는 것이다. 디지털 설계에서 조심해야할 부분이 metastable 상태이니 반드시 고려할 수 있도록 하자.

No comments :

Post a Comment