FPGA가 재프로그램될 수 있다는 것은 하드웨어 설계의 기능적인 디버그에 있어서 중요한 이점이 되어 왔다. 설계된 디자인이 정상적으로 동작하지 않을 경우에 ‘디버그 후크’를 연결하는 일은 CPLD와 FPGA를 사용하기 시작한 이래로 많은 엔지니어들이 애용해 온 방식이다.
FPGA의 효율적인 디버깅을 위한 내장 로직 아날라이저의 활용
글│브라이언 케슬리스, 제품기획 담당 선임연구원, 래티스 세미컨덕터 코퍼레이션
FPGA디버깅 기술의 변화를 구동하는 요인들
FPGA가 재프로그램될 수 있다는 것은 하드웨어 설계의 기능적인 디버그에 있어서 중요한 이점이 되어 왔다. 설계된 디자인이 정상적으로 동작하지 않을 경우에 ‘디버그 후크’를 연결하는 일은 CPLD와 FPGA를 사용하기 시작한 이래로 많은 엔지니어들이 애용해 온 방식이다. 초창기에 FPGA내부의 신호들 중에서 관찰이 필요한 경우에는 핀으로 뽑아서 외부 로직 아날라이저에 연결하여 데이터를 캡처하는 방식이 일반적이었다. 그러나 디자인 설계 복잡도와 크기가 증가함에 따라 이러한 접근 방식은 여러 가지 이유로 더 이상 바람직한 방법으로 보기 어렵게 되었다.
첫째로 FPGA디자인 용량은 크게 늘어난 데 비하여, 핀(pin) 갯수의 증가는 훨씬 이에 못 미치고 있기 때문이다. 결과적으로, 그림 1에 도식화된 바와 같이 가용 로직 대비 입출력(I/O)의 수는 점차적으로 감소하고 있는 추세이다. 또한, 디버그 용도로 사용할 수 있는 비어있는 입출력(I/O)의 수는 디자인이 완성되면 거의 남아있지 않은 경우가 많다.
그림 1. 현행 래티스 FPGA의 LUT 대비 가용한 유저 I/O 수
두 번째로, 복잡한 디자인의 경우에 관찰이 필요한 신호의 개수가 생각보다 많을 때가 종종 발생한다는 이유이다. 통상적인 구현 기술에서는 대용량 FPGA내에서 넓은 내부 버스로 설계하는 것이 시스템 성능을 향상시키는 경우가 일반적이다. 만일 내부 32비트 버스가 불량 데이터를 가지고 있다고 의심되는 경우, 일부 I/O핀들로는 확실하게 문제점이 어딘지 결정하기에 부족하다.
세 번째로, 어떠한 복잡한 기능의 시험은 시스템내부에서 이루어져야 하는 경우가 있다. 이러한 경우, 시스템 내에서 보드 내로의 물리적인 접근이 제한될 수가 있다. 새로운 형태의 패키지가 FPGA핀의 접근을 방해하는 요소로서 작용되는 일도 있다. 프로브 연결이 성능 저하와 노이즈 발생을 유발하므로 시스템의 동작속도 에도 문제를 주는 경우가 있다.
마지막으로, FPGA 디버깅 방식의 변화를 요구하는 가장 주요한 요인중의 하나는 내장 로직 아날라이저를 장착하고 있는 새로운 툴의 등장이 되겠다.
이러한 툴을 이용함으로써, 기존의 다른 툴을 이용하여 얻은 결과와는 확연한 차이를 보이는 최상의 결과를 얻을 수 있다. 내장 로직 아날라이저와 외부 로직 아날라이저 공히 리소스와 정적 파라메터 그리고 동적 파라메터를 모두 컨스트레인트(constraint)로 걸 수 있다. 이번 기사에서는 이 두가지 타입의 툴의 컨스트레인트를 비교하며 내장 로직 아날라이저의 효과적 사용의 방법을 기술해 나갈 것이다.
외부 로직 아날라이저 사용에 있어서의 제약 사항
지난 수 십년간 외부 로직 아날라이저는 널리 사용되어 왔다. 외부 로직 아날라이저의 주요한 이점은 많은 양의 신호 정보의 저장 및 데이터를 추적하는 능력에 있다. 형태는 가지각색이지만, 대다수 외부 로직 아날라이저는 수 메가 바이트의 데이터를 저장할 수 있다. FPGA디버깅을 위해 외부 로직 아날라이저를 사용하려면 데이터는 칩 외부로 뽑아내어야 한다. 이 작업은 두 가지 방식으로 이루어진다.
첫번째는 신호들의 관찰이 가능하도록 외부 I/O핀으로 연결시키는 것이다. 그런데 FPGA의 패키지에 따라서 I/O핀으로의 접근이 어려운 경우가 있다. 이러한 방식의 디버깅을 위해 설계된 보드는 통상적으로 커넥터를 가지고 있으며, 믹터(MICTOR)커넥터 등을 FPGA에 연결될 수 있도록 보드를 설계한다. 그러나 I/O핀이 각 신호에 할당되어야 하므로 이러한 방식은 많은 부족과 제약이 따른다.
두번째 방식은 신호를 I/O핀에 연결해 주는 특정 코어를 삽입하는 방법이다. 이 방식의 이점은 코어가 신호들을 I/O핀으로 멀티플렉스함으로써 핀의 공유가 가능하다는데 있다. 이 방법의 제약은 외부 로직 아날라이저가 신호가 실시간으로 캡처하는데 있어서, 코어의 멀티플렉스 기능이 캡처 속도를 현저히 떨어뜨리는데 있다. 이러한 이유 등으로 2배나 4배의 멀티플렉싱 구성이 통상적으로 이용된다.
이것은 32개의 I/O핀이 64개 혹은 128개의 신호를 지원하는 것을 의미한다. 상당히 진보된 방식이긴 하지만, 일례로 넓은 폭의 버스의 값들이 디버그되는 경우 제약사항이 따른다. 신호들이 외부 로직 아날라이저에 연결되면 트리거링과 데이터 캡처 조건을 설정한다.
이 시점에서 외부 로직 아날라이저가 이용될 수 있는 필요조건은 제한된 신호 개수, 고속의 트리거링 로직 그리고 많은 양의 추적메모리 등이다. 대다수의 로직 아날라이저는 스테이트 머신 형태의 트리거링 메커니즘을 이용하고 있다. 사용자는 신호상에서 기다려야 할 값을 정의하고 데이터를 캡처하거나 다른 조건을 검색하기 위해 다음 단계로 이동한다. 신호들 자체는 정적이지만, 조건은 동적이고 언제든지 변경되어질 수 있다.
이러한 접근방식은 위의 필요조건을 만족할 경우 원하는 방향으로 갈 수 있다. 신호의 개수가 제한되어 있는 경우, 해당 신호의 조합에서 가능한 동작의 숫자도 감소한다. 그러나 추적메모리가 비교적 풍부한 경우 관찰을 원하는 시점에 근접한 트리거 조건을 찾는 방법도 가능하다. 이 경우 문제점을 찾기 위해서는 많은 양의 데이터를 캡처가 필요하다.
내장 로직 아날라이저의 사용
내장 로직 아날라이저는 외부 로직 아날라이저와 동일한 FPGA를 위한 디버깅 기능을 수행할 수 있다. 그러나 제반 사항은 서로가 확연히 다르다. 내장 로직 아날라이저는 FPGA내부에 내장한 하나 또는 복수의 로직 아날라이저 코어를 이용한다. 설계자는 PC를 이용하여 소프트웨어상에서 트리거 조건을 설정하며, 이 소프트웨어는 JTAG을 통하여 FPGA와 통신한다.
한번 로직아날라이저 코어가 데이터를 캡처하게되면, 다시 JTAG을 통하여 PC로 전송이 되며, 설계자는 이것을 눈으로 확인할 수 있다. 관찰 가능한 신호수는 단지 트리거링 로직의 복잡도와 추적메모리의 용량에 따라서 제한된다. 대다수 디자인들에게서 수백에서 수천개의 신호의 관찰이 가능하다.
디자인 로직이 점유하지 않은 FPGA의 공간의 크기에 따라서 트리거링 리소스가 제한되며, 디자인 로직에서 사용하지 않고 있는 FPGA의 가용 RAM의 용량에 따라 추적메모리의 크기가 제한된다. 디자인 구현에 따라서 추적메모리에 필요한 RAM만 필요한 경우가 있으며 또 한편 RAM또는 LUT가 사용되는 경우도 있다. 그러나 모든 디자인 구현이 상용 외부 로직아날라이저 보다는 상당히 적은 추적메모리를 제공하며 통상 수천비트 대비 수백만비트의 차이를 보인다. 트리거링과 데이터 캡처는 디자인이 최고 속도로 동작하는 도중에도 가능하며 이때 신호들을 FPGA 외부로 뽑을 필요는 전혀 없다. 외부 로직아날라이저에 반하여 신호는 변경없이 바로 정의된 신호를 이용한다.
비록 어떠한 툴들이 약간의 FPGA라우팅의 추가로 일부 혹은 전체의 연결된 신호를 변경해주는 기능을 가진다고는 하지만 신호의 변경은 간혹 FPGA의 설계수정을 필요로 할 때가 있다. 많은 디자인은 일부 또는 전체의 트리거 조건을 디버깅중에 동적으로 변경하는 것을 허용한다. 그러나 트리거의 복잡도는 어떠한 툴을 쓰느냐에 따라 달라 질 수 있다. 그 차이는 더 많은 유휴 신호와 적은 가용 메모리를 가지고 다양한 트리거링 옵션으로써 내장 로직아날라이저의 이용을 통한 더 나은 결과를 얻는 데 있다.
어느 정도 난이도가 있는 디버깅의 한 예제로서 SMPTE SDI HD 디스플레이상에서 특정한 픽셀을 탐색하는 것을 일례로 들어보겠다. 어떤 특정 상황에서는 EAV(end active video) 시퀀스를 찾은 후, 원하는 데이터에 일치하는 특정 라인번호를 찾고, SAV(start active video)를 찾을 필요가 있다. 최종적으로, 라인상에서 원하는 픽셀을 찾으려면, 해당되는 필요한 워드를 계수해야 된다(그림 2).
그림 2. SDI HD 데이터 스트림의 전형
이러한 종류의 디버깅에서 필요한 데이터를 찾기 위해서는 특정값의 시퀀스 및 종료 시퀀스에 따라오는 특정값의 검색과 데이터를 캡처링하기 전까지의 클럭의 계수가 필요하다. 이러한 해결 원리를 이해하기 위해서는 특정한 구현사항에 대한 통찰이 필요하다. 래티스의 리빌(Reveal) 하드웨어 디버거는 트리거 포인트를 결정하기 위하여, 트리거 유닛과 트리거 산술식을 이용한다. 트리거 유닛은 일종의 비교기이며, 트리거 산술식은 트리거 유닛들과 시퀀스의 조합으로 구성된다.
SDI예제에서는 EAV 및 SAV 시퀀스와 라인넘버에 해당하는 3개의 트리거 유닛이 필요하다. 그리고 최종적으로 필요한 데이터를 획득하기 전까지의 계수 동작이 요구된다. 트리거 설정의 예제가 그림 3에 나타나 있다. 이 설정은 원하는 라인 넘버와 픽셀의 검색에 이용되며 라인넘버 트리거 유닛의 값과 계수값은 동적으로 변경이 가능하다.
그림 3. 트리거 설정의 일례
결론
외부 로직 아날라이저는 시스템 레벨의 기능 분석에 탁월한 그들의 가치에 기인하여 계속 사용되어지게 될 것이다. 그러나 내부 FPGA디버깅에 사용되어질 경우에는 보드내에 물리적인 연결이 설계되어야 하며, 대개 연결가능한 신호의 수에 제한을 받기 마련이다. 한편, 내장 로직 아날라이저는 사용가능한 신호의 수량에 대해서 월등한 여유를 제공하지만, 트리거링 로직과 추적메모리의 용량등의 리소스 제한이 있다.
그러나, 트리거링 옵션을 잘 활용하면 내장 로직 아날라이저로도 가능한 리소스를 극대화함으로써 정확한 시간에 원하는 데이터를 정밀하게 캡처할 수 있다. 본고에서는 SDI비디오 신호에서 원하는 특정 픽셀(라인과 워드)의 분석에 필요한 복잡한 시퀀스를 간단한 트리거 요소만 가지고도 효과적으로 해결하는 예제를 보여주었다. 이러한 예제는 내장 로직 아날라이저의 응용의 많은 시사점을 제시하여 준다. FPGA 설계의 복잡도는 이러한 내장 로직아날라이저의 활용을 촉진시키며, 이러한 툴들은 개발자들의 제품 기능 검증과 디버깅에 많은 도움이 될 것이다.