Jump to content

    
Sign in to follow this  
Kronac

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

Recommended Posts

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

image.thumb.png.4461a6f5f22ec2b9b3d973d30b199dd0.png

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

image.thumb.png.0b0d010a2b7a16d4a2321eb0921d358b.png

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

Удачи! Rob.

Share this post


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

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

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

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

 

Удачи! Rob.

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

Share this post


Link to post
Share on other sites
8 hours ago, Kronac said:

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

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

Share this post


Link to post
Share on other sites
On 1/20/2021 at 6:50 PM, gosha-z said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
3 hours ago, RobFPGA said:

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

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

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

 

Удачи! Rob.

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

Edited by Kronac

Share this post


Link to post
Share on other sites

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

2 hours ago, Alex77 said:

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

 

Share this post


Link to post
Share on other sites

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

13 minutes ago, Kronac said:

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
1 час назад, Kronac сказал:

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

 

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

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

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

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

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

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

Edited by Alex77

Share this post


Link to post
Share on other sites
1 hour ago, Alex77 said:

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

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
5 минут назад, Kronac сказал:

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

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

;-)

Share this post


Link to post
Share on other sites

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

Есть 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:

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

;-)

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

Edited by Kronac

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.

Sign in to follow this