적극적 생각/FPGA

[Vivado-Based Workshops] FPGA Design Flow using Vivado (2)

무말랭이 2022. 8. 4. 12:21

Lab02

https://www.xilinx.com/support/university/vivado/vivado-workshops/Vivado-fpga-design-flow.html

 

FPGA Design Flow using Vivado

 

www.xilinx.com

lab2.pdf
1.11MB

---

Introduction

synthesis settings를 변경했을 때 synthesis process는 어떻게 변하는가?

design 그리고 generated reports를 분석하기.

Objectives

- timing of the circuit을 제어하기 위해 XDC 파일을 활용하기

- 설계를 엄밀히 다루고 결과를 이해하기

- basic timing constraints를 synthesize design 과정에서 이해하고 활용하기

- synthesize 결과를 분석하기

- synthesis settings 변경 및 결과 확인

- synthesis 후에 checkpoint를 활용하여, reloading 후에도 결과를 분석할 수 있도록 하기

Design Description

키보드 입력을 수신하여

해당 문자와 동등한 이진법을 표시한다. 

이를 위해 적절한 PS, PL 시스템을 구성하며

이를 위한 통신으로 USB - UART 방법을 활용한다.

(GPIO 및 UART 개념이 확장되어, 원문 그대로에 익숙해질 수 있도록하자.)

 

---

Application

복잡도가 높아보이니 

우선 제시된 설계를 그대로 활용하고

4비트만 활용해서 

숫자 0~16까지 hex 입력하면 led로 bin 출력하게끔

설계를 응용해보는 것 또한 진행해볼 수 있도록 하자.

 

---

Step1 : Create a Vivado Project using IDE

GPIO란 무엇인가? : General Purpose Input/Output.

https://m.blog.naver.com/gbtec/221313213489

 

GPIO 이해하기!

오늘은 GPIO에 대해 얘기볼까 합니다 . . . 시작하겠습니다!! GPIO란?Raspberry Pi 3 model B에...

blog.naver.com

TCL 스크립트란 무엇인가? : Tool Command Language

https://ko.wikipedia.org/wiki/Tcl

 

