Jump to content

    
Sign in to follow this  
Kronac

XILINX Kintex Ultrascale Vivado 18.3 Как правильно настроить interconnect для PCIe и DDR4?

Recommended Posts

  Добрый день. Долго работал с Intel (Altera) бед не знал в среде Quartus и вот пришлось перейти (к глубокому сожалению) на работу с Xilinx... Сразу был разочарован, многое из того, что доведено до автоматизма у Intel тут нужно делать самому, вникая в низкоуровневые тонкости. Очень большие ограничения на использования ip-ядер (плюс скудный набор изменяемых параметров) и плохие тайминги заводят меня в тупик. Так вот, какова суть проблемы.

  Работаю с Kintex Ultrascale. Понадобилось собрать систему из ядра PCIe -> interconnect ->DDR4. Прочитал кучу мануалов (PG194 v3.0, PG059 и тд..,  Ответы с форумовВидео пример настройки, Вивадовские примеры). В общем собрал систему похожую на систему из примеров.

Рис. 1 

image.thumb.png.3be785aa73e8140f16c9681f7536fc8d.png

Тут добавил ещё Jtag консоль для удобства отладки (в дальнейшем необходимо заменить её на свой блок ДМА), вывел интерфейсы для своих слейвов наружу. ДДР тоже вывел наружу (как S_DDR) на верхнем уровне закольцевал и вернул обратно (как M_DDR, опять же дикость связанная с XILINX пришлось решать одну из его проблем таким образом). Повесил ещё пару ИЛА для отладки и отображения шины АXI. Назначил адресные пространства. 

Рис. 2

image.thumb.png.0823dbffc51bd184a21d6d18dc90444d.png

Вроде всё задышало. Но с большими слеками на интерконнекте... То PCIe сама развестись  не может, то на ядре ДДР какие то проблемы по таймингам. В общем всё плохо, но как то работает. По PCIe есть доступ и к DDR и к регистрам в слейвах, вроде всё корректно. Начинаю работать через  Jtag консоль (в дальнейшем её нужно заменить своим блоком ДМА) и всё, ДДР не читается не пишется, комп умирает, интерконнект виснет. Проблема только при обращении к ДДР, при работе с моими слейвами регистровыми проблем нет, данные корректно пишутся и читаются. Залез по ИЛА и увидел что от ДДР не доходит сигнал  BVALID и BID через интерконнект. Собственно из ДДР он вышел, но через интерконнект до второго мастера он не приходит, а для первого без проблем, всегда всё хорошо. Окей, меняю местами Jtag и PCIe та же шляпа. Jtag работает корректно, до PCIe не доходит BVALID и BID. Получается что второму мастеру по счёту просто не даётся доступ к ДДР. Листал форумы, читал советы, нашёл. Говорят что на Ultrascale и Ultrascale+ стандартный интерконнект не работает корректно, нужно ставить некий "SMARTCONNECT"... Ну окей.. читаю документацию, разбираюсь, вставляю смартконнект.. А у него оказывается выкидывает все ID(r/w/b) на шине AXI. Чтобы ID не выкидывались, ставьте "axi sideband" (говорит XILINX) до и после интерконнекта на каждой шине.. окей, поставил. Спустя все эти манипуляции я получил рабочую схему, которая может работать с двумя мастерами и без проблем читать и писать в ДДР. 

  Рис. 3

image.thumb.png.891619408d7f9e1b14705d0036bbda60.png

Но эта штука разводится очень плохо. Сложность в том, что у AXI PCIe максимальная частота 250МГц, у ДДР в моём режиме (1200МГц частота памяти) AXI DDR 300МГц. Слейвы свои на такой частоте я не потяну, иначе вообще всё по таймингам умрёт... пришлось ставить в 2 раза меньше. Поставил 150МГц на слейвах. В итоге интерконнект городит очень сложную структуру из ядер клоковых конвертеров, конвертеров данных, протоколов и тд.. А потом при имплементации на эти же ядра и ругается Вивадо. Долго бьюсь над этой проблемой, не могу нормально побороть слеки. Пришлось понизить частоту ДДР до 1000МГц, соответственно AXI DDR стала 250Мгц, а частота моих слейвов 125 МГц. Слеки явно улучшились, работать можно, но проблема совсем не ушла. 

  Как мне правильно настроить систему, чтобы не было конфликтов между ядер XILINX и всё нормально разводилось при требуемых параметрах?

Edited by Kronac

