Приветствую.
Собрал систему (см. рисунок) для передачи данных по PCIe.
Ядро AXI Bridge for PCIe сконфигурировано в режиме x4, 64 bit, 250MHz, должно позволить прокачивать поток 16 Гбит/с.
В качестве DMA используется ядро AXI DMA v7.1 в режиме Scatter-Gather. Кольцо дескрипторов и буферы данных выделяются в памяти ядра Linux. Ранее было сделано
так, пропускная способность канала составляла ~6 Гбит/с.
Тут опять упёрся в 6 Гбит/с, думал, что софт ограничивает производительность канала. Потом убрал вмешательство системы в работу DMA - инициализирую кольцо дескрипторов, запускаю DMA. DMA бросает данные пока не закончатся дескрипторы. Оценивая время обработки кольца дескрипторов и переданный объём данных, получаю чуть больше 6 Гбит/с.
Вытянул сигналы AXI4-Stream между FIFO и DMA на ILA, вижу - FIFO держит TVALID всегда в 1, а DMA периодически (очень часто) сбрасывает TREADY в 0. Получается DMA является виновником ограничения скорости потока. В доке вычитал, что в тестах получали пропускную способность до ~70%, но это ~11,2 Гбит/с, меня бы устроило.
Вопрос - как поднять производительность DMA? Как понимаю, AXI Interconnect и PCIe мост могут тормозить DMA?
Цитата(doom13 @ Oct 8 2015, 22:17)

Кольцо дескрипторов ... выделяется в памяти ядра Linux.
Может в этом причина ? Посмотрите анализатором очередность транзакций на шине axi.
Цитата(toshas @ Oct 8 2015, 22:44)

Может в этом причина ? Посмотрите анализатором очередность транзакций на шине axi.
Тогда тормоза были бы только во время чтения очередного дескриптора (по завершению передачи пакета), а так DMA сбрасывает (часто) TREADY на AXI4-Stream в 0 во время передачи данных одного пакета (за дескриптором ему пока лезть не надо). Пакеты сделал максимального размера, который поддерживает генератор трафика (65536 слов * 64 бита).
Шину буду ковырять, но пока не успел.
На сколько тактов сбрасывает ? Какими пачками идет вычитывание по axi ?
Посмотрите на готовность к передаче ядра pcie.
На AXI4-Stream между FIFO и DMA картина следующая:
А что дальше, между dma и pcie ?
Я к тому, что ядро pcie дробит пакеты по max payload size и затык может быть там, в не готовности ядра pcie принимать новые данные от dma.
На AXI4 между DMA и AXI Interconnect вот такая штука (тут даже не пойму на какой из сигналов настроить триггер):
PS:
Триггер настроен на TLAST для AXI4-Stream (FIFO->DMA).
PSPS:
Тут, как понимаю, Slave (AXI Interconnect) выставил WREADY, а Master (DMA) ещё очень долго тупит. Получается, что все проблемы из-за DMA?
Или надо ещё смотреть и на BVALID?
doom13
Oct 10 2015, 10:34
Засинхронизировал триггер по начальному адресу буфера (0х0000_0004_0720_0000) на который ссылается первый дескриптор в кольце. На рисунке сечение DMA-AXI Interconnect, для AXI Interconnect-PCIe Bridge диаграмма такая же.
Нужна помощь в анализе, что тут работает неправильно (медленно) и получится ли ускорить?
Если всё правильно понимаю, то WVALID ждёт подтверждения записи BVALID для второго burst-a и только потом устанавливается в 1. Как-то можно повлиять на более быстрое появления BVALID и, как следствие, на WVALID?
doom13
Oct 10 2015, 14:13
Увеличил burst size для DMA до максимального 256, а вместе с этим увеличилось время от WLAST до BVALID. Что за ерунда?
Где тут увеличение производительности?
Время от WLAST до BVALID должно было остаться таким же, как и при значении burst 16??? Если нет, за счёт чего тут можно было получить увеличение производительности DMA???
Спасибо.
toshas
Oct 10 2015, 19:22
Можете в pcie-mm ядре встать анализатором на pipe интерфейс (tx и rx) ?
По pcie у вас только в теории пойдут пакеты 4кб, но в реальности они будут по 128, ну может 256 байт.
А на пакет (группу пакетов) необходимо дождаться ack от хоста и только потом разрешать перезаписывать буфер.
doom13
Oct 10 2015, 19:34
Цитата(toshas @ Oct 10 2015, 22:22)

