Перейти к содержанию
    

XILINX Vivado 18.3 and PCIe. Как адресовать через interconnect несколько слейвов на шине AXI в один бар на PCIe

Продолжаю осваивать Vivado на Xilinx (пока с огромной натяжкой). Есть некая система: мастер PCIe -> AXI interconnect -> 5 слейвов (регистры, память, Jesd и прочее).  У каждого слейва свой адрес на шине AXI (выровнял адреса до старших бит, для более простой дешифрации)

image.thumb.png.4461a6f5f22ec2b9b3d973d30b199dd0.png

Ну далее всё просто, беру в настройках корки, каждому бару присваиваю базовый адрес какого либо из слейвов, назначаю размер и всё норм. Через программу верхнего уровня спокойно читаю/пишу по каждому бару связанный с ним слейв.

image.thumb.png.0b0d010a2b7a16d4a2321eb0921d358b.png

Проблема в том, что я ограничен 6-ю барами (в дальнейшем нужно будет больше слейвов). Решил попробовать простое решение, расширить один из баров в два раза и просто обращаться через него к последовательно стоящим друг за другом слейвам. Ну по логике, думаю, когда кончится адресное пространство первого, интерконнект должен перескочить на второй и работать уже с ним. 

Но не так-то всё просто, IP ядро PCIE почему то заворачивает адресное пространство на начало первого слейва и снова работает с ним, только сначала. К такому финту я не был готов.. Читал, искал инфу пока ничего не нашёл. Почему ядро так делает и как от этого можно избавиться? Сталкивался кто нибудь с такой проблемой? Буду очень благодарен разъяснениям =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Слишком по BARски  на каждую периферию  по  BARу :biggrin:.

На  один из BARов вешаете  AXI interconnect, а уже к нему  лепите столько периферии сколько нужно .   Размер  этого BAR при этому должен покрывать пространство адресов всех слейвов.
Только учтите  что  обычные материнки могут и не выделить несколько GB под BAR. Поэтому надо аккуратно распоряжаться адресным пространством.     

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По факту, в BAR должны отображаться только регистры - всем остальным пусть DMA занимается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, RobFPGA said:

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

Слишком по BARски  на каждую периферию  по  BARу :biggrin:.

На  один из BARов вешаете  AXI interconnect, а уже к нему  лепите столько периферии сколько нужно .   Размер  этого BAR при этому должен покрывать пространство адресов всех слейвов.
Только учтите  что  обычные материнки могут и не выделить несколько GB под BAR. Поэтому надо аккуратно распоряжаться адресным пространством.     

 

Удачи! Rob.

Добрый день. "Размер  этого BAR при этому должен покрывать пространство адресов всех слейвов." Вот так и не могу, моя материнка не запускается при создании бара больше 2G. Собственно по этому и использую два бара по 4 МБ для создания окон для работы с ДДР. Проблема как раз в том, что не получается сделать так, как Вы описали выше. Я правда пытался покрыть не все адреса всех слейвов а склеить хотя бы два слейва. Выделил объём памяти для бара равный 2-м подряд идущим слейвам. Первый нормально работает, далее вижу что адреса заворачиваются в начало и снова идёт обращение к началу первого слейва. Не понимаю почему так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, Kronac said:

использую два бара по 4 МБ для создания окон для работы с ДДР.

А какой в этом смысл? Все равно быстрее, чем через DMA, не получится

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/20/2021 at 6:50 PM, gosha-z said:

А какой в этом смысл? Все равно быстрее, чем через DMA, не получится

Специфика построения системы. Огромная пропускная способность не нужна. только иногда записывать и иногда вычитывать. ДМА тоже есть но он занимается другими задачами в автоматическом режиме без связи с ПК. Программе на ПК нужен только иногда доступ к памяти на небольших скоростях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

On 1/20/2021 at 8:43 AM, Kronac said:

Добрый день. "Размер  этого BAR при этому должен покрывать пространство адресов всех слейвов." Вот так и не могу, моя материнка не запускается при создании бара больше 2G. Собственно по этому и использую два бара по 4 МБ для создания окон для работы с ДДР. Проблема как раз в том, что не получается сделать так, как Вы описали выше. Я правда пытался покрыть не все адреса всех слейвов а склеить хотя бы два слейва. Выделил объём памяти для бара равный 2-м подряд идущим слейвам. Первый нормально работает, далее вижу что адреса заворачиваются в начало и снова идёт обращение к началу первого слейва. Не понимаю почему так...