Share this post


Link to post
Share on other sites
26 minutes ago, alexadmin said:

Вы уже нашли в advanced настройках интерконнектов настройки конвейеризации? По каждому порту отдельно.

Может быть нашёл, как именно она называется? возможно я уже её использую..

Сейчас в смартконнекте такая структура:

image.thumb.png.094cbd82693fd39f5ab0a17fc8ba4580.png

Настройки для PCIe (250МГц) :

Вкладка "Fuctional" -

image.thumb.png.f03653e9238d2def22888849ed187e0c.png

image.thumb.png.cd74a7d2b573d1885ca07b4712f6254d.png

Вкладка "Timing" - 

image.thumb.png.19efce4fc32416011349ff14539765ff.png

 

 

Настройки для ДМА (Jtag уже заменил, работаю со своим блоком ДМА на частоте слейвов 125МГц):

Вкладка "Fuctional" -

image.thumb.png.d2e75c3d294b97d66c10a7b772b2084b.png

image.thumb.png.b6754d45bee04c9351909d5801d00732.png

Вкладка "Timing" - 

image.thumb.png.76db43898e463b8ebdda83321f329f2b.png

 

И сам Смартконнект (250МГц):

image.thumb.png.0e6b55903ce284c7865861920f2152cb.png

 

Буду рад, если подскажете, что я не так настроил =)

 

image.png

Share this post


Link to post
Share on other sites

Приветствую!

3 hours ago, Kronac said:

Добрый день. Долго работал с Intel (Altera) бед не знал в среде Quartus и вот пришлось перейти (к глубокому сожалению) на работу с Xilinx... Сразу был разочарован, многое из того, что доведено до автоматизма у Intel тут нужно делать самому, вникая в низкоуровневые тонкости. Очень большие ограничения на использования ip-ядер (плюс скудный набор изменяемых параметров) и плохие тайминги заводят меня в тупик. Так вот, какова суть проблемы.

Простой совет - не разобравшись не ругайте,  мне  вот наоборот - после перехода  с Vivado на Qu  тоже иногда выть хочется :dash3:

Много  работал с PCIe,  Interconnect, DDR, DMA, ...  в Vivado.  И не могу сказать  что там все так плохо. Естественно (как в любой системе) есть свои особенности и их нужно понимать  чтобы не было неприятных "сюрпризов".

Вы ваш дизайн моделировали в симе?  Потому как в симе гораздо легче понять почему что то не так работает.  Чаще всего проблемы с interconnect-ом в том что забываешь правильно работать с протоколом AXI.  

По поводу таймингов с DDR шины -  можно/нужно включить/добавить AXI register  или  FIFO данных на входе/выходе interconnect,  но простейший способ упростить себе жизнь это увеличить разрядность шины данных в interconnect ядре с соответствующим понижением частоты  шины.  

 

Удачи! Rob. 

Share this post


Link to post
Share on other sites
15 minutes ago, RobFPGA said:

Приветствую!

Простой совет - не разобравшись не ругайте,  мне  вот наоборот - после перехода  с Vivado на Qu  тоже иногда выть хочется :dash3:

Много  работал с PCIe,  Interconnect, DDR, DMA, ...  в Vivado.  И не могу сказать  что там все так плохо. Естественно (как в любой системе) есть свои особенности и их нужно понимать  чтобы не было неприятных "сюрпризов".

Вы ваш дизайн моделировали в симе?  Потому как в симе гораздо легче понять почему что то не так работает.  Чаще всего проблемы с interconnect-ом в том что забываешь правильно работать с протоколом AXI.  

По поводу таймингов с DDR шины -  можно/нужно включить/добавить AXI register  или  FIFO данных на входе/выходе interconnect,  но простейший способ упростить себе жизнь это увеличить разрядность шины данных в interconnect ядре с соответствующим понижением частоты  шины.  

 

Удачи! Rob. 

Я понимаю, что на вкус и цвет все фломастеры разные и каждому своё. Я новичок в Vivado, очень многого ещё не знаю, только изучаю. Но многие сложности мне кажутся просто не обоснованными =) 

Дизайн разумеется моделировали, верификатор сидит специально для этих целей, отработку протокола AXI от и до проверяет разными тестами, тут затыка точно нет. Все какие были, давно устранены. С таймингами в старом интерконекте когда работал ставил "other slise registers" на выходе и пакетную фифошку 512deep на входе мастеров. Лучше не становилось.  Сама шина данных интерконнекта (XBAR который) 256, куда уж больше накручивать? Опора для интерконнекта частота AXI DDR (250МГц).

