multiple port net의 fixing

오늘은 HDL을 이용해서 설계하시는 초보자 분들께서 많이 실수하시는 feedthrough net 문제에 대해서 이야기하고, 이를 synopsys에서 해결하는 방법에 대해서 간략히 설명하겠습니다.

HDL을 가지고 예술을 하는 것이 아니라면, 최종적으로 구현에 목적을 두어야 한다는 것은 자명합니다.
따라서, 합성 도구에서 좀 더 잘 받아들일 수 있는 형태로 코드를 만드는 것이 더 좋은 결과를 보일 것이라는 것도 당연하겠지요.

초보분들중에 설계하실때 module로 필요하지 않은 포트를 무조건 많이 만들어두고, 해당 포트를 다시 (이름만 바꿔서) 출력으로 보내는 경우가 간혹 있습니다.

예를 들어 별 이유없이 ina를 받고, 이를 outa로 출력하는 것이지요..

[CODE]assign outa = ina;[/CODE]

이런 경우는 (ina가 다른 곳에서 사용되더라도..) 원래 outa라는 출력 자체가 별 의미가 없는 상황입니다. 모듈 외부에서 ina를 연결하면 될테니까요.. 그런데, 간혹 이런 것을 사용하시는 분들이 있습니다.
이게 왜 문제가 되냐하면, assign문에 의하여 부가적인 로직의 사용없이 전달되는 “feedthrough net”의 경우 verilog netlist상에서 assign으로 표현되고, 이는 backend P&R도구에서 대부분 문제를 일으킵니다.
동일한 이름의 넷이 서로 다른 포트에 붙어있는 경우니까요.

따라서, synopsys design compiler에서는 이러한 것을 해결하기 위해서 multiple port라는 것을 지정하고, 필요한 경우 이를 fix할 수 있도록 하고 있습니다.

우선 synopsys design compiler에서 multiple port라 정의되는 넘들의 종류는 아래와 같이 2가지 입니다.
1) feedthrough net (모듈상의 입력이 바로 출력과 연결되는 net. 위의 예입니다.)
2) multiple port net (logic의 출력이 1개 이상의 출력 포트와 연결되는 net)

이 두 가지 경우 모두 synopsys에서는 netlist를 기록할때 assign문을 이용하게 됩니다.
그런데, 앞에서 설명하였듯이 backend툴들이 assign문과 동작을 잘 안하는 경우가 많기 때문에, 기본적으로 backend tool과 연동하는 netlist의 경우 assign을 사용하지 말것이 권장되고 있습니다.
이러한 문제를 없애기 위해서 가장 좋은 방법은 의미 없는 logic을 중간에 삽입하는 것이겠지요..

따라서, 이 경우 set_fix_multiple_port_nets 라는 컴파일 옵션을 사용하게 됩니다.
이 옵션에서는 대상을 선택하기 위한 3가지 옵션이 있습니다.

[CODE]-feedthrough : feedthrough에 대하여 fix
-outputs : mutipleoutput에 대한 fix
-all : 두 가지 모두 [/CODE]

그리고, 어떤 방식으로 해결할 것인지 정하는 2가지 옵션이 있습니다.

[CODE]-constants : 필요한 경우 logic을 duplicate
-buffer_constants : buffer의 삽입[/CODE]

따라서 일반적으로는 아래와 같은 명령을 준다면, feedthrough에 대한 문제를 synopsys에서 대부분 해결해 주게되니, 합성 스크립트상에 반드시 추가시킬것을 권장합니다.

[CODE]set_fix_multiple_port_nets -all -buffer_constants[/CODE]

Metastable문제와 clock domain crossing문제

아마도 비메모리 반도체 설계를 지망하시는 분들이 입사시 면접에서 가장 많이 받는 질문중의 하나가 바로 “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을 보세요

Xilinx, Altera, Quicklogic.. FPGA 이야기.

가끔 컴퓨터 부품 리뷰에 보면 웃지못할 기사들이 버젓이 쓰여지는 일이 있습니다.
예를 들면 “이 캡쳐 보드에는 핵심칩으로 xilinx spartan 2가 사용되었고, 이 칩은 다른 무슨 보드에서 사용된 칩이다.” 이런 기사 말입니다.

이러한 기사는 어찌보면 FPGA/CPLD에 대한 이해부족으로 나온 기사라 생각됩니다.

[wp]Xilinx[/wp], [wp]Altera[/wp]라는 회사에서 나온 대부분의 칩은 [wp]FPGA[/wp]나 [wp]CPLD[/wp]이며, 이러한 칩들은 필요할때마다 구현하고자 하는 논리 회로를 올릴 수 있도록 구성된 칩입니다.