Думаю у вас что то с настройками  самого интерконнекта.   Если слейвы  помещаются  в  размер BAR  то они  будут  в нем видны целиком.  Либо я не полностью  переставляю как вы мапите эти слейвы  в пространства BAR.  

Тут  надо бы видеть всю структуру интерконнекта  и его настройки.

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, RobFPGA said:

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

Думаю у вас что то с настройками  самого интерконнекта.   Если слейвы  помещаются  в  размер BAR  то они  будут  в нем видны целиком.  Либо я не полностью  переставляю как вы мапите эти слейвы  в пространства BAR.  

Тут  надо бы видеть всю структуру интерконнекта  и его настройки.

 

Удачи! Rob.

Подключал ILA до интерконнекта и после. В итоге мне приходит не тот адрес..  Допустим есть два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого  0x2000 0000. Я назначаю бару PCIe базовый адрес на амбе 0x1000 0000. Значит после того как закончится адрес  0x1FFF FFFF , должен прийти на интерконнект адрес 0x2000 0000... Но я его не вижу, от ядра приходит снова 0x1000 0000. С размерами точно не напутал, проверял несколько раз и игрался по разному..

Изменено пользователем Kronac

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно.

2 hours ago, Alex77 said:

ну а размер данного бара какой в настройках ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

13 minutes ago, Kronac said:

на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно.

Эээ???  Чтобы  для  слейвов  которые  находятся в пространстве одного BAR  не было доступа из этого BAR?  :shok:  "Не  верю..." 

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Kronac сказал:

на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно.

 

ИМХО Вы сами себе ззлой буратино:

"два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого  0x2000 0000."

Первый располагается с 256МБ и длиной 1МБ

Второй располагается с 512МБ и длиной 1МБ

BAR size в таком случае должен начинаться с  256МБ и иметь размер наверно 512МБ (но никак не 1МБ и не 2 и не 4)

смысл в том что у вас слейвы стоят на расстоянии в 256МБ - значит и бар должен покрывать это расстояние + размер второго слейва, и учитывать кратность основанию 2.

Изменено пользователем Alex77

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Alex77 said:

ИМХО Вы сами себе ззлой буратино:

"два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого  0x2000 0000."

Первый располагается с 256МБ и длиной 1МБ

Второй располагается с 512МБ и длиной 1МБ

BAR size в таком случае должен начинаться с  256МБ и иметь размер наверно 512МБ (но никак не 1МБ и не 2 и не 4)

смысл в том что у вас слейвы стоят на расстоянии в 256МБ - значит и бар должен покрывать это расстояние + размер второго слейва, и учитывать кратность основанию 2.

 

Извиняюсь. Я немного не тот скриншот выложил. Много разных вариантов пробовал запутался сам и Вас всех запутал..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Kronac сказал:

Извиняюсь. Я немного не тот скриншот выложил. Много разных вариантов пробовал запутался сам и Вас всех запутал..

каков вопрос таков ответ.

;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас попробую понятнее. Вот последний проект с которым пытался побороть проблему.

Есть 4 SLAVE AXI . Интересует S0 и S1. Их адреса на AXI 

S0: 0x2 0000 0000 (512К в последнем проекте, в котором пробовал)

S1: 0x2 0008 0000 (512K)

 717962282_1.thumb.JPG.083438b9532e162550c93d8bb7c430f3.JPG

Я назначаю на BAR0 базовый адрес: 0x2 0000 0000. Размер бара: 4МБ.

1935055041_.thumb.JPG.acd5d6808ad65af65e8d56e0c416b2c6.JPG

Получаю следующую картину: 

где S00 - PCIe; S01 - JTAG . Читая через компьютер первый бар, я имею доступ только к M02 (S0: 0x2 0000 0000)

При попытке доступа к M03 (S1: 0x2 0008 0000) адресация закручивается в интерконнекте и снова обращается к M02..

 

При этом в системе есть ещё JTAG консоль. И с её помощью я спокойно читаю\пишу в M02 и M03.

Либо если я назначу на BAR1 базовый адрес 0x2 0008 0000, то по PCIe через BAR0 будет доступ к M02, а через BAR1 будет доступ к M03, но больше никуда..

347367592_3.thumb.JPG.ccbb99164fddbae1ecae91b4c394d9fb.JPG

28 minutes ago, Alex77 said:

каков вопрос таков ответ.

;-)

Вот сейчас, надеюсь, доступно объяснил =) Понимаю, что тяжело понять, что творится в голове у другого человека и что он хочет донести со своей колокольни.. Исходных данных маловато, понимаю)

Изменено пользователем Kronac

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...