준비가 필요 없는 디버깅, 스마트 디버깅 - 마이크로칩과 함께 하는 FPGA 설계 주기 가속화 방법
작성: Martin Kellermann, 마이크로칩 테크놀로지 마케팅 사업 개발 매니저
2021년 7월 30일, LinkedIn 게재
항상 HDL 코드를 올바르게 작성하고, 충분히 시뮬레이션한 뒤 하드웨어에 올리시나요?
물론이죠. 대부분의 경우 전 그렇게 했습니다.
솔직히 말하면, 가끔은 그렇지 못한 경우도 있어서 그럴 때면 보드가 동작하지 않는 원인을 나중에 확인해야 했습니다.
이런 상황이라면 어떻게 하시나요?
아마도 어디서 잘못된 것인지 추측해 본 다음 통합 로직 분석기 (internal logic analyzer)를 넣거나 프로브를 추가할 것입니다.
즉, 다시 구현을 수행하고 구현된 설계에 프로브를 추가한 다음 비트스트림을 다시 생성합니다.
모든 경우에서 도구가 작업을 완료할 때까지 일정 시간을 기다려야만 하며, 때로는 오류가 더 이상 재현되지 않는 최악의 상황이 발생할 수도 있습니다.
재구현도 필요 없고, 일일이 수동으로 프로브를 추가할 필요도 없다면 얼마나 좋을까요? 정말 좋겠죠. 제 동료인 Rajesh Divipala와 Apurva Peri가 최근 설계 변경 없이 그리고 도구가 완료될 때까지 기다릴 필요 없이 디버깅을 수행하는 방법을 보여주는 영상 몇 가지를 제작하였습니다.
너무 좋아 믿기 어렵다고요? 전혀 그렇지 않습니다. 바로 Libero® SoC의 SmartDebug라는 기능입니다.
이 도구를 통해 마이크로칩 FPGA를 JTAG로 연결해 설계에 포함된 모든 플립플롭과 모든 BRAM (Block RAM)을 비동기적으로 읽어올 수 있습니다.
게다가 사전 준비 없이도 가능합니다! 이것이 진정한 혁신입니다!
FPGA 세계의 'Hello World’라고 할 수 있는 LED를 깜빡이는 아주 간단한 예제로 이 기능을 시험해 보았습니다. 사실 조금 더 추가해서, LSRAM과 BRAM도 함께 설계에 포함해 시험해 보았습니다.
24비트 카운터를 사용하고 있으며, 상위 비트 (MSB)는 두 개의 LED를 토글하고 하위 비트는 LSRAM의 주소 및 데이터 라인을 구동합니다.
FCCC는 클록 컨디셔닝 회로로, PLL입니다.
AND 게이트는 LSRAM을 설계의 일부로 유지하고 합성 시 최적화 과정에서 제거되지 않도록 하기 위한 다소 구식이며 간단하지만 약간은 조잡한 방법입니다.
이 설계는 매우 단순하지만 여전히 활용도가 높은 Trenz Electronic GmbH의 SMF2000 FPGA 모듈을 대상으로 하고 있으며, 여기에는 마이크로칩 테크놀로지의 SmartFusion®2 FPGA M2S010-VFG400가 장착되어 있습니다.
짧은 구현 과정을 거쳐 비트스트림을 생성하였으며, 이는 보드에 내장된 USB‑JTAG 연결을 통해 FPGA로 전송됩니다.
그 다음, Libero GUI에서 SmartDebug 기능을 실행하기만 하면 됩니다:
이어서 표시되는 GUI에서 ‘Debug FPGA Array…’를 선택합니다:
그러면 설계에 포함된 로직 또는 RAM을 선택할 수 있는 GUI가 나타납니다:
RAM 내용 확인하기
대상 RAM을 선택하면, 그 내용을 비동기적으로 읽어올 수 있으며 해당 메모리 값들이 화면에 표시됩니다:
무슨 일이 일어나고 있는 걸까요? 우리가 기대했던 데이터일까요? 처음 32개의 엔트리는 0이고 그 이후에는 '어떤 값’이 들어 있습니다.
메모리가 어디에 연결되어 있는지 다시 살펴보겠습니다:
하위 5비트 주소는 카운터에 연결되어 있으며, 8비트 데이터는 0에 연결되어 있습니다. 따라서 처음 32개의 엔트리는 계속해서 0으로 기록됩니다.
이는 정상 동작입니다. 그렇다면 나머지 RAM 위치들의 값은 왜 그럴까요? IGLOO® 2의 LSRAM은 리셋 시 초기화되지 않기 때문에 전원 인가 시 임의의 초기값을 갖게 됩니다.
이러한 관점에서 보면 해당 동작은 정상입니다.
데이터 라인을 8비트 카운터로 변경한 다음 이 과정을 반복하고 LSRAM을 다시 읽어 보았습니다.
처음 32개의 엔트리가 증가하는 값들로 채워져 있으므로 읽기는 정상적으로 동작하였습니다:
잠시 후 다시 읽어보니 다음과 같은 결과가 나왔습니다:
이 결과는 비동기식 읽기의 영향을 보여주며, 처음 7개의 주소는 업데이트되었지만 이어지는 25개의 주소는 이전 쓰기 사이클의 값입니다. 그리고 또 가능한 것은 아래 그림에서 주소 0에 한 것처럼 GUI를 통해 LSRAM에 데이터를 수동으로 입력할 수 있습니다:
이 경우 값을 덮어쓰지만, 잘못된 ROM 내용으로 인해 오작동이 발생한 경우라면 이를 간단히 해결하는 용도로도 사용할 수 있습니다.
로직 확인
RAM을 읽는 것과 마찬가지로 동일한 방식을 플립플롭에도 적용할 수 있습니다:
여기에 표시된 모든 데이터는 설계에 대한 아무런 사전 준비 없이, 단지 Libero의 프로젝트 정보와 JTAG으로 읽은 FPGA 배열 데이터만을 기반으로 수집되었습니다.
여러 번 읽다 보면 CNT_net이 증가하고 있음을 알 수 있지만, JTAG을 통한 비동기식 읽기가 느리기 때문에 화면에 보이는 증가 폭은 단일 증가분보다 훨씬 큽니다. 그래서 이러한 읽기 방식은 설계의 전반적인 동작이나 느린 신호에 대한 정보를 파악하는 데 꽤 유용합니다.
스크린샷 맨 아래 신호는 debounce-chain의 값이 4hF임을 보여주며, 이는 입력이 정상적으로 '1’로 풀업되어 있음을 나타냅니다.
또한 플립플롭의 출력 값 역시 JTAG을 통해 변경할 수 있습니다.
실시간 동작
위에서 본 것처럼 비동기식 읽기로는 제약이 있습니다. 그러나 LiveProbe 기능을 사용하면 프로브를 별도로 구현하거나 비트스트림을 다시 생성할 필요 없이 설계 내 임의의 두 플립플롭 출력을 FPGA 전용 핀 두 개로 라우팅할 수 있습니다.
따라서 신호의 원래 속도로 변화를 확인할 수 있습니다. 이 신호들을 관측하려면 오실로스코프가 필요하며, 보드의 해당 핀에 연결하면 됩니다.
결론
Libero® SoC의 SmartDebug 기능은 가상 로직 분석기를 넣는 작업을 하기 전에 설계에 대해 초기 디버깅을 할 수 있는 매우 강력한 수단이며, 비트스트림 생성을 기다릴 필요가 없어서 실험 단계에서 많은 시간을 절약할 수 있습니다. 개인적으로, 이 기능은 매우 강력하기 때문에 마이크로칩 FPGA 사용자라면 꼭 알고 있어야 합니다. 그리고 물론, 하드웨어에 적용하기 전에 여전히 설계를 충분히 시뮬레이션해야 합니다.
영문 원본: Smart Debugging, debugging without preparation – How To Accelerate FPGA Design Cycles with Microchip













