Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реализация PCI-E x4 на Virtex5
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
L_Konstantin
Имеется собственная плата с FPGA Virtex5, устанавливается в слот PCI-E x4.
В операционке (Винда) собственный драйвер.

При передаче данных по DMA (устройство в режиме master) только в одну сторону, либо операции передачи данных в ПК, либо из ПК, все работает отлично.

Но захотелось большего, и решили запустить full-duplex. И вот здесь возникла проблема: портятся данные, которые приходят из устройства в ПК.
Причем при проведении теста (заполнение памяти устройства константой и ее вычитывание), приложение на компе получает просто странные данные, никаким образом не коррелирующие с исходными. Причем в ChipScope, при попытке обнаружить передачу в EndPoint не заданной константы, этого не обнаружено, что заставляет думать о проблеме с Endpoint либо с его конфигурацией и параметрами...

Есть ли у кого опыть запуска PCIe ядра в дуплексном режиме?
Methane
Цитата(L_Konstantin @ Feb 18 2011, 12:57) *
Есть ли у кого опыть запуска PCIe ядра в дуплексном режиме?

У меня нормально работало. Альтера.
А вычитывание регистров итд нормально работало?

Между прочим, а что такое фулл-дуплекс? Кто запросы выдавал, компетишены получал?
L_Konstantin
Цитата(Methane @ Feb 18 2011, 17:22) *
У меня нормально работало. Альтера.
А вычитывание регистров итд нормально работало?

Между прочим, а что такое фулл-дуплекс? Кто запросы выдавал, компетишены получал?


Обращение к BAR - проблем не замечено.
Контроллер TLP уровня и, соответсвенно, разбирание всех пакетов - собственный компонент.

Немного не понял вопрос, поэтому попробую уточнить: когда происходит копирование потоков данных через DMA в память хоста, либо чтение из нее - все ОК.
Проблемы именно когда происходят одновременные операции записи по DMA и чтения - это я и называю Full-Duplex...
DmitryR
Может разведено криво, и TX/RX пары наводят друг на друга?
Methane
Цитата(L_Konstantin @ Feb 18 2011, 13:34) *
Обращение к BAR - проблем не замечено.
Контроллер TLP уровня и, соответсвенно, разбирание всех пакетов - собственный компонент.

Аналогично делал.

Цитата
Немного не понял вопрос, поэтому попробую уточнить: когда происходит копирование потоков данных через DMA в память хоста, либо чтение из нее - все ОК.
Проблемы именно когда происходят одновременные операции записи по DMA и чтения - это я и называю Full-Duplex...

Все равно не понял. У меня одновременно пахало и чтение и запись. Как данные в FIFO появлялись на burst максимальной длинны, они отправлялись в хост. Когда в FIFO появлялось место на полный burst на чтение, на хост отправлялся запрос на чтение и когда приходил компетишен, он отправлялся в FIFO.

Поясните что у вас.

Цитата(DmitryR @ Feb 18 2011, 13:49) *
Может разведено криво, и TX/RX пары наводят друг на друга?

Сильно сомневаюсь.
L_Konstantin
Цитата(Methane @ Feb 18 2011, 18:22) *
Все равно не понял. У меня одновременно пахало и чтение и запись. Как данные в FIFO появлялись на burst максимальной длинны, они отправлялись в хост. Когда в FIFO появлялось место на полный burst на чтение, на хост отправлялся запрос на чтение и когда приходил компетишен, он отправлялся в FIFO.

Поясните что у вас.


У меня два потока данных: устройство одновременно занимается видеозахватом (входной поток порядка 500 Мбит/с) и воспроизведение другого видео из хоста (поток порядка 250 МБис/с).
Соответственно это совершенно независимые потоки - на уровне драйвера они также существуют параллельно.

Первоначально можно было сделать либо видеозахват на все 500 Мбис, либо 250 видеозахват и 250 воспроизведение.
Поэтому Full-Dulpex и необходим чтобы загрузить железку по полной.
Methane
Цитата(L_Konstantin @ Feb 18 2011, 17:38) *
У меня два потока данных: устройство одновременно занимается видеозахватом (входной поток порядка 500 Мбит/с) и воспроизведение другого видео из хоста (поток порядка 250 МБис/с).
Соответственно это совершенно независимые потоки - на уровне драйвера они также существуют параллельно.

