RTL 설계를 하고 보드 상에서 검증을 하기 위해서는 bit 파일을 생성해야합니다. 이를 위해서는 xdc 파일을 만들어야 하는데, 이 파일은 보드의 동작을 최적화하고 제대로 동작시키기 위한 constraint 파일이기 때문에 검증에 필수적입니다.
이 글에서는 보드 test를 위한 constraint를 작성하는 방법에 대해 알아보겠습니다.
XDC(Xilinx Design Constraint) 설명
Constraint 파일은 vivado tool에서 사용하는 design constraint 파일로 보드를 사용한 test를 위해 여러 가지 constraint를 설정할 수 있습니다. 이 파일에서 설정해 주는 constraint에는 대표적으로 clock constraint, 핀 설정, pull up/down 설정 등이 있습니다.
Clock constraint
Chip을 설계할 때 input으로 들어오는 clock들이 있습니다. 보드에도 오실레이터를 달아서 clock을 생성해주거나 디버깅 용 JTAG을 연결할 때 들어오는 clock은 constraint를 설정해줘야 합니다.
create_clock -period 50.000 -name clock1 -waveform {0.000 25.000} [get_ports input_port]
빨간색 글씨가 유저가 설정해야하는 부분입니다. Clock의 주기와 이름을 설정해 주고 실제 RTL 코드에서 clock이 들어오는 input port의 이름을 써넣어주면 됩니다. 그러니까 RTL로 설계한 chip_top에서 input_port 핀으로 들어오는 clock은 주기가 50ns이고 clock1이라고 명명하는 거죠.
Pin 설정(pin 맵핑)
FPGA 보드에는 여러 IO 핀이 있습니다, 당연히 chip_top의 input, output들과 FPGA의 IO핀들을 연결해줘야겠죠?? 그러기 위해서는 먼저 내가 사용하는 보드의 Data sheet를 보고 pin map을 파악해야 합니다.
예를 들어, RTL top에서 GPIO0라고 하는 inout을 보드의 A0라고 하는 핀(Data sheet에 나와있습니다)에 연결하고 싶다고 한다면,
set_property PACKAGE_PIN A0 [get_ports GPIO0]
라고 작성하시면 됩니다.
다음으로는 해당 핀의 전압 설정을 하는데요, 대부분 3.3V나 1.8V를 씁니다.
set_property IOSTANDARD LVCMOS33 [get_ports GPIO0]
3.3V일 때는 LVCMOS33, 1.8V일 때는 LVCMOS18로 작성해 주시면 됩니다~~
pull up/down 세팅
마지막으로 pull-up, pull-down을 설정해 줍니다. I2C나 SPI같은 통신 IP를 쓰고 싶을 땐 당연히 pull-up으로 설정해야겠죠??
set_property PULLUP true [get_ports GPIO0]
기타 에러 해결
DONT TOUCH
문제 발생
System Verilog 파일을 받아서 FPGA 합성을 돌리고 test를 진행했습니다. 그런데 자꾸 에러가 발생하는데 그 원인이 모듈 하나가 아예 빠진 것 같더라고요;; 그래서 source 목록을 확인해 봤는데 source에는 제대로 import 된 모듈들이 Synthesis 후 Netlist 목록에 없는 것을 확인했습니다. 무슨 이유인지 모르겠지만 합성 과정에서 Vivado tool이 아예 날려버린 것 같더라고요;;
DONT_TOUCH로 해결
Vivado tool이 모듈을 날리지 못하게 처리하는 방법이 있습니다, 바로 DONT_TOUCH인데요, 링크로 가시면 예제를 확인해 보실 수 있습니다.
(* DONT_TOUCH = "yes" *) //DONT_TOUCH
module example_dt_ver
(clk,
In1,
In2,
out1);방법은 RTL 코드 가장 위에 있는 module 선언 위에 (* DONT_TOUCH = “yes” *)를 입력하시면 됩니다. 위의 처리를 해주니까 Synthesis 후 합성된 Netlist 목록에 원하는 모듈들이 사라지지 않고 제대로 합성된 것을 확인할 수 있었습니다.
Type error
logic type error 발생
입사한 뒤, 2번째 프로젝트를 진행할 때 System Verilog 파일을 받아서 FPGA 합성을 진행하려고 했습니다. System Verilog는 확장자명이 .sv인데 저희 회사는 System Verilog에 익숙지가 않아서 .v로 수정하고 작업을 진행했었어요.
RTL integration 작업이 끝나서 bit 파일 합성을 돌렸는데 다음과 같은 ERROR가 발생했습니다.
[Synth 8-993] logic is an unknown type
그래서 뭔가 해서 찾아봤는데 logic type은 Verilog에서 사용하지 않는 type이어서 System Verilog로 확장자를 바꿔줘야 한다고 합니다. 그래서 .v를 원래 형태인 .sv로 수정하고 합성을 돌리니 에러가 사라졌습니다.
Verilog 파일을 System Verilog 파일로 인식하게 만드는 방법
앞에서 제가 받았던 System Verilog 파일이 soc.sv라고 해봅시다. 그렇다면 Verilog로 바꾼 파일은 soc.v가 됩니다.
여러 사람이 같이 작업하는 프로젝트에서 제가 FPGA 파트를 맡았는데, 합성용으로 soc_fpga.sv 같은 파일을 추가로 생성한다면 문제가 발생하게 됩니다. 수석님이 soc.v를 작업하시면 그때마다 bit 파일 합성용으로 만든 soc_fpga.sv를 soc.v에 맞게 수정해야 합니다. 너무 귀찮겠죠??
위와 같은 문제를 해결하기 위해 명령어로 Verilog 파일을 System Verilog 파일로 인식하게 만들 수 있습니다. TCL 파일에 입력하면 돼요.
set_property file_type SystemVerilog [get_files <filename>.v]
만약 파일 이름이 soc.v라고 한다면
set_property file_type SystemVerilog [get_files soc.v]
이렇게 작성하면 vivado tool이 Verilog 파일을 자동으로 System Verilog 파일로 인식합니다.
참고: XDC file 설명