Share this post


Link to post
Share on other sites

Приветствую!

1 minute ago, Kronac said:

Сама шина данных интерконнекта (XBAR который) 256, куда уж больше накручивать? Опора для интерконнекта частота AXI DDR (250МГц).

Как куда? - 512, 1024 бит.  :biggrin:

У меня несколько систем построенных на Kintex и Kintex US c PCIe Gen3 x8 и несколькими DDR4 контроллерами.  И ни на одной не помню таких проблем с обычным interconnect.
Ядро interconnect обычно на частоте PCIe 250 MHz. Разрядность ядра выбирается  чтобы был запас по общей пропускной полосе. Если получается много портов то не|слабо-связанные порты выделяются в отдельный interconnect.

 

Удачи! Rob. 

Share this post


Link to post
Share on other sites
3 hours ago, Kronac said:

Может быть нашёл, как именно она называется? возможно я уже её использую..

Вкладка "Timing" -

Вот все эти _pipe - это оно и есть. В Interconnect'е там совсем наглядно, в Smartconnect в виде вот такой таблицы параметров, там надо вдумчиво читать какой параметр за что отвечает.

Share this post


Link to post
Share on other sites
1 hour ago, RobFPGA said:

Приветствую!

Простой совет - не разобравшись не ругайте,  мне  вот наоборот - после перехода  с Vivado на Qu  тоже иногда выть хочется :dash3:

Много  работал с PCIe,  Interconnect, DDR, DMA, ...  в Vivado.  И не могу сказать  что там все так плохо. Естественно (как в любой системе) есть свои особенности и их нужно понимать  чтобы не было неприятных "сюрпризов".

Вы ваш дизайн моделировали в симе?  Потому как в симе гораздо легче понять почему что то не так работает.  Чаще всего проблемы с interconnect-ом в том что забываешь правильно работать с протоколом AXI.  

По поводу таймингов с DDR шины -  можно/нужно включить/добавить AXI register  или  FIFO данных на входе/выходе interconnect,  но простейший способ упростить себе жизнь это увеличить разрядность шины данных в interconnect ядре с соответствующим понижением частоты  шины.  

 

Удачи! Rob. 

"Много  работал с PCIe" Если не затруднит, могу тогда ещё закидать вопросами? =) В Альтере можно на PCIe делать несколько мастеров, чтобы обращаться из ОС по разным окнам памяти к ДДР (обычно одно для записи используют, другое для чтения). Окна обычно создают небольшого размера в 4 мегабайта и обращаясь по AXI CTL можно менять базовый адрес окна, тем самым сдвигаясь по памяти ДДР за пределы окна в 4 МБ. Тут я не нашёл такого регистра. Есть только константа базового адреса, которую мы задаём в настройках ядра во вкладке "PCIe:BARs" 

image.thumb.png.ad35d3e7a0ea3f260973e9a4eecff90f.png

Поменять этот базовый адрес на ходу, не нашёл как. На форумах ребята пишут, что если нужен полный доступ к памяти ДДР, создавайте бар на 8ГБ или 2 по 4ГБ и радуйтесь. Мне такой вариант не подходит...  Пришлось хитрить костылями. Создал два бара (BAR2 и BAR3 на картинке выше) Задал размер им в 4 МБ. На верхнем уровне создал у себя два регистра базовых адреса для окон. Вывел шину AXI на ружу и там асинхронно подменяю старшую часть адреса записи и чтения ДДР из своих регистров базового адреса. Таким образом могу пользуясь барами по 4МБ иметь полный доступ ко всей памяти ДДР. Но подход костыльный и не совсем правильный. Можете подсказать более правильное решение?

31 minutes ago, RobFPGA said:

Приветствую!

Как куда? - 512, 1024 бит.  :biggrin:

У меня несколько систем построенных на Kintex и Kintex US c PCIe Gen3 x8 и несколькими DDR4 контроллерами.  И ни на одной не помню таких проблем с обычным interconnect.
Ядро interconnect обычно на частоте PCIe 250 MHz. Разрядность ядра выбирается  чтобы был запас по общей пропускной полосе. Если получается много портов то не|слабо-связанные порты выделяются в отдельный interconnect.

 

Удачи! Rob. 

У PCIe потолок 256 бит, если увеличить шину, интерконнект будет городить более сложную систему из конвертеров данных что значительно ухудшит тайминги... Пробовал так уже.