Можете в pcie-mm ядре встать анализатором на pipe интерфейс (tx и rx) ?
По pcie у вас только в теории пойдут пакеты 4кб, но в реальности они будут по 128, ну может 256 байт.
А на пакет (группу пакетов) необходимо дождаться ack от хоста и только потом разрешать перезаписывать буфер.
Т.е. я не смогу раскачать DMA более полученных 6 Гбит/с? Нужно ставить Gen3 (сейчас стоит настройка для Gen 2) увеличивать размер шины данных до 128/256 бит? Только тогда можно будет превысить потолок в 6 Гбит/с?
Или, как вариант, выбрасывать DMA и мост и делать что-то своё для работы с голым ядром PCIe Gen3?
toshas
Oct 10 2015, 20:34
Мне кажется pcie-mm всегда позиционировалось как удобное решение для микропроцессорной системы, не более того, при этом максимальной скорости он него никто и не требовал.
В чем точно происходит затык в вашем случае было бы интересно выяснить.
Однако для получения максимальных скоростей очень вероятно придется самому с нуля писать dma для голого ядра pcie.
Или посмотреть на работу dsmv.
Или купить решение от plda/nwlogic.
Или дождаться что же xilinx предложит как альтернативу (xdma). Стоимость может оказаться невысокой или вообще бесплатной.
Им нужно будет двигать свое решения для OpenCL, а для этого нужна цепь pcie-dma-mig(ddr). И xdma как раз призвано заполнить пробел.
doom13
Oct 10 2015, 21:23
Цитата(toshas @ Oct 10 2015, 23:34)

Мне кажется pcie-mm всегда позиционировалось как удобное решение для микропроцессорной системы, не более того, при этом максимальной скорости он него никто и не требовал.
А я думал это ядро и есть самое то, что Xilinx предлагает для работы с PCIe, а оно вот как оказывается
Цитата(toshas @ Oct 10 2015, 23:34)

Однако для получения максимальных скоростей очень вероятно придется самому с нуля писать dma для голого ядра pcie.
Или посмотреть на работу dsmv.
Вот с нуля делать и не хотелось. Разбираться с DS_DMA показалось очень сложным, решил на готовых ядрах собрать систему, счас надо думать, куда двигать дальше.
Цитата(toshas @ Oct 10 2015, 23:34)

Или дождаться что же xilinx предложит как альтернативу (xdma). Стоимость может оказаться невысокой или вообще бесплатной.
Почти дождался - вчера слил, установил, посмотрел. Остался вопрос с мануалом на это чудо-ядро XDMA. Мне его давать не хотят, так что если кто помог бы с описанием ядра, был бы очень благодарен.
Цитата(toshas @ Oct 10 2015, 23:34)

В чем точно происходит затык в вашем случае было бы интересно выяснить.
А может ли как-то система (драйвер) влиять на такую длительность появления BVALID? В ядре есть много способов выделения памяти, может я использую неправильный (пользуюсь kmalloc)?
Мне пока нужно выжать с системы 10 Гбит/с. Можно наверное настроить мост на работу с PCIe Gen 3, пропускная способность должна будет возрасти. Тут только придётся подбирать более навороченную систему для работы с платой, мой рабочий ПК подойдёт, а вот тот, что будем использовать в проекте???
RobFPGA
Oct 11 2015, 12:20
Приветствую!
Для начала неплохо бы убедится что PCIe действительно работает в x4 Gen2, каков размер payload.
А правильнее было бы на модели в симуляторе посмотреть что и как работает, какова скорость передачи и что и как тормозит передачу. И уж если на модели скорость будет ОК то только тогда разбирается на рабочей системе сравнивая с моделью что не так.
Успехов! Rob.
doom13
Oct 11 2015, 20:19
Цитата(RobFPGA @ Oct 11 2015, 15:20)

Для начала неплохо бы убедится что PCIe действительно работает в x4 Gen2, каков размер payload.
Настройки для моста стоят именно такие (см. рисунок). По поводу payload не понял, что это, такой опции там нет. Есть ещё вкладка (второй рисунок) с опциями для моста (можно выбирать 2/4/8), но с ней не разбирался, надо глянуть, за что оно отвечает.
Цитата(RobFPGA @ Oct 11 2015, 15:20)

