[FPGA] ILA 모듈 설정 및 사용 가이드

ILA(Integrated Logic Analyzer) 설명

FPGA test를 하다 보면 signal을 확인해야 할 때가 있습니다. IO 핀으로 나오는 신호는 오실로스코프를 통해 확인할 수 있지만 내부 신호는 확인할 수 없습니다. ILA는 bit 파일 합성 시 Vivado에서 만들어 넣을 수 있는 모니터링 모듈로서 원하는 신호를 모니터링하는 데 사용합니다. 그럼 어떻게 사용하는지 알아볼까요?

생성 방법

먼저 xilinx Vivado 창의 가장 왼쪽의 Project manager에서 IP Catalog를 선택합니다.

vivado 메뉴에서 IP Catalog 선택
vivado 메뉴에서 IP Catalog 선택

IP Catalog를 선택하면 다음과 같은 창이 나오는데 ILA를 검색하고 선택합니다.

IP Catalog 선택 시 나오는 창
IP Catalog 선택 시 나오는 창
ILA 선택
모듈 선택

그럼 다음과 같은 창이 뜨는데요, 이제 입력해야 하는 부분을 하나하나 설명드리도록 하겠습니다.

ILA 옵션 창
옵션 창

Component name

가장 먼저 Component Name을 확인해야 합니다. 기본값은 있지만 바꿀 수 있습니다. 이 이름을 rtl 상에서 인스턴스화할 때 정확하게 입력해야 에러가 안 나겠죠??

Number of probes, Sample Data Depth

다음으로 Number of probes와 Sample Data Depth를 수정해야 합니다. Number of probes는 사용자가 모니터링하고자 하는 신호의 수를 의미합니다. 그리고 Sample Data Depth는 모니터링하는 메모리의 크기를 의미합니다. Depth를 크게 하면 오랜 시간 동안 신호가 어떻게 변하는지 확인할 수 있지만 그만큼 resource를 잡아먹어서 합성시간도 오래 걸리고 test가 제대로 안 돌아갈 수 있습니다.

수정하면 다음과 같이 diagram이 자동으로 바뀝니다.

수정된 ILA 옵션 창
수정된 옵션 창

2nd page

두 번째 창에서는 각 신호의 width를 바꿀 수 있습니다. address 같은 신호는 거의 32bit니까 당연히 바꿔줘야겠죠?? 저는 신호 2개를 모니터링하는 옵션으로 설정했습니다.

ILA 옵션 창 2nd page
ILA 옵션 창 2nd page

여기까지 설정하고 OK를 누르면 다음과 같은 창이 뜨고  Generate를 누르면 자동으로 생성이 되고 그 이후에 IP sources에 생성된 것을 확인할 수 있습니다.

ILA 생성 창
생성 창

인스턴스화

이제 생성이 됐다면 RTL에서 다음과 같은 코드를 작성해서 인스턴스화해 주면 됩니다.

ila_0  u_ila0 (
     .clk    (clk0  )
    ,.probe0 (wire_0)
    ,.probe1 (wire_1)
);

여기서 wire_0와 wire_1는 내가 모니터링하고자 하는 신호이고 clk0는 샘플링 clock입니다. 당연히 내부 clock과 assign 시켜야겠죠?? 그런데 한 가지 주의 사항은 보드에 전원이 들어오자마자 시작되는 clock을 연결해 줘야 한다는 겁니다. 이게 무슨 말인지는 마지막 주의 사항에서 설명하겠습니다.

사용 방법

bit 파일 다운로드

RTL 설계할 때 ILA를 넣어 bit 파일 합성을 하면 ltx 파일이 생성됩니다. 보드에 bit를 넣을 때 이 ltx 파일도 넣어야 모니터링을 할 수 있습니다.

FPGA 보드에 bit, ltx 파일 다운로드
보드에 bit, ltx 파일 다운로드

실제 사용 예시

