Перейти к содержанию
    

Xilinx - Tandem with Field Update

Стоит задача: реализовать конфигурацию ПЛИС (Kintex UltraScale) с интерфейсом PCI-Express,
позволяющую загружать пользовательскую конфигурацию (user-logic), через приложение ПК
посредством PCI-Express. Т.е. при подаче питания в ПЛИС конфигурируется только ядро PCIe (pcie-core),
позволяющее операционной системе сконфигурировать устроство.
Далее, уже GUI-приложение в любой момент загружает user-logic.

 

У меня возникли проблемы. Опишу ход своих действий дабы местные гуру в данном вопросе подсказали,
что я сделал не так. Руководствовался документом PG156:
UltraScale Devices Gen3
Integrated Block for PCI
Express v4.4

 

Сразу скажу, что уже создана обычная конфигурация с pcie-core и user-logic.
Налажено взаимодействие между ядром и логикой, а также между приложением ПК и устройством.
Т.е. проблем с конфигурации самого IP-ядра не было (вернее они были, но решены 🙂 ) - устройство определяется системой при включении.

 

В wizard IP UltraScale Devices Gen3 Integrated Block for PCI Express v4.4 мне следует обратить внимание на следующую опцию:
Tandem Configuration or Partial Reconfiguration, которая предлагает следующие варианты:
- None
- Tandem
- Tandem with Field Update
- PR over PCIe

 

Под пунктом Tandem понимается два варианта: Tandem PROM и Tandem PCIe.

 

Tandem PROM: создается один bitstream, но внутри он логически разделен на pcie-core и user-logic.
Этот bitstream загружается целиком в конфигурационную флеш, посредством программатора или иным способом.
При подаче питания первым делом в ПЛИС загружается pcie-core, чтобы успеть, в установленные стандартом, 100мс.
Далее, загружается user-logic и устройство становится работоспособным. Проверил - все так и есть.

 

Tandem PCIe: создается два bitstream: tandem1 и tandem2.
Tandem1 содержит только pcie-core (на самом деле помимо самого ядра, еще и чуть-чуть окружающей логики) и загружается во флеш.
При подаче питания загружается в ПЛИС pcie-core и устройство становится доступным в операционной системе (распознается).
В любой момент через особый интерфейс MCAP приложение на ПК может загрузить tandem2, содержащий user_logic
и устройство становится работоспособным. Проверил - все так и есть.
Казалось бы - БИНГО, проблема решена! Рано радовался, так как создается битстрима то два, но логически они все равно между
собой жестко связаны. При изменении в проекте что-то, что касается только user-logic и перекомпиляции опять таки
создается два битстрима, и новый tandem2 со старым tandem1 уже не фурычит...

 

Тогда я начал разбираться с Tandem with Field Update: насколько я понял это то, что мне нужно (но это не точно 🙂 ).

 

1.JPG.ccf57a1e4b64e2b6255bf89f011dbf0d.JPG1.JPG.ccf57a1e4b64e2b6255bf89f011dbf0d.JPG

 

1. Сгенерировал IP-корку;
2. Создал template-проект на основе IP Example Design (чтобы уж точно быть уверенным в том, что проект рабочий);
3. При этом создается такой проект, который нужно компилировать в непроектом режиме (non-project).
Т.е. предоставляются скрипты (field_update_scripts), запуская которые проект в нужном нам виде компилируется.
Имеется главный скрипт, который запускает когда нужно остальные скрипты - design_field_updates.tcl
Главное в нем нужно обратить внимание на строки:

 

# Steps for the static portion of the design
set runStaticSynth           1
# Steps for the update version 1 portion of the design dependent on having completed runSynthStatic.
set runUpdateVer1Synth       1
set runUpdateVer1Impl        1
set runUpdateVer1Bitstreams  1
# Steps for the update version 2 portion of the design dependent on having completed runImplUpdateVer1.
set runUpdateVer2Synth       0
set runUpdateVer2Impl        0
set runUpdateVer2Bitstreams  0
# Steps for PR Verify across all Update versions
set runPrVerify              0

 

Т.е. скрипт может создать две конфигурации - Ver1 и Ver2.
Насколько я понял Ver1 - это именно то, что нужно записать во флеш и оно будет стартовать первым, т.е. pcie-core.
Ver2 - это user-logic.
Сначала нужно создать Ver1 записать его на флеш, а потом, проинвертировав флаги скрипта, создать Ver2 - это и будет то,
что нужно загружать посредством PCI-Express.

 

Проделав все, как я думаю, как положено я получил следующие файлы:

 