"И ни на одной не помню таких проблем с обычным interconnect" а сколько было мастеров, пишущих в DDR?

image.thumb.png.5db6e303b7a8b2878b472ac5b9dd4e90.png

Edited by Kronac

Share this post


Link to post
Share on other sites

Приветствую!

17 minutes ago, Kronac said:

Вывел шину AXI на ружу и там асинхронно подменяю старшую часть адреса записи и чтения ДДР из своих регистров базового адреса. Таким образом могу пользуясь барами по 4МБ иметь полный доступ ко всей памяти ДДР. Но подход костыльный и не совсем правильный. Можете подсказать более правильное решение?

Не понимаю  почему такой подход "костыльный и не правильный"? Когда это за вас это делает корка PCIe это правильно, а самому  сделать так же (или еще лучше) это костыльно и неправильно? 

Вообще  то "оконный"  доступ  к диапазону адресов это пережиток прошлого.  Зачем суетится с переключением страниц  когда можно выделить для BAR*  пространство в несколько GB  для  всей внутренней памяти и не парится.
Если конечно материнка поддерживает такое выделение  :wink2:  А то у меня  была  уже печальная история с таким выделением. 
Ну а если очень  хочется страницы  то  вы всегда можете  добавить свой AXI  mapper модуль с нужным  функционалом ("костыльным и неправильным" :wink2: ).     

 

Удачи!  Rob.

Share this post


Link to post
Share on other sites
3 minutes ago, RobFPGA said:

Приветствую!

Не понимаю  почему такой подход "костыльный и не правильный"? Когда это за вас это делает корка PCIe это правильно, а самому  сделать так же (или еще лучше) это костыльно и неправильно? 

Вообще  то "оконный"  доступ  к диапазону адресов это пережиток прошлого.  Зачем суетится с переключением страниц  когда можно выделить для BAR*  пространство в несколько GB  для  всей внутренней памяти и не парится.
Если конечно материнка поддерживает такое выделение  :wink2:  А то у меня  была  уже печальная история с таким выделением. 
Ну а если очень  хочется страницы  то  вы всегда можете  добавить свой AXI  mapper модуль с нужным  функционалом ("костыльным и неправильным" :wink2: ).     

 

Удачи!  Rob.

Вы сами и ответили на этот вопрос =) У меня комп не включается и кричит при таком раскладе =)

Share this post


Link to post
Share on other sites

DsПриветствую!

23 minutes ago, Kronac said:

Вы сами и ответили на этот вопрос =) У меня комп не включается и кричит при таком раскладе =)

Ну тогда либо "костыльное"  решение - либо работа через PCIe c помощью DMA - что обычно быстрее чем непосредственный доступ к внутренней памяти.   Но это уже больше вопросы системного проектирования.

 

54 minutes ago, Kronac said:

У PCIe потолок 256 бит, если увеличить шину, интерконнект будет городить более сложную систему из конвертеров данных что значительно ухудшит тайминги... Пробовал так уже.

Вы не поняли -   поднимать разрядность  нужно для ядра interconnect,  а не портов.  Фактически при этом interconnect добавит  на входе  AXI width converter  и затем сделает коммутацию  широкой шины. 
На каждом порте вы можете поставить любую разрядность и частоту, а также задать  разрядность и частоту  ядра интерконнекта.  То есть  можно порт в 256 бит коммутировать ядром 8 бит разрядности, а можно 8 бит порт  коммутировать ядром с разрядностью в 1024 бит.  

Конвертор  разрядности это просто FIFO и мне трудно  представить что обычное FIFO на 250 MHz создает вам такие проблемы в Kintex US. 

     

55 minutes ago, Kronac said:

а сколько было мастеров, пишущих в DDR?

По разному - от пары  до  десятка, с разной разрядностью и частотой портов. 

 

Удачи! Rob.    

Share this post


Link to post
Share on other sites
44 minutes ago, RobFPGA said:

DsПриветствую!

Ну тогда либо "костыльное"  решение - либо работа через PCIe c помощью DMA - что обычно быстрее чем непосредственный доступ к внутренней памяти.   Но это уже больше вопросы системного проектирования.

 