보드에 bit 파일 설치가 끝나면 vivado에 다음과 같은 창이 나옵니다.

다운 후 vivado 창
다운 후 vivado 창

빨간색 박스에 내가 모니터링하려고 했던 신호들이 나옵니다. 저는 1-bit wire_0와 32-bit wire_1을 모니터링하려고 합니다.
이제 신호 모니터링을 위한 옵션을 설정해야 하는데요, 먼저 파란색 박스 부분을 살펴보겠습니다.

ILA 사용 옵션
사용 옵션

Sample Data Depth가 모니터링하는 메모리의 크기라고 설명해 드린 것을 기억하시나요? Trigger position in window는 유저가 설정한 depth의 어느 부분을 trigger 할지를 결정하는 겁니다. 만약 depth가 8192이고 trigger position이 4096이면 유저가 설정한 trigger point 전 후 반반을 확인할 수 있게 됩니다. 그런데 굳이 그럴 필요는 없어서 저는 대부분 작은 값으로 수정해서 사용합니다(100이나 1000).

다음으로 노란색 박스 부분의 옵션을 수정해 봅시다.

사용 절차
사용 절차

여기서는 트리거 조건을 설정합니다. 트리거 신호를 선택하고 트리거 조건을 설정해야 합니다. High level, Low level, Rising edge, Falling edge 등 원하는 조건을 설정해 주시면 됩니다.

이제 모든 설정을 끝냈으니 Run을 눌러 모니터링을 시작하면 됩니다. 그러면 IDLE에서 Waiting for Trigger로 바뀌게 되고, test를 시작하면 유저가 설정한 트리거 포인트의 신호를 볼 수 있게 됩니다.

Waiting for Trigger
Waiting for Trigger

그러면 IDLE에서 Waiting for Trigger로 바뀌게 되고, test를 시작하면 유저가 설정한 트리거 포인트의 신호를 볼 수 있게 됩니다.

트리거링 된 후 신호 확인
트리거링 된 후 신호 확인

사용 시 주의 사항

Clock 종류

ILA 모듈 사용 시 주의 사항이 있습니다. 첫 번째로는 모듈에 들어가는 샘플링 clock은 보드의 전원을 켜자마자 시작되는 clock을 써야 합니다. 유저의 설계에 따라 합성한 프로젝트에 여러 clock 소스가 있을 수 있는데요, EXT_clock 같은 전원을 켜자마자 들어오는 clock을 사용해야 합니다. 그렇지 않으면 다음과 같은 warning 메시지가 뜨며 모니터링을 할 수 없게 됩니다.

ILA 경고 메세지
경고 메세지
WARNING: [Xicom 50-38] xicom: No CseXsdb register file specified for CseXsdb slave type: 0, cse driver version: 0. Slave initialization skipped.
INFO: [Labtools 27-1434] Device xc7k410t (JTAG device index = 0) is programmed with a design that has no supported debug core(s) in it.
WARNING: [Labtools 27-3361] The debug hub core was not detected.
Resolution: 
1. Make sure the clock connected to the debug hub (dbg_hub) core is a free running clock and is active.
2. Make sure the BSCAN_SWITCH_USER_MASK device property in Vivado Hardware Manager reflects the user scan chain setting in the design and refresh the device.  To determine the user scan chain setting in the design, open the implemented design and use 'get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub]'.
For more details on setting the scan chain property, consult the Vivado Debug and Programming User Guide (UG908).

Clock 주파수

다음으로 주의할 사항은 주파수가 샘플링 clock의 주파수보다 빠른 신호의 경우 모니터링을 할 수 없다는 점입니다. 제 경험상 주파수가 ILA clock과 비슷해도 모니터링이 안 되더라고요;;;;
그래서 ILA 샘플링 clock은 웬만하면 가장 빠른 clock을 사용하는 것이 좋습니다. 물론 위의 첫 번째 조건도 만족해야 하고요!!

참고: ILA Data sheet

Similar Posts