따라서,  이 회사의 칩은 구성하는 사람이 원하는 대로 바꿀수 있기 때문에 외부에서 보이는 칩의 이름이 xilinx spartan 2이건 altrea cyclon이건 아무런 의미가 없다는 것이지요.
예를 들어 동일한 xilinx spartan2라도 네트웍 시스템하는 사람은 “네트웍 관련 로직”을 넣어서 구현할테고, 그래픽 카드 만드는 사람은 “그래픽 처리 기능”을 넣어서 만들테고, MP3 플레이어라면 “MP3 decoder”를 넣어서 구현할테니 말입니다.

FPGA는 어떤 칩인가
이런 칩들은 reconfigurable logic들인데요.. (antifuse형태를 쓰는 quicklogic과 actel은 잠시 접어두고요..)
이는 초기에 칩을 만들때 범용성 있는 로직들을 무수히 넣어두고, 이 로직들간의 연결을 제어할 수 있도록 해둔 것입니다. 즉, 로직 간의 연결제어에 따라 “원하는” 동작을 할 수 있는 새로운 칩이 되는 것이지요.
대신, 필요 없는 로직도 많고(하드웨어에서 필요없는 로직이 많다는 말은 단가가 비싸진다는 말과 동일합니다), 로직간의 연결도 멀고 해서 ASIC에 비하면 엄청나게 느리고, 전력소모도 많다는 것이 정설입니다.

초기에 이러한 형태의 칩은 하드웨어 설계자들이 구현하고자 하는 동작을 상당히 빠르게 FPGA에 올려서 시스템상에서 테스트(prototyping)하는 목적으로 사용되었습니다.
하지만, 최근에는 공정기술이 좋아지면서, FPGA도 어느정도 속도가 나오고 있구요.. ASIC공정을 타기 위한 NRE가 워낙에 비싸지다보니.. 소량이면서 아주 빠른 동작이 필요없는 경우 시스템에서 FPGA를 직접 이용하는 경우도 많이 늘어났습니다. (FPGA 제작사들은 이런 마켓을 위해서 spartan이나 cyclon과 같은 저가 FPGA를 출시하고 있습니다. )

조금더 들어가서..
FPGA는 로직간의 연결을 제어하는 방식에 따라 여러가지 칩이 존재하는데, 가장 빈번히 사용되는 방식이 SRAM 방식과 antifuse방식입니다. SRAM방식은 로직간의 연결 제어 정보를 SRAM에 두고, 이 SRAM의 프로그램이 변경될때마다 다른 형태의 로직으로 재구성될 수 있도록 만든 형태입니다.
이에 반해서, antifuse방식은 프로그래밍시에 로직 간 붙어있는 fuse중에 불필요한 fuse를 끊어서, 로직간의 연결을 만드는 방식입니다. 따라서, Antifuse 형태는 SRAM 형식보다 (일반적으로) 저전력이며 빠르지만, 재구성될 수 없다는 단점이 있습니다.

다른 잡설들
요즘 공정이 미세해지면서 Fab의 NRE가 너무 비싸지고, 고려사항도 많아지고.. 하면서..
이러다 FPGA(실은 [wp]structed ASIC[/wp])가 대안이 되는 거 아니냐.. 하는 이야기도 있습니다.
이런 마켓을 노리고 Altera는 hardcopy라는 칩도 선보였구요..
하지만, 아직까지는 별로 좋은 반응은 아닌듯 합니다. 초기에는 “열광적인” 지지자들이 꽤 많이 나왔는데 말입니다.

국내에서는 한백전자나 휴인스와 같은 FPGA 보드 사업하는 회사가 잘 되고 있지요..
책또한 국내에서 HDL이나 설계는 대부분 FPGA를 이용한 설계 책들이 주류를 이루고 있지요..
게다가 xilinx FPGA 관련 책(아래)이 이쪽 분야의 책 치고는 아주 선전했습니다. 이쪽 분야 국내서중에 몇 안되는 유용한 책이었구요.. (저자인 김혁씨는 이제 Xilinx FAE로 들어가신것으로 알고 있으며, 이번에 새 버젼이 나왔습니다. 사실 새 버젼에 대해서는 약간 아쉬움이 있습니다만.. )

Real XILINX FPGA World 8.1  

김혁 지음

 

예전(99년이던가 기억이 가물)에 verilog HDL synthesis라는 Bhasker 책을 랩에서 번역 작업을 한적이 있었습니다. 모든 예제를 synopsys로 합성해서 합성 결과를 같이 보여주려고 했었지요.. 헌데..아마도 국내에서 이 편역본을 출간했으면 망하지 않았을까 생각도 합니다. ^^; 사실 학교에선 강의시간에 synopsys를 사용하는 분들도 없을테고.. 기껏해야 몇몇 대학원생들만 사서 보셨을텐데(엔지니어 분들에게는 너무 쉬운책이니..) 채산성이 안 맞죠..^^;

음.. 그러고보니.. 글의 제목이 FPGA 이야기 였네요.. -_-;