Вы не поняли -   поднимать разрядность  нужно для ядра interconnect,  а не портов.  Фактически при этом interconnect добавит  на входе  AXI width converter  и затем сделает коммутацию  широкой шины. 
На каждом порте вы можете поставить любую разрядность и частоту, а также задать  разрядность и частоту  ядра интерконнекта.  То есть  можно порт в 256 бит коммутировать ядром 8 бит разрядности, а можно 8 бит порт  коммутировать ядром с разрядностью в 1024 бит.  

Конвертор  разрядности это просто FIFO и мне трудно  представить что обычное FIFO на 250 MHz создает вам такие проблемы в Kintex US. 

     

По разному - от пары  до  десятка, с разной разрядностью и частотой портов. 

 

Удачи! Rob.    

Вот так как Вы пишите я и пробовал изначально, начитавшись мануалов. С радостью впихнул слейвы на 32 бита, надеясь на конвертеры, JTAG консоль на 32 бита данных и тд.. в итоге становилась настолько сложная система из конвертеров данных и клоков, что вивада загнулась.. Огромные слеки на переходах различных конвертеров внутри ядра интерконнекта привели к тому, что терялись биты данных при чтении или записи в регистры или память.. Методом проб и ошибок пришёл к тому, что на разрядности шины в 256 бит у всех мастеров и слейвов (кроме AXI CTL только там остался конвертер, так как там AXI LITE) и при определённых клоках вся структура стабильно задышала без потери данных. Но в дальнейшем мне нужно будет повышать частоту работы ДДР до 1200, а следовательно от этого изменятся все частоты AXI и опять вернётся проблема с потерей данных. Как мне добиться максимальной производительности без потери скорости?

Даже сейчас при шине 256 бит и при пачках данных в 256 задержка по чтению между ARVALID и ARLAST 320 тактов а по записи между AWVALID и BVALID 300 тактов. При конвертерах это число увеличится

Share this post


Link to post
Share on other sites

Приветствую!

3 hours ago, Kronac said:

...

Даже сейчас при шине 256 бит и при пачках данных в 256 задержка по чтению между ARVALID и ARLAST 320 тактов а по записи между AWVALID и BVALID 300 тактов. При конвертерах это число увеличится

Вот   это как раз  и есть вопросы  системного проектирования.  Надо  четко понимать что куда  шлется,  каким траффиком,  что более критично (полоса или latency) и.т.п. и.т.д.
320/300 тактов  latency при пакете в 256 слов это значит  latency всего 64/44 такта с учетом  latency собственно interconect так и самого DDR контроллера. Вполне нормальная цифра.  Но запросы на чтение как и на запись можно слать конвеєром чтобы не терять пропускную. Опять же если требуются работать  с блоками данных  может  выгоднее использовать DMA для пересылки в/из PC. 

3 hours ago, Kronac said:

Но в дальнейшем мне нужно будет повышать частоту работы ДДР до 1200, а следовательно от этого изменятся все частоты AXI и опять вернётся проблема с потерей данных.

Что бы освежить в памяти посмотрел один из своих старых проектов -  KintexUS xcku085-2,  DDR4-1600 72 бит - шина данных 512 бит 200 MHz,   6 портов interconnect - 2 отдельных только на чтение и запись по 512 бит,  один полный 512 бит,  один полный 256 бит к interconnect c PCIe (а также с JTAG мастером,  подсистемой MCU,...),  и два полных на 128 и 32 бит.  И я не помню проблем в этом проекте c interconnect.   

Если есть  слаки нужно  в любом случае понимать откуда они вылазят.  Може вы так "растягиваете" свою логику по кристаллу что физически interconnect не развести. Может на вход interconnect из вашей логики длинная критика идет.  Может  еще что ... .  

 

Удачи!  Rob.

Share this post


Link to post
Share on other sites
1 час назад, RobFPGA сказал:

KintexUS xcku085-2,  DDR4-1600 72 бит - шина данных 512 бит 200 MHz,

Доброго времени суток! А можете озвучить версию Vivado, в которой собирался данный проект? Уж очень красиво всё выглядит.

Были под Stratix V и Arria 10 подобные системы, тоже всё собиралось, а вот Vivado под Kintex US не тянет.

Share this post


Link to post
Share on other sites

Приветствую!

26 minutes ago, warrior-2001 said:

Доброго времени суток! А можете озвучить версию Vivado, в которой собирался данный проект? Уж очень красиво всё выглядит.

Были под Stratix V и Arria 10 подобные системы, тоже всё собиралось, а вот Vivado под Kintex US не тянет.

Приведенный проект пережил несколько версий - с 2017.3 до 2018.3.  

 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this