На чтение, как именно у вас реализовано? Сколько тегов использовано?

Цитата
Первоначально можно было сделать либо видеозахват на все 500 Мбис, либо 250 видеозахват и 250 воспроизведение.
Поэтому Full-Dulpex и необходим чтобы загрузить железку по полной.

Нет в PCIе такой штуки как фул или халф дуплекс.
L_Konstantin
Цитата(Methane @ Feb 18 2011, 22:17) *
На чтение, как именно у вас реализовано? Сколько тегов использовано?


у меня контроллер TLP представляет собой 2 state-машины (одна на прием данных с шины, вторая на передачу) и собственно арбитра, который обслуживает клиентов (чтения и записи).

Чтение данных из хоста выполняется по классическом схеме: запрос на чтение памяти (RdReq), а затем девайсу приходят пакеты (Cmpl) с запрошенными данными.
Записть данных в хост - просто запись в память по схеме master.

Все транзакции по 4МБ (1024 страницы) для получения максимальной производительности.

Methane
Цитата(L_Konstantin @ Feb 18 2011, 18:52) *
Все транзакции по 4МБ (1024 страницы) для получения максимальной производительности.

1111493779.gif
Это как? Один запрос на 4 мегабайта? (как оно в заголовок влезло?)
dmitry-tomsk
Цитата(L_Konstantin @ Feb 18 2011, 14:57) *
Имеется собственная плата с FPGA Virtex5, устанавливается в слот PCI-E x4.
В операционке (Винда) собственный драйвер.

При передаче данных по DMA (устройство в режиме master) только в одну сторону, либо операции передачи данных в ПК, либо из ПК, все работает отлично.

Но захотелось большего, и решили запустить full-duplex. И вот здесь возникла проблема: портятся данные, которые приходят из устройства в ПК.
Причем при проведении теста (заполнение памяти устройства константой и ее вычитывание), приложение на компе получает просто странные данные, никаким образом не коррелирующие с исходными. Причем в ChipScope, при попытке обнаружить передачу в EndPoint не заданной константы, этого не обнаружено, что заставляет думать о проблеме с Endpoint либо с его конфигурацией и параметрами...

Есть ли у кого опыть запуска PCIe ядра в дуплексном режиме?

Есть на ML506 на x1. Всё работает. А какое железо испольуется? Если сомнения в железе, могу помочь. Высылайте свой ucf файл, сгенерю тестовую прошивку, тестовая программа у меня под windows (jungo windriver). Правда я сам на x4 не тестировал, железа такого пока нет.
L_Konstantin
Цитата(Methane @ Feb 18 2011, 23:51) *
1111493779.gif
Это как? Один запрос на 4 мегабайта? (как оно в заголовок влезло?)


неправильно выразился...
запросы конечно по 4К, но у меня есть у меня есть 1024 адреса страниц (заранее подготовленных) и соответственно я их обрабатываю за раз - блок получается 4 МБ....
Methane
Цитата(L_Konstantin @ Feb 19 2011, 06:07) *
неправильно выразился...
запросы конечно по 4К,

На 99.9% не правильно.
dmitry-tomsk
Цитата(Methane @ Feb 19 2011, 08:12) *
На 99.9% не правильно.

Почему не правильно, в режиме scatter/gather мой контроллер тоже со страницами работает.
Methane
Цитата(dmitry-tomsk @ Feb 20 2011, 14:31) *
Почему не правильно, в режиме scatter/gather мой контроллер тоже со страницами работает.

Запросами какой длинны?
dmitry-tomsk
Цитата(Methane @ Feb 20 2011, 15:40) *
Запросами какой длинны?

запросы со страницами не связаны, они равны mps или mrs. Страницы нужны потому что windows больше мегабайта непрерывный кусок памяти выделять отказывается.
Methane
Цитата(dmitry-tomsk @ Feb 20 2011, 14:43) *
запросы со страницами не связаны, они равны mps или mrs.

Что такое mps, mrs? в корке альтеровской есть регистр, в котором максимальный размер запроса.