А правильнее было бы на модели в симуляторе посмотреть что и как работает, какова скорость передачи и что и как тормозит передачу. И уж если на модели скорость будет ОК то только тогда разбирается на рабочей системе сравнивая с моделью что не так.
Не совсем представляю, как это всё проверять в симуляторе. Завтра думаю проверить как быстро DMA будет бросать данные в память FPGA, но тут наверное всё будет работать быстрее.
doom13
Oct 12 2015, 09:08
Цитата(RobFPGA @ Oct 11 2015, 15:20)

... каков размер payload.
Нашёл
Maximum Payload Size (MPS) up to 256 Bytes, это значит любой пакет будет бить по 256 байт?
toshas
Oct 12 2015, 09:43
Под линуксом выполните "lspci -vv" и посмотрите с какими параметрами ядро сконфигурировано, а с какими система разрешила работать.
Как сказано выше, в том что линк прошел на gen2 тоже неплохо бы убедиться.
doom13
Oct 12 2015, 10:41
Цитата(toshas @ Oct 12 2015, 12:43)

Под линуксом выполните "lspci -vv" и посмотрите с какими параметрами ядро сконфигурировано, а с какими система разрешила работать.
Слот в котором стоит плата поддерживает Gen 3, ядро настроено на Gen 2, почему Gen 2 должен не установиться?
Нашёл, надо было вводить команду с правами суперпользователя, получил следующее:
Цитата
07:00.0 Multimedia controller: Xilinx Corporation Device 7024
Subsystem: Xilinx Corporation Device 0007
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 32 bytes
Interrupt: pin A routed to IRQ 31
Region 0: Memory at f7100000 (64-bit, non-prefetchable) [size=128K]
Capabilities: [80] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit+
Address: 00000000feeff00c Data: 4182
Capabilities: [c0] Express (v2) Endpoint, MSI 00
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+
MaxPayload 128 bytes, MaxReadReq 512 bytes
DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
LnkCap: Port #0, Speed 5GT/s, Width x4, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
ClockPM- Surprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 2.5GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range B, TimeoutDis+, LTR-, OBFF Not Supported
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-, EqualizationPhase1-
EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
Kernel driver in use: htg_v7_g3
Получается что работает как Gen 1?
PS: Как его загнать в 5 GT/s?
toshas
Oct 12 2015, 11:06
Попробуйте воткнуть плату в слот ближайший к процессору.
gosu-art
Oct 12 2015, 11:09
1. посмотреть в биосе материнки настройки PCIe
У меня,например, на линк х4 слота определяется слотом видеокарты. Т.е. на каком линке заработала видюха на таком все остальное будет работать
2. попробовать воткнуть непосредственно в слот видюхи
doom13
Oct 12 2015, 12:01
Цитата(toshas @ Oct 12 2015, 14:06)

Попробуйте воткнуть плату в слот ближайший к процессору.
Спасибо, сейчас попробую.
Цитата(gosu-art @ Oct 12 2015, 14:09)

2. попробовать воткнуть непосредственно в слот видюхи
Это и будет ближайший слот к процессору.
Цитата(gosu-art @ Oct 12 2015, 14:09)

1. посмотреть в биосе материнки настройки PCIe
У меня,например, на линк х4 слота определяется слотом видеокарты. Т.е. на каком линке заработала видюха на таком все остальное будет работать
Видюха Quadro 600 работает почему-то на 2.5 GT/s x16, может с этим как-то связано?
Ещё вопрос: при старте системы прошивки в FPGA нету, заливаю прошивку в RAM, перезагружаю систему, может проблема быть в этом? Может необходимо, чтоб FPGA запускалась с флэша при старте системы за определённое (небольшое) время?
KPiter
Oct 12 2015, 12:33
Нет ли в биосе Initialization at Gen1\Gen2\Gen3? свежий ли биос?
doom13
Oct 12 2015, 12:58
Цитата(KPiter @ Oct 12 2015, 15:33)

Нет ли в биосе Initialization at Gen1\Gen2\Gen3?
Что-то похожее есть только для слота видеокарты, но стоит настройка
авто, попытка изменить не дала результата (видеокарта продолжила работу в Gen 1).
Цитата(KPiter @ Oct 12 2015, 15:33)

свежий ли биос?
Тот, что был с компом при покупке. Наверное старый.
KPiter
Oct 12 2015, 13:19
Не понял был ли испробован вариант: поставить Xilinx в слот видюхи. смысл оставить только xilinx на pcie шине
doom13
Oct 12 2015, 13:40
Цитата(toshas @ Oct 12 2015, 14:06)

