Tool 'vivado' - fpga-lib/site_scons GitHub Wiki
Переменные сборочного и исполнительно окружения удобно задать в сборочном скрипте:
#-------------------------------------------------------------------------------
#
# Environment
#
envx['ENV']['DISPLAY'] = os.environ['DISPLAY']
envx['ENV']['HOME'] = os.environ['HOME']
envx['ENV']['XILINX'] = env.XILINX
envx['ENV']['MENTOR'] = env.MENTOR
envx['ENV']['MGLS_LICENSE_FILE'] = env.MGLS_LICENSE_FILE
envx['ENV']['XILINX_VIVADO'] = env.XILINX_VIVADO
envx['XILINX_VIVADO'] = env.XILINX_VIVADO
envx['XILINX_HLS'] = env.XILINX_HLS
envx['QUESTABIN'] = env.QUESTABIN
envx['QUESTASIM'] = env.QUESTASIM
envx['VENDOR_LIB_PATH'] = env.VENDOR_LIB_PATH
где env
— объект с параметрами, получаемый:
env = import_config('env.yml')
а конфигурационный файл env.yml
представляет собой нечто подобное:
#
# env.yml
#
parameters:
XILINX : = os.environ['XILINX']
MENTOR : = os.environ['MENTOR']
XILINX_TOOL_VERSION : '2021.2'
QUESTA_TOOL_VERSION : '2021.1'
XILINX_VIVADO : = os.path.join(XILINX, 'Vivado', XILINX_TOOL_VERSION)
XILINX_HLS : = os.path.join(XILINX, 'Vitis_HLS', XILINX_TOOL_VERSION)
MGLS_LICENSE_FILE : = os.path.join(MENTOR, 'license.dat')
QUESTABASE : = os.path.join(MENTOR, QUESTA_TOOL_VERSION, 'questasim')
QUESTABIN : = os.path.join(QUESTABASE, 'bin')
QUESTASIM : = os.path.join(QUESTABASE, 'linux_x86_64', 'vsim')
VENDOR_LIB_NAME : = 'xlib-vv' + XILINX_TOOL_VERSION + '-qs' + QUESTA_TOOL_VERSION
VENDOR_LIB_PATH : = os.path.join(MENTOR, 'vendor', VENDOR_LIB_NAME, 'func')
Из описанных переменных окружения далее строятся все пути к исполняемым файлам внешних инструментов.
#-------------------------------------------------------------------------------
#
# Tool 'vivado'
#
...
VIVADO = os.path.join(env['XILINX_VIVADO'], 'bin', 'vivado')
HLS = os.path.join(env['XILINX_HLS'], 'bin', 'vitis_hls')
...
Name | Description | Default value |
---|---|---|
VIVADO_VERNUM | Номер используемой версии САПР Vivado | version_number(env['XILINX_VIVADO']) |
BUILD_VARIANT | Название сборочного варианта. Содержит имя директории конфигурационных файлов сборочного варианта или путь относительно корневой директории сборочных вариантов (например, относительно <project-root>/src/cfg , если по этому пути располагаются директории конфигурационных файлов сборочных вариантов) |
Отсутствует. Должно быть задано в SConstruct , например: envx['BUILD_VARIANT'] = <path> , где envx — имя сборочного окружения |
VIVADO_PROJECT_NAME | Название проекта САПР Vivado | 'vivado_project' |
TOP_NAME | Имя модуля верхнего уровня | 'top' |
DEVICE | Наименование ПЛИС | 'xc7a200tfbg676-2' |
VIVADO_PROJECT_MODE | Режим работы с САПР. В настоящее время поддерживается только Project Mode | True |
SYNCOM | Команда запуска САПР в пакетном режиме | VIVADO + ' -mode batch ' |
SYNSHELL | Команда запуска САПР в интерактивном режиме | VIVADO + ' -mode tcl ' |
SYNGUI | Команда запуска САПР в графическом режиме | VIVADO + ' -mode gui ' |
HLSCOM | Команда запуска HLS компилятора | HLS |
SYN_TRACE | Опция управления трассировкой команд | ' -notrace' |
SYN_JOURNAL | Опция ведения журнала | ' -nojournal' |
PROJECT_CREATE_FLAGS | Опции, передаваемые Tcl команде create_project . Типовое значение -f (force`), что вынуждает САПР FPGA создавать проект даже если он открыт |
'' |
HLSFLAGS | Флаги компилятора HLS | '' |
VERBOSE | Управляет печатью полной командной строки выполняемого действия | True |
Name | Description | Default value |
---|---|---|
ROOT_PATH | Корневая директория проекта | os.path.abspath(str(Dir('#'))) |
CFG_PATH | Директория текущего сборочного варианта | os.path.abspath(os.curdir) |
CONFIG_SEARCH_PATH | Список путей, по которым осуществляется поиск конфигурационных файлов во время работы сканера (обработка секции import в конфигурационных файлах |
env['CFG_PATH'] |
BUILD_SRC_PATH | Директория, куда помещаются сгенерированные исходные файлы (*.svh, *.tcl) | os.path.join(root_dir, 'build', os.path.basename(cfg_name), 'src') |
BUILD_SYN_PATH | Директория, в которой создаётся исполнительное окружение для синтеза (проект, IP ядра и т.п.) | os.path.join(root_dir, 'build', os.path.basename(cfg_name), 'syn') |
IP_OOC_PATH | Директория для IP ядер, скриптов, библиотеки симуляционных моделей | os.path.join(env['BUILD_SYN_PATH'], 'ip_ooc') |
BD_OOC_PATH | Директория для блочных дизайнов, создаваемых out-of-context | os.path.join(root_dir, 'build', build_variant, 'bd') |
BUILD_HLS_PATH | Директория для создания проектов HLS, скриптов их создания и компиляции и репозитория целевых IP ядер | os.path.join(env['BUILD_SYN_PATH'], 'hls') |
INC_PATH | Список путей, в которых производится поиск включаемых файлов. Поиск автоматически выполняется в директориях, где расположены исходные файлы, и INC_PATH дополняет этот список элементами, в которых исходных файлов нет, но есть включаемые — например, BUILD_SRC_PATH
|
'' |
IP_SCRIPT_DIRNAME | Имя директории, в которую помещаются скрипты для обслуживания IP ядер. Сама директория располагается в IP_OOC_PATH
|
'_script' |
BD_SCRIPT_DIRNAME | Имя директории, в которую помещаются Tcl скрипты создания OOC блочных дизайнов. Сама директория располагается в BD_OOC_PATH
|
'_script' |
SIM_SCRIPT_DIRNAME | Имя директории, где помещаются скрипты для создания симуляционных библиотек IP ядер, блочных дизайнов, HLS IP ядер и т.п. | sim_script |
SIM_SCRIPT_PATH | Директория, содержащая скрипты для создания симуляционных библиотек IP ядер, блочных дизайнов, HLS IP ядер и т.п. | os.path.join(env['BUILD_SYN_PATH'], env['SIM_SCRIPT_DIRNAME']) |
HLS_SCRIPT_DIRNAME | Имя директории, в которую помещаются скрипты для создания и компиляции HLS IP | _script |
HLS_IP_NAME_SUFFIX | Суффикс для имён HLS IP | _hlsip |
Name | Description | Default value |
---|---|---|
CONFIG_SUFFIX | конфигурационные файлы | 'yml' |
TOOL_SCRIPT_SUFFIX | скрипты | 'tcl' |
IP_CORE_SUFFIX | IP ядра | 'xci' |
BD_SUFFIX | Блочные дизайны | 'bd' |
DCP_SUFFIX | Design Checkpoint. Архив, содержащий результат работы САПР: синтезированный проект, разведённый, синтезированное IP ядро и т.п. | 'dcp' |
BITSTREAM_SUFFIX | выходной файл | 'bit' |
CONSTRAINTS_SUFFIX | констрейны | 'xdc' |
VIVADO_PROJECT_SUFFIX | проект Vivado | 'xpr' |
V_SUFFIX | Verilog | 'v' |
SV_SUFFIX | SystemVerilog | 'sv' |
V_HEADER_SUFFIX | Verilog header | 'vh' |
SV_HEADER_SUFFIX | SystemVerilog header | 'svh' |
HLS_TARGET_SUFFIX | HLS IP repository archived item | zip |
USER_DEFINED_PARAMS | Пользовательские параметры, передаваемые на этап создания проекта САПР путём создания соответствующих переменных в скрипте, который создаёт проект Vivado | {} |
Перечислены билдеры и псевдобилдеры. Билдеры как правило не используются напрямую, т.к. они имеют вполне определённый интерфейс запуска, который далеко не всегда удобен, поэтому в скрипте сборочных сценариев используются как правило псевдобилдеры, которые по сути являются "обёртками" вокруг самих билдеров.
True builder
Генерирует Tcl
скрипт, с помощью которого создаётся IP ядро.
Pseudo-builder
Генерирует Tcl
скрипты для создания IP ядер из списка конфигурационных файлов. Создаёт скрипты по схеме <name>-create.tcl
. Использует билдер IpCreateScript
.
Пример использования:
ip = read_sources('ip.yml')
...
IP_Create_Scripts = envx.IpCreateScripts(ip)
True builder
Генерирует скрипт для out-of-context синтеза IP ядра.
Pseudo-builder
Генерирует Tcl
скрипты для синтеза IP ядер из списка конфигурационных файлов. Создаёт скрипты по схеме <name>-syn.tcl
. Использует билдер IpSynScript
.
Пример использования:
ip = read_sources('ip.yml')
...
IP_Syn_Scripts = envx.IpSynScripts(ip)
True builder
Создаёт IP ядро.
Pseudo-builder
Создаёт IP ядра по списку скриптов, сгенерированны с помощью IpCreateScripts
. Использует билдер IpCreate
.
Пример использования:
IP_Cores = envx.CreateIps(IP_Create_Scripts)
True builder
Синтезирует IP ядро в режиме out-of-context.
Pseudo-builder
Синтезирует IP ядра, используя в качестве зависимостей скрипты, созданные IpSynScrips
и файлы самих IP ядер. Использует билдер IpSyn
.
Пример использования:
IP_OOC_Syn = envx.SynIps(IP_Syn_Scripts, IP_Cores)
True builder
Создаёт блочный дизайн на основе Tcl
скрипта, описывающего используемые элементы (cells), их межсоединения и порты. Блочный дизайн создаётся в виде отдельно стоящего Vivado проекта (out-of-context). В дальнейшем блочный дизайн из такого проекта может быть подключен в рабочий проект. Методика подготовки Tcl
скрипта описана по ссылке.
Pseudo-builder
Создаёт проекты с блочными дизайнами на основе списка конфигурационных файлов. Использует BdCreate
билдер.
bd = read_sources('bd.yml')
...
bd_ooc = envx.CreateOocBd(bd)
True builder
Создаёт Tcl
скрипт для создания HLS проекта и его компиляции. Зависимостью является yml
файл параметров HLS. В результате создаётся Tcl
скрипт с командами создания HLS проекта и его компиляции до элемента IP репозитория. Пример целевого скрипта:
--------------------------------------------------------------------------------
#
# This file is automatically generated. Do not edit the file!
#
#--------------------------------------------------------------------------------
set PROJECT_NAME adder
set TOP_NAME adder
set DEVICE xc7a50tftg256-1
set SOLUTION_NAME sol_1
# Project structure
open_project -reset ${PROJECT_NAME}
# Add syn sources
add_files -cflags "-g -DDATA_WIDTH=4" /opt/slon/xilinx/build-system-examples/src/hls/adder/src/adder.cpp
# Add sim sources
add_files -tb -csimflags "-g -I/opt/cad/mentor/2021.1/questasim/include -I/opt/cad/xilinx/Vitis_HLS/2021.2/include" /opt/slon/xilinx/build-system-examples/src/hls/adder/tb/main.cpp
set_top ${TOP_NAME}
# Add solution
open_solution -reset -flow_target vivado ${SOLUTION_NAME}
set_part ${DEVICE}
create_clock -period 8.0ns -name adder_clk
set_clock_uncertainty 25%
# Add hooks
source /opt/slon/xilinx/build-system-examples/src/cfg/7a50t/hls/adder/directives.tcl
csynth_design
export_design -rtl verilog -format ip_catalog -ipname adder -version 1.0 -vendor slon -library hls -output /opt/slon/xilinx/build-system-examples/build/7a50t/syn/hls/ip/adder.zip
exit
#--------------------------------------------------------------------------------
Pseudo-builder
Псевдобилдер, получающий аргументом список конфигурационных HLS yml
файлов и осуществляющий запуск для каждого из них билдера HlsCSynthScript
. Пример использования:
HlsCSynScripts = envx.CreateHlsCSynthScript(hls)
True builder
Билдер выполняет создание HLS проекта и его компиляцию, в результате которой создаётся элемент IP репозитория, пригодный для использования в качестве IP ядра в целевом проекте. Напрямую не используется, вызывается из псевдобилдера LaunchHlsCSynth
(см. ниже)
Pseudo-builder
Служит для запуска создания и компиляции HLS проектов. Пример использования:
HlsCsyn = envx.LaunchHlsCSynth(HlsCSynScripts, hls)
где, HlsCSynScripts
— список скриптов, полученных в результате работы CreateHlsCSynthScript
, hls
— список конфигурационных yml
файлов HLS.
Pseudo-builder
Псевдобилдер осуществляет генерирование скриптов создания IP ядер из HLS IP репозитория, созданного инструментами, описанными выше. Полученные скрипты далее используются точно так же, как и скрипты для синтеза IP ядер, получаемые из конфигурационных yml
файлов IP ядер.
HLS_IP_Syn_Scripts = envx.HlsIpSynScripts(HlsCsyn)
Использование результата:
# IP scripts
IP_Create_Scripts = envx.IpCreateScripts(ip) # скрипты создания IP из yml описания
IP_Syn_Scripts = envx.IpSynScripts(ip) # скрипты синтеза IP
HLS_IP_Syn_Scripts = envx.HlsIpSynScripts(HlsCsyn) # скрипты синтеза HLS IP
# IP cores
IP_Cores = envx.CreateIps(IP_Create_Scripts) # создание IP ядер
All_IP = IP_Cores + HlsCsyn # полный список IP ядер: пользовательских и HLS
All_IP_Syn_Scripts = IP_Syn_Scripts + HLS_IP_Syn_Scripts # скрипты для синтеза всех IP ядер
IP_OOC_Syn = envx.SynIps(All_IP_Syn_Scripts, All_IP) # синтез всех IP ядер
True builder
Создаёт HDL заголовочный файл с параметрами, взятыми из указанных конфигурационных файлов. Если в конфигурационном файле, являющимся зависимостью, определён раздел options
, в котором, в свою очередь, определены параметры prefix
, suffix
, то значения этих параметров конкатенируются с именами рабочих параметров, соответственно до и после:
#
# params.yml
#
...
options:
prefix : PARAMS_
parameters:
DATA : 10
WIDTH : 8
Результат:
`define PARAMS_DATA 10
`define PARAMS_WIDTH 8
Pseudo-builder
Может принимать в качестве зависимостей строку с именами файлов, разделёнными пробелом, или список. Создаёт полный (абсолютный) путь для каждого файла и вызывает билдер CfgParamsHeader
.
Пример использования:
hdl_param_deps = 'main.yml clk.yml'
...
CfgParamsHeader = envx.CreateCfgParamsHeader(os.path.join(envx['BUILD_SRC_PATH'], 'cfg_params.svh'), hdl_param_deps)
True builder
Создаёт Tcl
файл с параметрами, взятыми из указанных конфигурационных файлов. Как и билдер по генерированию включаемых HDL файлов, данный билдер распознаёт раздел options
с параметрами prefix
и suffix
, используя их сходным образом:
#
# dirpath.yml
#
options:
suffix : _DIR
parameters:
SRC_SYN : = '{' + os.path.join('src', 'syn') + '}'
SRC_SIM : = '{' + os.path.join('src', 'sim') + '}'
Результат:
set SRC_SYN_DIR {src/syn}
set SRC_SIM_DIR {src/sim}
Pseudo-builder
Может принимать в качестве зависимостей строку с именами файлов, разделёнными пробелом, или список. Создаёт полный (абсолютный) путь для каждого файла и вызывает билдер CfgParamsTcl
.
Пример использования:
CfgParamsTcl = envx.CreateCfgParamsTcl(os.path.join(envx['BUILD_SRC_PATH'], 'cfg_params.tcl'), 'params.yml')
True builder
Создаёт проект САПР Vivado.
Pseudo-builder
Принимает в качестве зависимостей исходные файлы HDL, файлы констрейнов и IP ядер. Генерирует имя целевого файла, обрабатывает список зависимостей, формируя полные (абсолютные) пути для каждого файла HDL и констрейнов, подготавливает результирующий список и вызывает билдер VivadoProject
. Целевым файлом является <project name>.prj
, который является копией project name>.xpr
. Такое решение используется по той причине, что САПР Vivado в процессе работы постоянно изменяет xpr
файл, что делает его непригодным в качестве цели для системы сборки. С другой стороны, целевой файл должен быть релевантным к изменениям настроек проекта, т.к. система сборки проверяет актуальность файла по MD хэшу. Копия файла проекта достаточно хорошо отвечает вышеперечисленным требованиям.
Пример использования:
xpr_hook = read_sources('xpr_hook.yml')
...
xpr_deps = 'src_syn.yml xdc.yml'.split() + xpr_hook
...
VivadoProject = envx.CreateVivadoProject(xpr_deps , IP_Cores)
True builder
Выполняет синтез проекта. Целевым файлом является <top name>
.dcp, расположенный в <project name>.runs/synth_1
.
Pseudo-builder
Осуществляет подготовку и запуск проекта на синтез. Принимает в качестве зависимостей целевой файл проекта и перечень исходных файлов, который может быть представлен в виде строки с именами файлов, разделёнными пробелом, либо в виде списка. Запускает билдер SynthVivadoProject
.
Пример использования:
src_syn = read_sources('src_syn.yml')
xdc = read_sources('xdc.yml')
...
syn_deps = src_syn + xdc
...
VivadoProject = envx.CreateVivadoProject(xpr_deps , IP_Cores)
...
SynthVivadoProject = envx.LaunchSynthVivadoProject(VivadoProject, syn_deps)
True builder
Производит этапы размещения и разводки проекта (place and route). Целевым файлом является битстрим <project name>.runs/impl_1/<top level>.bit
Pseudo-builder
Выполняет формирование целевого пути и запускает билдер ImplVivadoProject
.
Пример использования:
SynthVivadoProject = envx.LaunchSynthVivadoProject(VivadoProject, syn_deps)
ImplVivadoProject = envx.LaunchImplVivadoProject(SynthVivadoProject)
True builder
Запускает САПР Vivado в графическом режиме с переходом в директорию проекта и загрузкой проекта. При этом проверяются зависимости и при необходимости выполняется сборка по всей цепочке. Типовой сценарий построен так, что при запуске проекта в графическом режиме проверяется актуальность целевого файла проекта и целевых файлов синтезированных IP ядер. Смысл этого в том, чтобы когда проект запущен в графическом режиме, все "пререквизиты" (проект и IP ядра) были в актуальном состоянии, и пользователь сразу мог приступить к синтезу проекта, не ожидая завершение посторонних заданий (которые в том числе "засоряют" лог сообщений), и, самое главное, чтобы всё требуемое было в актуальном состоянии, чтобы пользователю не нужно было следить за этим, поменяв тот или иной параметр сборочного варианта.
Pseudo-builder
Запускает билдер OpenVivadoProject
с фиктивной целью, что вынуждает билдер всегда включать цель в граф зависимостей как находящуюся в неактуальном состоянии.
Пример использования:
VivadoProject = envx.CreateVivadoProject(xpr_deps , IP_Cores)
...
OpenVivadoProject = envx.LaunchOpenVivadoProject(VivadoProject)