[FPGA] VIO 사용 가이드, pin test

VIO를 사용한 FPGA test의 필요성

FPGA 검증에는 변수도 많고 여러 가지 디버깅 포인트가 있어 굉장히 어려움이 많습니다. 하지만 chip이 나오기 전까지 시뮬레이션으로만 확인했던 성능을 실물로 확인할 수 있는 거의 유일한 검증 방법이기 때문에, 보드를 활용한 검증은 매우 중요한 과정입니다. 그래서 test에 존재하는 변수를 최대한 줄이는 것이 좋습니다.

test에 이상이 생겼을 때, 가장 먼저 확인해야 하는 이슈는 보드의 pin이 정상적으로 작동하냐는 것입니다. 시뮬레이션에서는 문제가 없이 pass 되는데 FPGA test에서 문제가 발생하면 진짜 미치고 팔짝 뛰거든요;; 그러면 이것저것 의심하게 되는데 저 같은 경우는 보드 pin의 정상 작동 여부를 확인하는 테스트를 가장 먼저 합니다. 왜냐하면 시뮬레이션이 pass 됐다는 것은, RTL 설계와 검증 코드에는 이상이 없다는 의미이기 때문입니다.

처음에는 IO 핀에 core clock 같은 것을 연결해서 pin test를 진행했습니다. Core clock은 전원이 들어오면 계속 뛰니까, bit를 다운로드하자마자 pin output이 계속 쉬지 않고 토글 됩니다. 그리고 오실로스코프로 찍어서 신호를 확인함으로써 IO 핀에 이상이 없음을 확인할 수 있습니다.

하지만 위의 방법은 bit 파일 합성을 해야 하므로 그동안 시간이 지체될 수밖에 없습니다. VIO 모듈은 RTL 단계에서 pin에 일일이 core clock을 연결할 필요 없이, window에서 제어할 수 있어서 쉽게 pin 테스트를 할 수 있게 만들어줍니다.

관련 글

[FPGA] xdc 설정 방법

프로젝트 생성

Vivado에서 프로젝트를 생성하여 바로 FPGA pin test를 할 수 있습니다. 먼저 프로젝트를 생성하고 기본 옵션으로 선택하다가 Part(보드) 선택할 때 유저가 테스트를 진행할 보드를 검색하여 select 합니다. 저는 이 당시에 VCU118이라는 보드를 사용했습니다.

Vivado 새 프로젝트 생성
새 프로젝트 생성

프로젝트 생성이 끝나면 왼쪽에 IP INTEGRATOR에서 Create Block Design을 눌러 block design을 생성해 줍니다.

Block design 생성
Block design 생성

Block design에는 모듈을 하나만 넣을 거여서 wrapper로 설정해야 합니다. Design을 wrapper로 설정한 다음, diagram에서 +를 누르고 vio를 검색하여 모듈을 추가합니다.

VIO block 추가
Block 추가

VIO 모듈을 생성했으면 다음으로는 옵션을 설정해야 합니다. probe_in과 probe_out의 개수를 설정해야 하는데 우리는 pin의 output만 보면 되게 때문에 probe_in은 0으로, probe_out은 test 하려는 핀의 개수만큼 설정하면 됩니다. 그러면 모듈의 diagram이 자동으로 바뀝니다.

생성된 VIO 모듈
생성된 모듈

모듈 옵션 설정이 끝나면 모든 핀을 선택하고 Ctrl+t를 누르면 자동으로 pad가 생성됩니다.

PAD 생성
PAD 생성

이제 input 되는 clock 정보를 입력합시다, 자동으로 생성된 clk_0을 더블클릭해서 clock 정보를 입력해 주시면 됩니다. 보드를 켜면 자동으로 들어오는 external clock의 주파수를 입력해 주시면 됩니다. 그 후에 Implementation까지 진행해 주시면 됩니다.

XDC 설정

Implementation이 끝나면 window에서 다음과 같은 메뉴가 활성화됩니다. XDC파일에서 설정해 주는 pin 설정이라고 보시면 됩니다. IO Ports에서 pin constraint를 설정해 주시면 자동으로 xdc 설정이 됩니다. xdc 설정 후 generate bitstream을 진행하면 bit 파일이 생성됩니다.

IO port 설정
IO port 설정

위의 xdc 설정 방법은 핀 설정을 시각적으로 쉽게 확인하면서 진행할 수 있다는 장점이 있지만, 설정을 바꾸고 bit 합성을 진행하면 Synthesis부터 다시 시작된다는 단점이 있습니다. 이를 방지하려면 아예 프로젝트를 생성하는 처음부터 xdc 파일을 설정하고 시작하면 더 빨리 합성을 끝낼 수 있습니다.

다음은 xdc 세팅 예시입니다.

set_property PACKAGE_PIN AY14 [get_ports {probe_out0_0[0]}]
set_property PACKAGE_PIN AY15 [get_ports {probe_out1_0[0]}]
set_property IOSTANDARD LVCMOS18 [get_ports {probe_out0_0[0]}]
set_property IOSTANDARD LVCMOS18 [get_ports {probe_out1_0[0]}]
set_property PACKAGE_PIN AW15 [get_ports {probe_out2_0[0]}]
set_property IOSTANDARD LVCMOS18 [get_ports {probe_out2_0[0]}]
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
connect_debug_port dbg_hub/clk [get_nets clk]

bit 합성이 끝나면 open hardware manager에 들어가 생성된 bit 파일과 해당 모듈을 쓰기 위해 만들어진 ltx 파일을 보드에 다운로드합니다. ILA와 마찬가지로 ltx 파일도 보드에 같이 다운로드 해야 정상적으로 VIO 모듈을 사용할 수 있습니다.

잠깐 중간 설명을 드리자면 chip을 design 한 RTL 기반 bit 파일을 다운로드 하는 것이 아니라, 윈도우에서 vivado로 프로젝트를 생성하여 만든 pin test 목적만으로 합성한 bit 파일과 ltx 파일을 다운로드 하는 것입니다.

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

그러면 자동으로 컨트롤 창이 뜨는데요, 각 probe의 값을 설정하면 됩니다. Pin test를 할 때는 해당 probe들을 토글 버튼으로 설정하면 됩니다. 그러면 클릭할 때마다 pin의 output이 달라지는 것을 확인할 수 있습니다.

VIO 컨트롤 창
컨트롤 창

위의 방법을 통해 window에서 pin의 값(high or low)을 컨트롤할 수 있습니다. 오실로스코프를 pin에 연결하여 원하는 대로 조작되는지 확인하면 pin의 정상 작동 여부를 알 수 있습니다.

이렇게 pin을 test한 뒤, xdc 설정이나 bit 파일 합성용으로 생성한 모듈들(clock_wiz, block memory 등)의 assign 조건 등을 확인하는 방법으로 디버깅을 진행합니다.

관련 글

[FPGA] xdc 설정 방법

참고: xilinx vio datasheet

유사한 게시물