Попробуйте воткнуть плату в слот ближайший к процессору.
Цитата(gosu-art @ Oct 12 2015, 14:09)

2. попробовать воткнуть непосредственно в слот видюхи
Цитата(KPiter @ Oct 12 2015, 16:19)

Не понял был ли испробован вариант: поставить Xilinx в слот видюхи. смысл оставить только xilinx на pcie шине
Поменял местами видеокарту и плату с FPGA. Теперь система вообще не видит плату (нет в списке PCI устройств). Ранее с настройкой AXI to PCIe моста для Gen 1 работало при таком расположении устройств.
toshas
Oct 12 2015, 13:57
Есть ли в биосе настройка pcie spread spectrum clock (ssc)? Попробуйте ее изменить.
Что у вас за платформа ?
doom13
Oct 12 2015, 14:08
Цитата(toshas @ Oct 12 2015, 16:57)

Есть ли в биосе настройка pcie spread spectrum clock (ssc)? Попробуйте ее изменить.
Проверю.
Цитата(toshas @ Oct 12 2015, 16:57)

Что у вас за платформа ?
Проц: i7-3770K
Материнка: GA-Z77P-D3
Видео: Quadro 600
Ещё стоит сетевая карта в слоте PCIe x1
gosu-art
Oct 12 2015, 14:15
Может пока отложить видеокарту и подключится к встроенной графике?
UPD: Сетевуху тоже можно пока выкинуть

скорее всего она тоже на х1. Если это все подключено к свичу то он может поставить линки на х1 (ориентируясь на самое медленное устройство). Я уже на cPCI serial с этой фигней сталкивался))
RobFPGA
Oct 12 2015, 14:33
Приветствую!
Цитата(doom13 @ Oct 12 2015, 13:41)

Слот в котором стоит плата поддерживает Gen 3, ядро настроено на Gen 2, почему Gen 2 должен не установиться?
....
Получается что работает как Gen 1?
PS: Как его загнать в 5 GT/s?
Хи-xи - так бы еще долго "разгоняли" DMA

А плата у Вас покупная или самопальная ?
Удачи! Rob.
doom13
Oct 12 2015, 15:36
Цитата(RobFPGA @ Oct 12 2015, 17:33)

Хи-xи - так бы еще долго "разгоняли" DMA

Мне тоже смешно стало, а главное - осталось настроить/поменять комп и система ОБЯЗАНА заработать, а то думал скоро линчевать начнут
Цитата(gosu-art @ Oct 12 2015, 17:15)

Может пока отложить видеокарту и подключится к встроенной графике?
UPD: Сетевуху тоже можно пока выкинуть

скорее всего она тоже на х1. Если это все подключено к свичу то он может поставить линки на х1 (ориентируясь на самое медленное устройство). Я уже на cPCI serial с этой фигней сталкивался))
Встроенной нету, есть выход HDMI, но я под него моник не найду. Сейчас выкину и сетевуху. Самое интересное - у двух товарищей такая же система, видюха работает на 5 GT/s.
Уже сравнили версию биоса - один в один.
Цитата(RobFPGA @ Oct 12 2015, 17:33)

А плата у Вас покупная или самопальная ?
Покупная,
вот такая (X690T)
doom13
Oct 13 2015, 15:04
На другом ПК (на котором и видео работает в режиме 5 GT/s) моя плата запустилась в режиме Gen 2, только надо было её прошить во флэш и передёрнуть питание ПК. Работу DMA пока не проверил, но, думаю, всё будет ОК. С моей системой какая-то беда, держит линк только в режиме 2.5 GT/s, хотя всё железо одинаковое.
toshas
Oct 13 2015, 16:59
Интересно узнать какую скорость удастся достигнуть.
+ по возможности выкладывайте проект в копилку форума.
doom13
Oct 14 2015, 14:51
Перебрали систему - плата запустилась на 5 GT/s. Но результат не столь значителен - всего-то удалось получить 8.5 - 8.7 Gbit/s. Тут размер бурст для DMA имеет значение: для burst 16 получаю где-то 7.2 Gbit/s, для burst 256 - 8.5 Gbit/s.
В тестовых точках картина осталать прежней - очень много времени проходит между WLAST и BVALID.
burst 128 попробуйте.
в большинстве случаев PCIe Payload size выставляется по дефолту 128.
т.е. вы одним барстом впишетесь в размер одного пакета PCIe.
doom13
Oct 15 2015, 07:23
Цитата(krux @ Oct 14 2015, 18:08)