Tcl - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 다른 뜻에 대해서는 TCL 문서를 참고하십시오. Tcl (원래 "Tool Command Language"에서 왔지만 관례적으로 "TCL"이 아니라 "Tcl"이라고 쓰며 "티클" 또는 "티씨엘"[1]로 발음

ko.wikipedia.org

 

가장먼저 해야하는 일은 

USB UART 연결을 간단한 GPIO 스타일로 배치하고

PL 영역에서 사용할 수 있도록 하는 PS 디자인을 만드는 것이다.

 

Zybo Board 대상 프로젝트를 생성하고

제공된 tcl 스크립트를 사용해서

PS subsystem에 대한 block design을 생성한다. 

 

design, xdc 파일을 불러온다.

uart_led_timing_Zybo.xdc

##Zybo Timing

# define clock and period
create_clock -period 8.000 -name clk_pin -waveform {0.000 4.000} [get_ports clk_pin]

# Create a virtual clock for IO constraints
create_clock -period 12.000 -name virtual_clock

set_input_delay -clock virtual_clock -max 0.000 [get_ports rst_pin]
set_input_delay -clock virtual_clock -min -0.500 [get_ports rst_pin]

set_input_delay -clock virtual_clock -max 0.000 [get_ports btn_pin]
set_input_delay -clock virtual_clock -min -0.500 [get_ports btn_pin]

#output delay
set_output_delay -clock virtual_clock 0.000 [get_ports {led_pins[*]}]

tcl 파일 실행

 

음 cd 명령어가 잘 안먹는다.

ps7_create_zybo.tcl (파일을 열어보니, '디렉토리'가 다르게 선언되어있어 그냥 실행하면 안된다.)

create_bd_design "system"
update_compile_order -fileset sources_1
startgroup
create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0
endgroup
apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" }  [get_bd_cells processing_system7_0]
startgroup
set_property -dict [list CONFIG.PCW_USE_M_AXI_GP0 {0} CONFIG.PCW_EN_CLK0_PORT {0} CONFIG.PCW_EN_RST0_PORT {0} CONFIG.PCW_QSPI_PERIPHERAL_ENABLE {0} CONFIG.PCW_QSPI_GRP_SINGLE_SS_ENABLE {1} CONFIG.PCW_ENET0_PERIPHERAL_ENABLE {0} CONFIG.PCW_SD0_PERIPHERAL_ENABLE {0} CONFIG.PCW_UART1_PERIPHERAL_ENABLE {0} CONFIG.PCW_TTC0_PERIPHERAL_ENABLE {0} CONFIG.PCW_USB0_PERIPHERAL_ENABLE {0} CONFIG.PCW_USB_RESET_ENABLE {0} CONFIG.PCW_I2C_RESET_ENABLE {0} CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {1} CONFIG.PCW_GPIO_EMIO_GPIO_IO {1}] [get_bd_cells processing_system7_0]
endgroup
startgroup
create_bd_port -dir O -from 0 -to 0 GPIO_O
connect_bd_net [get_bd_pins /processing_system7_0/GPIO_O] [get_bd_ports GPIO_O]
endgroup
regenerate_bd_layout
validate_bd_design
generate_target all [get_files  C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd]
export_ip_user_files -of_objects [get_files C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd] -no_script -force -quiet
export_simulation -of_objects [get_files C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd] -directory C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.ip_user_files/sim_scripts -force -quiet
make_wrapper -files [get_files C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd] -top
add_files -norecurse C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/hdl/system_wrapper.v
update_compile_order -fileset sources_1

 

우선 어떤 레벨의 dependency가 있을지 모르니 

프로젝트 폴더링을 docs와 동일하게 만든 후 진행해보도록 하자.

 

그러니깐 tcl console이 말을 잘 듣는다.

 

tcl script를 써서 그렇지

결과적으로 gui로도 충분히 할 수 있는 과정이었다.

 

start_gui
create_project lab2 C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2 -part xc7z020clg400-1
INFO: [IP_Flow 19-234] Refreshing IP repositories
INFO: [IP_Flow 19-1704] No user IP repositories specified
INFO: [IP_Flow 19-2313] Loaded Vivado IP repository 'C:/Xilinx/Vivado/2022.1/data/ip'.
set_property board_part digilentinc.com:zybo-z7-20:part0:1.0 [current_project]
add_files -norecurse {C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/led_ctl.v C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/uart_baud_gen.v C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/meta_harden.v C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/uart_rx.v C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/uart_rx_ctl.v C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/uart_led.v C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/uart_top.v}
import_files -force -norecurse
INFO: [filemgmt 20-348] Importing the appropriate files for fileset: 'sources_1'
import_files -fileset constrs_1 -force -norecurse C:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2/uart_led_timing_Zybo.xdc
update_compile_order -fileset sources_1
cd c:/xup/fpga_flow/2016_2_ZYNQ_sources/lab2
source ps7_create_zybo.tcl
# create_bd_design "system"
Wrote  : <C:\xup\fpga_flow\2016_2_ZYNQ_labs\lab2\lab2.srcs\sources_1\bd\system\system.bd> 
create_bd_design: Time (s): cpu = 00:00:06 ; elapsed = 00:00:08 . Memory (MB): peak = 1495.414 ; gain = 48.785
# update_compile_order -fileset sources_1
# startgroup
# create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0
# endgroup
# apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" }  [get_bd_cells processing_system7_0]
# startgroup
# set_property -dict [list CONFIG.PCW_USE_M_AXI_GP0 {0} CONFIG.PCW_EN_CLK0_PORT {0} CONFIG.PCW_EN_RST0_PORT {0} CONFIG.PCW_QSPI_PERIPHERAL_ENABLE {0} CONFIG.PCW_QSPI_GRP_SINGLE_SS_ENABLE {1} CONFIG.PCW_ENET0_PERIPHERAL_ENABLE {0} CONFIG.PCW_SD0_PERIPHERAL_ENABLE {0} CONFIG.PCW_UART1_PERIPHERAL_ENABLE {0} CONFIG.PCW_TTC0_PERIPHERAL_ENABLE {0} CONFIG.PCW_USB0_PERIPHERAL_ENABLE {0} CONFIG.PCW_USB_RESET_ENABLE {0} CONFIG.PCW_I2C_RESET_ENABLE {0} CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {1} CONFIG.PCW_GPIO_EMIO_GPIO_IO {1}] [get_bd_cells processing_system7_0]
# endgroup
# startgroup
# create_bd_port -dir O -from 0 -to 0 GPIO_O
# connect_bd_net [get_bd_pins /processing_system7_0/GPIO_O] [get_bd_ports GPIO_O]
# endgroup
# regenerate_bd_layout
# validate_bd_design
WARNING: [BD 5-700] No address spaces matched 'get_bd_addr_spaces -of_objects /processing_system7_0 -filter {path == /processing_system7_0/Data}'
WARNING: [BD 5-699] No address segments matched 'get_bd_addr_segs -of_objects {}'
# generate_target all [get_files  C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd]
Wrote  : <C:\xup\fpga_flow\2016_2_ZYNQ_labs\lab2\lab2.srcs\sources_1\bd\system\system.bd> 
Wrote  : <C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/ui/bd_c954508f.ui> 
Verilog Output written to : C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.gen/sources_1/bd/system/synth/system.v
Verilog Output written to : C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.gen/sources_1/bd/system/sim/system.v
Verilog Output written to : C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.gen/sources_1/bd/system/hdl/system_wrapper.v
INFO: [BD 41-1029] Generation completed for the IP Integrator block processing_system7_0 .
Exporting to file C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.gen/sources_1/bd/system/hw_handoff/system.hwh
Generated Hardware Definition File C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.gen/sources_1/bd/system/synth/system.hwdef
generate_target: Time (s): cpu = 00:00:13 ; elapsed = 00:00:17 . Memory (MB): peak = 1847.855 ; gain = 286.199
# export_ip_user_files -of_objects [get_files C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd] -no_script -force -quiet
# export_simulation -of_objects [get_files C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd] -directory C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.ip_user_files/sim_scripts -force -quiet
# make_wrapper -files [get_files C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/system.bd] -top
# add_files -norecurse C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/hdl/system_wrapper.v
INFO: [Project 1-1716] Could not find the wrapper file C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.srcs/sources_1/bd/system/hdl/system_wrapper.v, checking in project .gen location instead.
INFO: [Vivado 12-12390] Found file C:/xup/fpga_flow/2016_2_ZYNQ_labs/lab2/lab2.gen/sources_1/bd/system/hdl/system_wrapper.v, adding it to Project
# update_compile_order -fileset sources_1
CRITICAL WARNING: [PSU-1]  Parameter : PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 has negative value -0.050 . PS DDR interfaces might fail when entering negative DQS skew values. 
CRITICAL WARNING: [PSU-2]  Parameter : PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1 has negative value -0.044 . PS DDR interfaces might fail when entering negative DQS skew values. 
CRITICAL WARNING: [PSU-3]  Parameter : PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2 has negative value -0.035 . PS DDR interfaces might fail when entering negative DQS skew values. 
CRITICAL WARNING: [PSU-4]  Parameter : PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3 has negative value -0.100 . PS DDR interfaces might fail when entering negative DQS skew values.

 

중간에 코드를 살펴보다보면

Baud Rate와 Clock Rate 설정 과정 또한

포함되어있는 것을 알 수 있다.

(GUI 에서 CLK Rate 를 100으로 항상 바꾸는거 까먹지 말자는 소리)

 

Baud Rate란? [보] : 115200(를 많이 사용), 초당 얼마나 많은 심볼을 보내는가?

https://melonicedlatte.com/2020/04/28/204700.html

 

Baud Rate, Bit Rate란? 개념 정리 - Easy is Perfect

Baud Rate, Bit Rate란? 개념 정리 1. Bit Rate Bit Rate는 초당 데이터 비트(0 or 1)를 얼마만큼 전송할 수 있는지 나타내는 값. BPS(Bit Per Second)로도 나타냄. PCIe나 버스의 데이터 전송 속도를 나타낼 때 주로

melonicedlatte.com

 

Duty Cycle 이란? : 신호의 한 주기에서 신호가 켜져있는 시간의 비율을 백분율로 나타낸 것. 여기선 50%

https://ko.wikipedia.org/wiki/%EB%93%80%ED%8B%B0_%EC%82%AC%EC%9D%B4%ED%81%B4

 

듀티 사이클 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

Step2 : Elaborate the Design

현재의 RTL Schematic을 보면 다음과 같다.

아주 간단하게 PS, PL이 구성된 것을 확인할 수 있다.

 

이 중에서 uart_rx_i0 instance in the schematic diagram은 다음과 같다.

 

Report Noise 기능을 이용하여

Noise > I/O Bank Detail에 대한 Reports를 볼 수 있다.

 

여기서 noise report란 무엇인가?

공식 문서를 참조해본다.

SSN과 관련된 정보를 보기 위해 사용하구나 정도 알고 넘어가자.

https://docs.xilinx.com/r/en-US/ug906-vivado-design-analysis/Report-Noise

 

Report Noise - 2022.1 English

The Report Noise command performs the Simultaneous Switching Noise (SSN) calculation for Xilinx 7 series FPGA devices. By default, the Noise report opens in a new tab in the Noise window area of the Vivado IDE. You can export the results to a CSV or HTML f

docs.xilinx.com

Simultaneous Switching Noise (SSN)

https://m.cafe.daum.net/pcbkim/EdC/10?svc=cafeapi 

 

SSN (Simultaneous Switching Noise)

SSN (Simultaneous Switching Noise)은 신호 주파수가 올라가면서 전압의 +와 -가 급격히 변하게 되고, 그것에 의해 선로의 인덕턴스 성분들의의 변화가 그 변동을 미처 따라가지 못해 발생하는 전압떨..

m.cafe.daum.net

 

새로운 xdc constraints를 추가해준다.

핀을 맵핑해주는데 쓰인다.

# Zybo xdc
# LED [3:0]
# PMOD [JB]
############################
# On-board led             #
############################
set_property -dict { PACKAGE_PIN M14   IOSTANDARD LVCMOS33 } [get_ports { led_pins[0] }]; 
set_property -dict { PACKAGE_PIN M15   IOSTANDARD LVCMOS33 } [get_ports { led_pins[1] }];
set_property -dict { PACKAGE_PIN G14   IOSTANDARD LVCMOS33 } [get_ports { led_pins[2] }];
set_property -dict { PACKAGE_PIN D18   IOSTANDARD LVCMOS33 } [get_ports { led_pins[3] }];
############################
# On-board PMOD JB         #
############################
set_property -dict { PACKAGE_PIN T20   IOSTANDARD LVCMOS33 } [get_ports { led_pins[4] }];
set_property -dict { PACKAGE_PIN U20   IOSTANDARD LVCMOS33 } [get_ports { led_pins[5] }];
set_property -dict { PACKAGE_PIN V20   IOSTANDARD LVCMOS33 } [get_ports { led_pins[6] }];
set_property -dict { PACKAGE_PIN W20   IOSTANDARD LVCMOS33 } [get_ports { led_pins[7] }]; 

# CLK source 125 MHz
set_property -dict { PACKAGE_PIN L16    IOSTANDARD LVCMOS33 } [get_ports { clk_pin }];

# BTN0
set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { btn_pin }];