Цитата
Страницы нужны потому что windows больше мегабайта непрерывный кусок памяти выделять отказывается.

page, вообще-то 4килобайта. и пересекать ее нельзя. И линух тоже больше чем сколько-то не дает (не помню сколько) но это можно побороть.
dmitry-tomsk
Цитата(Methane @ Feb 20 2011, 15:52) *
Что такое mps, mrs? в корке альтеровской есть регистр, в котором максимальный размер запроса.


page, вообще-то 4килобайта. и пересекать ее нельзя. И линух тоже больше чем сколько-то не дает (не помню сколько) но это можно побороть.

mps - max payload size, mrs - max read size, определяются чипсетом (root complex), для большинства чипсетов 128 байт. За пересечением границ должен следить автомат, формирующий запросы.
Methane
Цитата(dmitry-tomsk @ Feb 20 2011, 17:50) *
mps - max payload size, mrs - max read size, определяются чипсетом (root complex), для большинства чипсетов 128 байт. За пересечением границ должен следить автомат, формирующий запросы.

Ок. Оба этих значения кратны степени двойки, ответ на мемори реад реквест может быть побит на несколько транзакций (компетишионов). За пересечением следить не нужно, если начало буфера для DMA задать на границе 4х килобайт.
ZAO
Цитата(L_Konstantin @ Feb 18 2011, 13:57) *
Имеется собственная плата с FPGA Virtex5, устанавливается в слот PCI-E x4.

И вот здесь возникла проблема: портятся данные, которые приходят из устройства в ПК.

Есть ли у кого опыть запуска PCIe ядра в дуплексном режиме?

Сталкивался с такой проблемой. Ошибка возникала в тракте буферизации данных направляемых на ПК. Решил за счет уменьшения тактовой частоты до 125 Мгц и соответственно увеличения размера шины данных до 64 бит.
L_Konstantin
Цитата(ZAO @ Feb 21 2011, 14:01) *
Сталкивался с такой проблемой. Ошибка возникала в тракте буферизации данных направляемых на ПК. Решил за счет уменьшения тактовой частоты до 125 Мгц и соответственно увеличения размера шины данных до 64 бит.


А уточните пожалуйста, в каком именно месте у вас возникали временные гонки?

У меня и так частота 125 МГц (раньше 250 была) и ширина данных 64 бита.
Буду пытаться обвешивать constrains-ами тракт данных (хотя и так вроде они написаны) - вдруг получится чего...
D-Luxe
Какая у тя плата? Посоветуй какую-нибудь плату Xilinx с PCI-E?
L_Konstantin
Цитата(D-Luxe @ Feb 22 2011, 18:48) *
Какая у тя плата? Посоветуй какую-нибудь плату Xilinx с PCI-E?


Плата собственного производства (ну точнее разработка своя, а изготовление - Тайвань).

Когда игрались с X1 то была тестовая плата от Xilinx на базе spartan с софтверным ядров и физическом уровне PCI-E на Philips.
Bad0512
Цитата(L_Konstantin @ Feb 24 2011, 09:24) *
Плата собственного производства (ну точнее разработка своя, а изготовление - Тайвань).

Когда игрались с X1 то была тестовая плата от Xilinx на базе spartan с софтверным ядров и физическом уровне PCI-E на Philips.

Там у тебя должен быть арбитр между твоей корой и собственно писиайным ядром. Он должен разруливать три потока (target read completion, master read request и master write data).
И в некоторых случаях (пришли два запроса одновременно) уметь "тормозить" эти потоки пока канал Your_IP_core->PCI_Express_core занят передачей данных другого потока.
Штука эта (арбитр) не очень сложная, но больно уж муторная в отладке. ИМХО, проблема где-то в этом куске (по отдельности ведь всё работает!).
Fast
у нас на 5м Virtex все работало на x8, примерно 12-13 гбит.с в обе стороны, правда, при глубокой переработке обвязки для ендпоинта
драйвер под Windriver в режиме polling, два буфера на прием/передачу по 2Мб (payload=128DW 4096 шт)

как вариант, контроллер DMA что на материнке может неправильно обрабатывать поток данных
можно для начала поиграться с размером пейлоада и их кол-вом , попробовать на другой машине, а потом препарировать
Methane
Цитата(Fast @ Feb 26 2011, 13:11) *
для начала поиграться с размером пейлоада