burst 128 попробуйте.
в большинстве случаев PCIe Payload size выставляется по дефолту 128.
т.е. вы одним барстом впишетесь в размер одного пакета PCIe.
Спасибо, попробовал. Но получаю те же 8.5 - 8.7 Gbit/s, что и для burst 256.
doom13
Oct 15 2015, 18:16
На верхнем слоте PCIe получил пропускную способность моей системы в 9.3 Gbit/s. Проверял ещё на одном ПК, дало такой же результат.
Если сравнивать с резутьтатами для примера Xilinx (xapp1052), то и неплохо, но до максимума в 16 Gbit/s ещё очень далеко.
doom13
Oct 16 2015, 11:33
Цитата(toshas @ Oct 10 2015, 22:22)

Можете в pcie-mm ядре встать анализатором на pipe интерфейс (tx и rx) ?
Если можно расскажите тут подробнее, что это (pipe) и как работает? Что можно почитать по данной теме?
xapp1184 достаточно будет?
RobFPGA
Oct 16 2015, 14:33
Приветствую!
Цитата(doom13 @ Oct 16 2015, 14:33)

Если можно расскажите тут подробнее, что это (pipe) и как работает? Что можно почитать по данной теме?
xapp1184 достаточно будет?
Нее - в PIPE лезть не нужно - это интерфейс к MGT -
toshas наверное имел ввиду шины s_axis_rq_* s_axis_rc_* на самой pcie корке которая внутри bridge
Через эти шины TLP идут request/completion от bridge логики к pcie корке. Цепляете туда ChipScope - а еще лучше логер который будет Вам скидывать TLP header-ы и смотрите что куда тормозит. Конечно это сначало проще было бы на симе сделать.
Тут либо сам bridge не заточен на макс thruput, ну или DMA например не успевает подкачивать дескрипторы.
Можно попробовать разместить дескрипторы в памяти FPGA или выделить один большой непрерывный кусок физ памяти (>1MB) и все дескрипторы залинковать на него. И посмотреть изменится ли скорость или нет.
Если не изменится - то тогда или пробовать на дугой мамке, или скорее всего bridge не заточен на макс thruput, ну или универсальная причина №3 - ХЗ

.
Успехов! Rob.
toshas
Oct 16 2015, 17:14
Нет я как раз предлагал посмотреть трафик в системе (какие пакеты проходят mgt).
Но в принципе не важно с какой стороны начинать разбираться.
По факту надо отследить всю цепочку:
MGT -1.(txdata/rxdata)- PCIE -2.(ll/s_axi) - MMcore -3.(axi)- DMA -4.(axi)- source
Так можно найти, кто причина простоя, но может оказаться, что это просто следствие накладных расходов цепочки такой длины.
RobFPGA
Oct 16 2015, 17:55
Приветствую!
Цитата(toshas @ Oct 16 2015, 20:14)

Нет я как раз предлагал посмотреть трафик в системе (какие пакеты проходят mgt).
Но в принципе не важно с какой стороны начинать разбираться.
По факту надо отследить всю цепочку:
MGT -1.(txdata/rxdata)- PCIE -2.(ll/s_axi) - MMcore -3.(axi)- DMA -4.(axi)- source
Так можно найти, кто причина простоя, но может оказаться, что это просто следствие накладных расходов цепочки такой длины.
Ой - разбирается на уровне PIPE это труба дело

. DLP layer, K-коды, AK-и NAK-и постоянно туда сюда снуют. ужас!
Проще сначала на TLP layer посмотреть. Так как операция WRITE на PCIE не требует completion то тут или в bridge для PCIe настройки буферов зажаты или потери времени на чтение/update дескрипторов велики. Все же CDMA разрабатывался для внутреннего употребления а не для PCIe.
Я вот свою железку симулирую - так latency на чтение дескриптора из памяти ~500 нс (x8 gen2) и это при PIPE симуляции и без задержек на стороне модели RC.
Успехов! Rob.
doom13
Oct 16 2015, 19:45
Цитата(RobFPGA @ Oct 16 2015, 17:33)