# Reset - BTN1
set_property -dict { PACKAGE_PIN Y16   IOSTANDARD LVCMOS33 } [get_ports { rst_pin }];

Reload를 해주니.

Unplaced 되었던 Pin들이 Mapped된것을 확인할 수 있다.

 

Step3 : Synthesize the Design

이를 Synthesis 해주자.

 

다음은 Synthesis에 대한 Schematic이다.

위의 RTL level에서 조금 더 Low level로 내려간 것을 볼 수 있다. (= Notice that IBUF and OBUF are automatically instantiated (added) to the design as the input and output are buffered.  There are still four lower level modules instantiated. )

 

현재의 Utilization은 다음과 같다.

 

Report Timing Summary를 통해 보면

Timing Violation이 발생했음을 확인할 수 있다.

구체적으로는 8개의 failing paths가 있음을 알 수 있다.

그 path에 대한 상세 레포트는 다음과 같이 볼 수 있다.

 

Report Utilization을 통해서

Utilization에 대해서도 자세히 확인할 수 있다.

각 모듈에서 몇개의 LUT 또는 FF등이 사용되었는지 레벨까지.

 

Report Power도 볼 수 있다.

 

현재를 CheckPoint로 Write할 수 있다.

dcp 파일 형태로 생긴다.

check point를 저장했으니