ver1_tpcie_tandem1.bin
ver1_tpcie_tandem2.bin
ver1_tpcie_update_region_partial.bin
ver1_tpcie_update_region_partial_clear.bin
ver1_tprom.bin
ver1_tprom_update_region_partial.bin
ver1_tprom_update_region_partial_clear.bin
ver1_tpcie_tandem1.bit
ver1_tpcie_tandem2.bit
ver1_tpcie_update_region_partial.bit
ver1_tpcie_update_region_partial_clear.bit
ver1_tprom.bit
ver1_tprom_update_region_partial.bit
ver1_tprom_update_region_partial_clear.bit
ver1_tpcie_write_bitstream.log
ver1_tprom_write_bitstream.log
ver1_tpcie_tandem1.mcs
ver1_tprom.mcs
ver1_tpcie_tandem1.prm
ver1_tprom.prm

 

Насколько я понял, сначала я должен загрузить во флеш ver1_tpcie_tandem1.mcs.
Причем при перезагрузки питания системы, PCIe устройство у меня должно определиться в системе - этого не произошло.
НО! Если я загружаю напрямую в ПЛИС ver1_tpcie_tandem1.bit, а затем перезагружаю на горячую систему (чтобы ОС опросила устройства),
то все ОК - мое устройство определяется. Т.е. pcie-core сформировано верно. Где-то проблема в процессе старта системы. Но где именно я пока не понял.
Может местные гуру - подскажут где я свернул не туда) Ну помимо того, что я в принципе связался с PCIe )))

 

P.S.: Vivado 2018.1 - Kintex UltraScale xcku060

 

 

Изменено пользователем dde29

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выложу архив сгенерированного template-проекта в режиме Tandem with Field Updates

 

https://disk.yandex.ru/d/AI_ZLjtWQkbeXA

 

 В папке field_update_script расположены скрипты для генерации файлов прошивки

В папке Bitstreams находятся уже сгенерированные файлы для Ver1. Это вроде как и должно быть ядро pcie

Но, повторюсь, загружая во флеш файл ver1_tpcie_tandem1.mcs. При сбросе питания загрузки конфигурации в ПЛИС не происходит (пин DONE = 0)

Но, в тоже время загрузив в ПЛИС мимо флеш файл ver1_pcie_tandem1.bit и после горячей перезагрузки ОС - система определяет плату.

Почему не работает вариант с mcs до сих пор не разобрался...

 

Вопрос остановился уже на месте - почему формат MCS не загружается в ПЛИС (DONE = 0, STARTUP_STATE = 0, EOS = 0). Что ему мешает?

 

FLASH BPIx16 подключена к банку 65, к нему же подключен сигнал PERSTN на пин K22

Изменено пользователем dde29

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел косяк, почему загруженная прошивка MCS не конфигурировалась в ПЛИС:

В одном и скрипте generate_bitstreams.tcl нашел фрагмент, описывающий настройки при генерации MCS:

  # BPI Flash Programming
  set_property CONFIG_MODE BPI16 [current_design]
  set_property BITSTREAM.CONFIG.BPI_SYNC_MODE Type1 [current_design]
  set_property BITSTREAM.CONFIG.CONFIGRATE 9 [current_design]
  set_property CONFIG_VOLTAGE 1.8 [current_design]
  set_property CFGBVS GND [current_design]

  # Generate Tandem PCIe Bitstreams
  if { [lsearch -exact $bitstreamTypes "TandemPCIe"] >= 0 } {
    set_property HD.OVERRIDE_PERSIST False [current_design]
    set_property HD.TANDEM_BITSTREAMS Separate [current_design]
    write_bitstream -force -bin_file -file ${outputPrefix}_tpcie > ${outputPrefix}_tpcie_write_bitstream.log
    # Generate Flash Files Example. This must be updated to match your board and flash settings.
    ###############################################################################
    # Flash Programming Example Settings: Modify as required by your design.
    ###############################################################################
    write_cfgmem -force -format mcs -interface bpix16 -size 256 -loadbit "up 0x0 ${outputPrefix}_tpcie_tandem1.bit" ${outputPrefix}_tpcie_tandem1.mcs
  }

Проверил каждую строчку... Смутил режим загрузки:

BITSTREAM.CONFIG.BPI_SYNC_MODE Type1

 

Что это за Type1 вообще. Порылся в документации и нашел описание:

 

Sets the BPI synchronous configuration mode for different types of BPI flash devices.

Disable (the default) disables the synchronous configuration mode.

Type1 enables the synchronous configuration mode and settings to support the Micron G18(F) family.

Type2 enables the synchronous configuration mode and settings to support the Micron (Numonyx) P30 and P33 families.

Моя конфигурационная флеш никак не относилась ни к семейству G18 ни к P30/P33.

Поэтому изменив значение параметра "Type1" на "Disable" и прошивка ver1_tpcie_tandem1.mcs стала правильно загружаться в ПЛИС, сигнал DONE устанавливается в 1 и плата начала определяться в системе...

Буду идти дальше в плане загрузки user-logic в ПЛИС...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...