... ну или DMA например не успевает подкачивать дескрипторы.
Можно попробовать разместить дескрипторы в памяти FPGA или выделить один большой непрерывный кусок физ памяти (>1MB) и все дескрипторы залинковать на него. И посмотреть изменится ли скорость или нет.
Если не изменится - то тогда или пробовать на дугой мамке ...
Цитата(RobFPGA @ Oct 16 2015, 20:55)

... или потери времени на чтение/update дескрипторов велики. Все же CDMA разрабатывался для внутреннего употребления а не для PCIe.
Судя по диаграммам, которые приводил выше (затык после каждого второго burst-a и длительность пропорциональна размеру burst-a), проблема не в размещении дескрипторов в Kernel space memory. Пока использую 32 дескриптора, память под них выделяется в непрерывном куске физической памяти с помощью
kmalloc.
Цитата(toshas @ Oct 16 2015, 20:14)

Нет я как раз предлагал посмотреть трафик в системе (какие пакеты проходят mgt).
Но в принципе не важно с какой стороны начинать разбираться.
По факту надо отследить всю цепочку:
MGT -1.(txdata/rxdata)- PCIE -2.(ll/s_axi) - MMcore -3.(axi)- DMA -4.(axi)- source
Так можно найти, кто причина простоя, но может оказаться, что это просто следствие накладных расходов цепочки такой длины.
Сегодня пытался проследить, кто является источником BVALID, но один из модулей зашифрован и связь теряется. Дальше куча линий с другими названиями и куда смотреть пока не разобрался.
RobFPGA
Oct 16 2015, 21:25
Приветствую!
BVALID формирует axi_bridge когда видит что очередной AXI пакет полностью и окончательно отправился к праотцам (передан на RC).
Повторюсь - так как для MEM_WRITE на PCIe не требуется completion со сторонв RC то это событие для bridge (окончание отправки пакета)
скорее всего происходит в момент записи последней порции payloda в виде TLP пакета по шине s_axis_rq_* в PCIe корку. При этом пакет TLP сначала попадает во внутренний буфер PCIe корки а затем уж передается в RC, при условии что RC готов принят этих беженцев (есть место в приемных буферах)
Если на стороне RC нет свободных буферов для приема и внутренний дворик корки тоже заполнен то корка снимает s_axis_rq_ready.
Так что подключившись s_axis_rq_* можно посмотреть - есть ли там паузы или это bridge тупит.
Успехов! Rob.
RobFPGA
Oct 18 2015, 20:21
Приветствую!
Как говорится "Даренному коню в зубы .." а надо заглядывать даже в зад

Прогнали бы на симуляции все сразу стало бы понятно.
По умолчанию CDMA настроен на глубину очереди запросов адреса=4 (при этом реально выдается 4+2=6 запросов) ну а а потом CDMA шлангует пока не получит ответ/подтверждение. Поменять это безобразие в красивой формочке при конфигурировании CDMA нельзя

Только через зад коня - ручками
Код
set_property CONFIG.C_WRITE_ADDR_PIPE_DEPTH 8 [get_bd_cells i_axi_cdma]
set_property CONFIG.C_READ_ADDR_PIPE_DEPTH 8 [get_bd_cells i_axi_cdma]
Но один конь карету не помчит - также надо во всех crossbar-ах по пути следования кареты выставить постовых - значение READ_ACCEPTANCE, WRITE_ACCEPTANCE на >=8 (а то по умолчанию там стоит 2 - даже не лошадь - дохлая кляча получается ). Ну и бубенцы на хомут - значения больше 8 ставить смысла нет так как bridge больше 8 запросов в очередь не принимает, а вроде бы соответствующие параметры c_s_axi_num_read/c_s_axi_num_write расположенны слишком глубоко в зад.. read_only
Успехов! Rob.
P.S. Ни одно животное не пострадало. Все эксперименты проводились на виртуальной лошади с "заездами" на идеальной трассе (PIPE sim. , BFM RC без задержек);
doom13
Oct 19 2015, 06:42
Цитата(RobFPGA @ Oct 18 2015, 23:21)

А что если у меня используется DMA v7.1 в режиме S2MM (CDMA был в начале)?
Цитата(RobFPGA @ Oct 18 2015, 23:21)