synthesis option을 바꾸어서

re-synthesis를 해보자.

synthesis option은 

project manager > settings > synthesis > strategy 로 다룬다.

 

아직 왜 이걸 이렇게 바꾸는지는 모르겠지만

-flatten_hierarchy에서 rebuilt 기본을 full로 바꾼다.

(Area 또는 Performance 이슈라기 보다는 Hierarchy의 이슈 정도로 여겨져서 그런가보다. 하고 넘어간다.)

 

여기서는 비교를 목적으로 하고 있으니

이름에 대한 형상관리 정도는 해준다.

synth_1_copy -> synth_flatten 정도

 

그리고나서 out-of-date 된 ver에 대해 synthesis를 다시 해준다.

음. 그럼에도 불구하고 아직 timing issue가 해소되지 않았다.

(수치조차 바뀌지 않은 것으로 보아, strategy 변경이 잘 적용된것인지 의심이 되기는 한다.)

 

PerfOptimized_High 적용시켜서 해본다.

그래도 바뀌는게 없다 뭔가 이상하다.

 

다시 껐다 켜서 Schematic을 봐도 너무 비효율적이지 않나 싶다.

 

다시 전략변경

바뀌긴 한다.

그래도 타이밍은 해소되지 않는다.

수치조차 동일.

 

제일 안좋은 path

근데 왜 여기만 찍히지? path 전체 나와야 하는거 아닌가.

우선 다시 학습용 문서의 흐름을 따라가보자

여기서도 Flatten 된 Schematic이 요지경인걸 보니 잘못한건 아닌양싶다.

 

다시 flatten으로 option 변경한후, 2번째 checkpoint로 저장하고 넘어가자.

 

Step4 : Read the Checkpoints 

 

opencheckpoint

 

여하튼. 

두 버전에서 

가시적인 차이를 확인할 수 없고

timing violation 문제가 해소되지는 않았지만

 

strategy 전략변경 등 변경이 수반될때

checkpoint를 통해 확인하는 방법에 대해 인지했다. 

 

끝.