Реализация PCIe у ксилинкса не позволяет просто узнать максимальный размер? Или вы "научным тыком"?
dmitry-tomsk
Цитата(Fast @ Feb 26 2011, 14:11) *
у нас на 5м Virtex все работало на x8, примерно 12-13 гбит.с в обе стороны, правда, при глубокой переработке обвязки для ендпоинта
драйвер под Windriver в режиме polling, два буфера на прием/передачу по 2Мб (payload=128DW 4096 шт)

как вариант, контроллер DMA что на материнке может неправильно обрабатывать поток данных
можно для начала поиграться с размером пейлоада и их кол-вом , попробовать на другой машине, а потом препарировать

А что, если не секрет, было не так с обвязкой?
Fast
Цитата(Methane @ Feb 26 2011, 15:15) *
Реализация PCIe у ксилинкса не позволяет просто узнать максимальный размер? Или вы "научным тыком"?
позволяет. Но на максимальном размере периодически система подвисала намертво, в режиме длительного изнасилования на предельный скоростях.
Это на мой взгляд оптимальное соотношение для X58 интеловских плат с т.з. длительной и стабильной работы, имхо, разумеется.


Цитата(dmitry-tomsk @ Feb 26 2011, 18:09) *
А что, если не секрет, было не так с обвязкой?
по заполнении буферов DMA необходимо давать рестарт контроллеру DMA из драйвера, мы решили делать автоматический рестарт из обвязки ендпоинта. Драйвер занимается только мониторингом состояния, считыванием и заполнением буферов, непрерывно. Плюс в служебных TLP-пакетах поднимаем на хост некоторую статистическую информацию. т.е. вопрос никак не связан с качеством исполнения имеющейся обвязки, скорее, с особенностями работы нашего устройства.
dmitry-tomsk
Цитата(Fast @ Feb 26 2011, 23:50) *
позволяет. Но на максимальном размере периодически система подвисала намертво, в режиме длительного изнасилования на предельный скоростях.
Это на мой взгляд оптимальное соотношение для X58 интеловских плат с т.з. длительной и стабильной работы, имхо, разумеется.


по заполнении буферов DMA необходимо давать рестарт контроллеру DMA из драйвера, мы решили делать автоматический рестарт из обвязки ендпоинта. Драйвер занимается только мониторингом состояния, считыванием и заполнением буферов, непрерывно. Плюс в служебных TLP-пакетах поднимаем на хост некоторую статистическую информацию. т.е. вопрос никак не связан с качеством исполнения имеющейся обвязки, скорее, с особенностями работы нашего устройства.