... также надо во всех crossbar-ах по пути следования кареты выставить постовых - значение READ_ACCEPTANCE, WRITE_ACCEPTANCE на >=8 (а то по умолчанию там стоит 2 ...
Если на рисунке тот параметр, о котором шла речь, то там 8.
RobFPGA
Oct 19 2015, 07:45
Приветствую!
Цитата(doom13 @ Oct 19 2015, 09:42)

А что если у меня используется DMA v7.1 в режиме S2MM (CDMA был в начале)?
Думаю что тоже самое - так как CDMA это AXI DMA сконфигурированный в позе 69 через loop-back fifo.
И так и есть - правда тут придется резать бедную лошадь и ковыряется в потрохах - исходниках
Код
axi_dma.vhd
...
-- DataMover outstanding address request fifo depth
constant DM_ADDR_PIPE_DEPTH : integer := 4;
...
Цитата(doom13 @ Oct 19 2015, 09:42)

Если на рисунке тот параметр, о котором шла речь, то там 8.
Нет это как раз и есть "бубенцы" а я имел ввиду - axi_interconect/axi_crosbar которые стоят МЕЖДУ DMA и PCIe. Вы же как то объединяете шины DMA M_AXI и M_AXI_SG для подключения к одой шине S_AXI в PCIe bidge?
Успехов! Rob.
doom13
Oct 19 2015, 08:53
Цитата(RobFPGA @ Oct 19 2015, 10:45)

Код
axi_dma.vhd
...
-- DataMover outstanding address request fifo depth
constant DM_ADDR_PIPE_DEPTH : integer := 4;
...
Такой параметр нахожу, он у меня почему-то 1, попробую задать 8.
Цитата(RobFPGA @ Oct 18 2015, 23:21)

... вроде бы соответствующие параметры c_s_axi_num_read/c_s_axi_num_write расположенны слишком глубоко ...
Такие параметры поиском могу найти только в папках с файлами для PCIe моста (xml - файл задаёт параметры для gui ядра) и они там 8.
RobFPGA
Oct 19 2015, 09:01
Приветствую!
Цитата(doom13 @ Oct 19 2015, 11:53)

Такой параметр нахожу, он у меня почему-то 1, попробую задать 8.
Такие параметры поиском могу найти только в папках с файлами для PCIe моста (xml - файл задаёт параметры для gui ядра) и они там 8.
Не трогайте пока PCIe bridge - настройте DMA и axi_interconect-ы
Успехов! Rob.
doom13
Oct 19 2015, 10:10
Для AXI Interconnect эти параметры надо править:
Код
parameter [C_NUM_SLAVE_SLOTS*32-1:0] C_S_AXI_WRITE_ACCEPTANCE = 32'H00000002,
// Maximum number of active write transactions that each SI
// slot can accept. (Valid only for SAMD)
// Format: C_NUM_SLAVE_SLOTS{Bit32};
// Range: 1-32.
parameter [C_NUM_SLAVE_SLOTS*32-1:0] C_S_AXI_READ_ACCEPTANCE = 32'H00000002,
// Maximum number of active read transactions that each SI
// slot can accept. (Valid only for SAMD)
// Format: C_NUM_SLAVE_SLOTS{Bit32};
// Range: 1-32.
???
RobFPGA
Oct 19 2015, 11:07
Приветствую!
Увы это издержки "удобств" когда за Вас работает неизвестный индийский Раджа.
В форме кофигурирования interconecta таких параметров нет - но можно раскрыть блок interconecta ПОСЛЕ diagram validation найти там axi_crossbar
и в нем уже - поставив ручной режим - изменить нужные параметры. Ну или сразу нарисовать правильный xbar из примитивов axi_crossbar, axi_dwidth_converter, axi_clock_converter, ... не надеясь на телепатические способности Раджи.
Успехов! Rob.
Нажмите для просмотра прикрепленного файла
doom13
Oct 19 2015, 13:42
Сделал всё, как Вы советовали. Должно было увеличить скорость передачи, но почему-то осталось по-прежнему.
Рисунок первый, то как работало ранее, использую burst 256. По рисунку видно, что период двух burst-ов примерно 1400 тактов.
Рисунок второй, то как работает сейчас (с параметром constant DM_ADDR_PIPE_DEPTH : integer := 8; и crossbar-om c Read/Write Acceptance 8) Тут два burst-a передаются за 800 тактов.
На осцил вывожу сигнал прерывания по обработке дескриптора, его период в обоих случаях одинаковый??? По данным ILA производительность возрасла, на деле осталась прежней, как так???
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.