Jump to content

    
AVR

PCI-E интерфейс в Qsys на Cy IV GX

Recommended Posts

7 hours ago, novartis said:

С помощью такой команды можно записать 32 байта за раз  _mm256_storeu_si256

ради интереса, проверяли? Действительно так делает?

я, к примеру, маплюсь на какой нить Bar из linux, записываю блок памяти на него, но он все равно потом блоками по 4 байта пишет. Можно вроде по 8, если Linux 64-битный, но тут уже проблема со стороны альтеровской корки пойдет, у меня не вышло по 8.

Давно видел науйчную работу, что если нужно перекинуть до 64 байт по pcie, то быстрее будет по 4 байта так, чем DMA, а все что выше, только DMA

5 hours ago, AVR said:

В таком случае, производительности будет более чем достаточно задачи, поток в ПЛИС менее 250 килобайт в секунду, не будет загрузки процессора более чем 1 процент, что приемлимо.

я как то однажды epcq вывел на pcie через BAR )) И писал со стороны Linux по 4 байта. 32мб перегонял так ) Если слаков нет в проекте, то было это достаточно быстро. Но речь конечно не о секундах. Но когда все закешируется в проце на запись уходит по 50нс (тут еще зависит от того, чтобы проц не засыпал, выставить в Linux cpu perfomance и тд), проверено точно из самой плис, фиксировал там данные.

Edited by new123

Share this post


Link to post
Share on other sites
4 minutes ago, new123 said:

Давно видел науйчную работу, что если нужно перекинуть до 64 байт по pcie, то быстрее будет по 4 байта так, чем DMA, а все что выше, только DMA

Я сейчас делаю кое что на Nios+PCIE (так удобно было коллегам) и на Xilinx. Как сделать это на Xilinx без soft-cpu там понятно но не пробовал, там просто dma_sync_single_for_device и далее шлю адрес, устройство дает серию TLP на чтение с completion.

Как это делать на Nios+PCIE совершенно непонятно. Но если скорость достаточная в теории, то даже если быстрее, есть еще критерий как проще и достаточно ли будет такого решения.

Share this post


Link to post
Share on other sites
8 minutes ago, AVR said:

Как это делать на Nios+PCIE совершенно непонятно. Но если скорость достаточная в теории, то даже если быстрее, есть еще критерий как проще и достаточно ли будет такого решения.

Как на nios, увы. Я этого зверя никогда не делал. Так в принципе вам уже один совет дали.
Мой подход был таков:
1) Делаю в pcie корке любой доступный BAR (BAR0 обычно занят DMA движком, можно брать BAR1-BAR2). Ставлю ему нужный сайз.

2) На pcie появляется разделы.
image.thumb.png.170bfaf71d44d0a3438baff12e39f457.png

3) Ну а дальше в линуксе дело техники. Либо его в своем драйвере подключаем и юзаем iowrite32
4) Либо, делаем map на файл вида /sys/bus/pci/devices/0000:02:00.0/resource2 (нужный адрес подставить самому)

И пишем прям в него. Ну или читаем.

 

upd.
5) Забыл самое главное написать ). После активации BAR1-2 в корке, появляется порт вида BAR2... или как то так. Типа Avalon. И сажаем на него, что душе угодно. Можно on_chip_memory к примеру, можно что нибудь свое и тд. Оно и появится в линуксе

Edited by new123

Share this post


Link to post
Share on other sites
4 hours ago, new123 said:

ради интереса, проверяли? Действительно так делает?

да, это рабочий вариант

 

4 hours ago, new123 said:

Давно видел науйчную работу, что если нужно перекинуть до 64 байт по pcie, то быстрее будет по 4 байта так, чем DMA, а все что выше, только DMA

Логично)
Чтобы хосту записать в плис по pcie 64 байта, нужно отправить 16 TLP пакетов по 4 байта данных, пусть время между TLP пакетами 50нс-100 нс, значит на пересылку 64 байт уйдет 800нс-1600 нс.
При дма будет так: хост записывает команду на старт дма, плис посылает TLP пакет на чтение 64 байт, хост отвечает одним TLP пакетом с 64 байтами данных. Где-то 1100 нс выйдет.

 

4 hours ago, AVR said:

Как это делать на Nios+PCIE совершенно непонятно.

Я так понимаю Nios+PCIE собраны в QSYS, у модуля PCIE есть порт Txs (Avalon Memory Mapped Slave), если в этот порт послать транзакцию на чтение данных, указать адрес (который неким образом соответствует адресу, переданному с хоста), указать burst (длину читаемых данных), то получится dma. Но у вас к PCIE подключен Nios, не знаю вроде не умеет ниос посылать burst транзакции, он обычными IO операциями по 4 байта оперирует, так что надо ставить dma контроллер, можно свой написать, подключить его к Txs параллельно ниосу.

Share this post


Link to post
Share on other sites
11 hours ago, novartis said:

Чтобы хосту записать в плис по pcie 64 байта, нужно отправить 16 TLP пакетов по 4 байта данных, пусть время между TLP пакетами 50нс-100 нс, значит на пересылку 64 байт уйдет 800нс-1600 нс.
При дма будет так: хост записывает команду на старт дма, плис посылает TLP пакет на чтение 64 байт, хост отвечает одним TLP пакетом с 64 байтами данных. Где-то 1100 нс выйдет.

 

спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта?

Share this post


Link to post
Share on other sites
1 minute ago, new123 said:

спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта?

нет. Почему вы такой вопрос задали?)
TLP пакет содержит заголовок 16 байт и данные.

Хост в простейшем случае может послать IO32 запрос на запись или на чтение, для запроса "запись" в TLP пакете будет заголовок 16 байт и 4 байта данных.

Если заюзать функцию типа такой _mm256_storeu_si256, то в TLP пакете будет заголовок 16 байт и 32 байта данных.

PCIE пакеты.pdf

Share this post


Link to post
Share on other sites

TLP минимального размера состоит из 3-х слов. (разумеется не содержит данных).

Пакеты для работы с 32-х разрядным пространством адресов имеют заголовок в 3 слова, с 64-х разрядным - 4 слова. Данные в зависимости от типа пакета.

Share this post


Link to post
Share on other sites
14 hours ago, new123 said:

спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта?

12 байт минимум для 32 битных и 16 байт минимум для 64 битных.
Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового.

Share this post


Link to post
Share on other sites
7 часов назад, AVR сказал:

Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового.

Проблемы на уровне ISA. Как вы себе представляете инструкцию CPU, которая умеет метать массивы? Для этого и придумали DMA, а CPU управляет им путём записи в его регистры.

Share this post


Link to post
Share on other sites
4 hours ago, dxp said:

Проблемы на уровне ISA. Как вы себе представляете инструкцию CPU, которая умеет метать массивы?

Ну например как инструкцию REP (x86) ;)

Share this post


Link to post
Share on other sites
On 6/10/2021 at 3:16 AM, AVR said:

12 байт минимум для 32 битных и 16 байт минимум для 64 битных.
Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового.

странно, ковырял корку XDMA от хилых, как я понял TLP транзакция там может быть переменного размера, от 4-х до 512 байт. Правда это внутри самой корки. Как это реализовано со стороны CPU я не изучал

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.