Понятно, спасибо. А не наблюдали, случайно, зависания операционной системы при максимальной загрузке приёмной линии? У меня на x1 упорно виснит, если поток данных читать быстрее чем 167 мбайт в секунду, приходится ограничивать скорость чтения (:
Fast
Цитата(dmitry-tomsk @ Feb 20 2011, 18:50) *
mps - max payload size, mrs - max read size, определяются чипсетом (root complex), для большинства чипсетов 128 байт. За пересечением границ должен следить автомат, формирующий запросы.
если точнее, то они определяются по согласованию между возможностями ОС, чипсета и Core.
а непрерывный кусок памяти ядра windows можно выделить больше 1 Мб, кажется 16... но не помню, давно драйвер писал


Цитата(dmitry-tomsk @ Feb 26 2011, 23:02) *
Понятно, спасибо. А не наблюдали, случайно, зависания операционной системы при максимальной загрузке приёмной линии? У меня на x1 упорно виснит, если поток данных читать быстрее чем 167 мбайт в секунду, приходится ограничивать скорость чтения (:
ой, че только не наблюдали, висло по разному... и искажения периодически появлялись. В основном правда из-за размеров TLP и DMA-блока данных.

Сидели пыхтели вдвоем, я писал драйвер, а коллега правил обвязку. Сначала подправили кусок кода, чтоб правильно писать в регистры (из ендпоинта) и соотв. читать регистры (из драйвера) флаги о состоянии и готовности буферов. Там была такая фишка, что последний пакет блока не успевал "долететь" в буфер на хост, а драйвер забирал уже весь буфер, т.к. регистры показывали что все готово. Потом на высоких скоростях одно ядро CPU было занято на 100% только на мониторинг регистров и рестарт контроллера, - переписали другой фрагмент обвязки и драйвера. Потом понадобилось пересылать доп. данные - дописали третий, и т.д. много мелких неприятностей, с которыми приходилось бороться днями и неделями
dmitry-tomsk
Цитата(Fast @ Feb 27 2011, 00:34) *
если точнее, то они определяются по согласованию между возможностями ОС, чипсета и Core.
а непрерывный кусок памяти ядра windows можно выделить больше 1 Мб, кажется 16... но не помню, давно драйвер писал


ой, че только не наблюдали, висло по разному... и искажения периодически появлялись. В основном правда из-за размеров TLP и DMA-блока данных.

Сидели пыхтели вдвоем, я писал драйвер, а коллега правил обвязку. Сначала подправили кусок кода, чтоб правильно писать в регистры (из ендпоинта) и соотв. читать регистры (из драйвера) флаги о состоянии и готовности буферов. Там была такая фишка, что последний пакет блока не успевал "долететь" в буфер на хост, а драйвер забирал уже весь буфер, т.к. регистры показывали что все готово. Потом на высоких скоростях одно ядро CPU было занято на 100% только на мониторинг регистров и рестарт контроллера, - переписали другой фрагмент обвязки и драйвера. Потом понадобилось пересылать доп. данные - дописали третий, и т.д. много мелких неприятностей, с которыми приходилось бороться днями и неделями

У меня sgdma режим и кольцевые буферы по 50 МБайт, так что таких проблем не было. А вот чтение виснет, скорость для x1 предельная - чипскоп показывает, что обмен идёт, ошибок нет, а ОС висит мёртво. Как только вставляю паузы в последовательности запросов - всё нормально. Возможно, на x8 hard ip не может полностью загрузить полосу и такого эффекта нет, но проверить пока не на чем. А что за железо у Вас?
Anatol'
Цитата(dmitry-tomsk @ Feb 27 2011, 03:26) *
У меня sgdma режим и кольцевые буферы по 50 МБайт, так что таких проблем не было. А вот чтение виснет, скорость для x1 предельная - чипскоп показывает, что обмен идёт, ошибок нет, а ОС висит мёртво. Как только вставляю паузы в последовательности запросов - всё нормально. Возможно, на x8 hard ip не может полностью загрузить полосу и такого эффекта нет, но проверить пока не на чем. А что за железо у Вас?

У нас была похожая проблема.
http://electronix.ru/forum/index.php?showtopic=73356
Вкратце, на дефолтных настройках при слишком бодром потоке данных корка начинала сбрасывать пакеты. А не получив ожидаемого числа пакетов колом может встать уже любая часть системы )
Вылечилось одной галочкой в настройках корки.
Methane
Цитата(Anatol' @ Mar 4 2011, 09:23) *
Вылечилось одной галочкой в настройках корки.

А у Альтеры с кредитами куча гемороя. sad.gif
dmitry-tomsk
Цитата(Anatol' @ Mar 4 2011, 10:23) *
У нас была похожая проблема.
http://electronix.ru/forum/index.php?showtopic=73356
Вкратце, на дефолтных настройках при слишком бодром потоке данных корка начинала сбрасывать пакеты. А не получив ожидаемого числа пакетов колом может встать уже любая часть системы )
Вылечилось одной галочкой в настройках корки.

Спасибо за помощь. Правда у меня не вылечилось, да и корка сама не висит, обмен идёт, ошибок не показывает, а windows висит (:
L_Konstantin
Наконец разобрались с проблемой!...
Дело было в том что ответы на чтение из BAR (RdCmpl) были не корректные (содержали неправильные ReqID, TAG и адрес).
Это происходило в случае если запрос на чтение поступал при одновременном получении и передачи данных - что возникало только в режиме full-duplex (иначе я успевал быстро отвечать и все было ОК).
В результате драйвер не мог вычитывать необходимые данные о состоянии устройства (в нашем случае информацию о произошедшем прерывании), что и приводило к весьма печальным последствиям.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.