реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Порядок транзакций PCIe, Порядок CPLD после MRd
sp1
сообщение May 16 2016, 10:11
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 28-10-10
Пользователь №: 60 495



Всем, здравствуйте. Делаю систему на FPGA на основе xapp1052 для двусторонней передачи данных FPGA Spartan-6 (кит sp605) - оперативка. Передача данных из оперативки в FPGA осуществляется следующим образом: FPGA отправляет транзакцию MRd с соответствующими адресом, тегом и размером запрашиваемых данных, в ответ приходит транзакция CPLD с данными.

Столкнулся со следующей проблемой, нарушается порядок следования транзакций CPLD. Т.е. я отправляю транзакции MRd с адресами данных последовательно, и теги в транзакциях MRd идут последовательно 1, 2, 3, ... 1F, 0, 1 ... а в ответ периодически приходят CPLD с нарушенным порядком. Например, сначала CPLD с тегом 2, потом CPLD с тегом 4, потом CPLD с тегом 5, потом CPLD с тегом 3, потом CPLD с тегом 6. И данные, соответственно, лежащая по адресам, соответствующим тегам. В результате в принимаемом на стороне FPGA файле данные перемешиваются.

Пробовал выставлять всем транзакциям MRd одинаковый тег, данные все равно перемешиваются, хоть и CPLD идут с одинаковым тегом.

Читал спецификацию PCI-Express, но так и не понял, это такая особенность PCI-Express, что ему разрешено менять порядок транзакций CPLD во избежании Deadlock'ов или дело в чем-то другом? Причем такая фишка у меня только в компах под управлением 64-разрядной операционки (Linux). В 32-разрядных Linux всё ОК.

Кто-нибудь сталкивался с подобной проблемой? Что можете посоветовать?
Go to the top of the page
 
+Quote Post
Timmy
сообщение May 16 2016, 13:18
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Перемешивать как запросы так и ответы на чтение спецификация разрешает, см. раздел Transaction Ordering. А вот выставлять нескольким исходящим и незавершенным запросам один тэг - запрещаетsm.gif.
Так что надо учитывать в алгоритме, что CPLD придут не по порядку.
Go to the top of the page
 
+Quote Post
sp1
сообщение May 16 2016, 13:27
Сообщение #3





Группа: Участник
Сообщений: 8
Регистрация: 28-10-10
Пользователь №: 60 495



Цитата(Timmy @ May 16 2016, 16:18) *
Перемешивать как запросы так и ответы на чтение спецификация разрешает, см. раздел Transaction Ordering. А вот выставлять нескольким исходящим и незавершенным запросам один тэг - запрещаетsm.gif.
Так что надо учитывать в алгоритме, что CPLD придут не по порядку.


а запретить системе перемешивать CPLD как-нибудь можно?
Go to the top of the page
 
+Quote Post
Bad0512
сообщение May 17 2016, 04:57
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(sp1 @ May 16 2016, 19:27) *
а запретить системе перемешивать CPLD как-нибудь можно?

Нет, нельзя. Выхода тут два : либо ждать пока придут все данные от текущего запроса и только потом выставлять следующий. Недостаток данного подхода очевиден - сильно падает производительность, так как после каждого запроса до прихода первых данных всегда приличная пауза, соответственно эта пауза автоматически добавляется к любой транзакции размером не более 4к. Достоинства этого подхода также очевидны - простота реализации.
Второй вариант - данные перекладывать в промежуточные буфера, и отдавать их далее только по наполнению этих промежуточных буферов полностью. Тут тоже всё очевидно - механизм сложнее, зато есть вариант выжать максимальную скорость.
Go to the top of the page
 
+Quote Post
sp1
сообщение May 17 2016, 07:46
Сообщение #5





Группа: Участник
Сообщений: 8
Регистрация: 28-10-10
Пользователь №: 60 495



Всем спасибо за полезную информацию!
Go to the top of the page
 
+Quote Post
Tue
сообщение May 19 2016, 14:18
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340



Цитата(Bad0512 @ May 17 2016, 07:57) *
Второй вариант - данные перекладывать в промежуточные буфера, и отдавать их далее только по наполнению этих промежуточных буферов полностью.

Промежуточные буфера не нужны, если ваш локальный в ПЛИС буфер, в который вы принимаете данные работает в режиме памяти (то есть по адресам). В этом случае в каком бы порядке ни приходили данные - они положатся в буфер по своим адресам и перемешивания не будет.
Go to the top of the page
 
+Quote Post
Bad0512
сообщение May 20 2016, 11:03
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(Tue @ May 19 2016, 20:18) *
Промежуточные буфера не нужны, если ваш локальный в ПЛИС буфер, в который вы принимаете данные работает в режиме памяти (то есть по адресам). В этом случае в каком бы порядке ни приходили данные - они положатся в буфер по своим адресам и перемешивания не будет.

В случае памяти - да, ничего страшного не произойдёт, нужно лишь дождаться пока все данные прилетят, поэтому порядок их не очень важен. Однако существуют и другие приложения (например, вам надо сформировать некий поток, данные в котором передаются последовательно), тут порядок прихода данных уже становится важен, без промежуточного буфера не обойтись.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016