Kronac 0 Posted January 19 · Report post Продолжаю осваивать Vivado на Xilinx (пока с огромной натяжкой). Есть некая система: мастер PCIe -> AXI interconnect -> 5 слейвов (регистры, память, Jesd и прочее). У каждого слейва свой адрес на шине AXI (выровнял адреса до старших бит, для более простой дешифрации) Ну далее всё просто, беру в настройках корки, каждому бару присваиваю базовый адрес какого либо из слейвов, назначаю размер и всё норм. Через программу верхнего уровня спокойно читаю/пишу по каждому бару связанный с ним слейв. Проблема в том, что я ограничен 6-ю барами (в дальнейшем нужно будет больше слейвов). Решил попробовать простое решение, расширить один из баров в два раза и просто обращаться через него к последовательно стоящим друг за другом слейвам. Ну по логике, думаю, когда кончится адресное пространство первого, интерконнект должен перескочить на второй и работать уже с ним. Но не так-то всё просто, IP ядро PCIE почему то заворачивает адресное пространство на начало первого слейва и снова работает с ним, только сначала. К такому финту я не был готов.. Читал, искал инфу пока ничего не нашёл. Почему ядро так делает и как от этого можно избавиться? Сталкивался кто нибудь с такой проблемой? Буду очень благодарен разъяснениям =) Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted January 19 · Report post Приветствую! Слишком по BARски на каждую периферию по BARу . На один из BARов вешаете AXI interconnect, а уже к нему лепите столько периферии сколько нужно . Размер этого BAR при этому должен покрывать пространство адресов всех слейвов. Только учтите что обычные материнки могут и не выделить несколько GB под BAR. Поэтому надо аккуратно распоряжаться адресным пространством. Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
gosha-z 0 Posted January 19 · Report post По факту, в BAR должны отображаться только регистры - всем остальным пусть DMA занимается Quote Ответить с цитированием Share this post Link to post Share on other sites
Kronac 0 Posted January 20 · Report post 14 hours ago, RobFPGA said: Приветствую! Слишком по BARски на каждую периферию по BARу . На один из BARов вешаете AXI interconnect, а уже к нему лепите столько периферии сколько нужно . Размер этого BAR при этому должен покрывать пространство адресов всех слейвов. Только учтите что обычные материнки могут и не выделить несколько GB под BAR. Поэтому надо аккуратно распоряжаться адресным пространством. Удачи! Rob. Добрый день. "Размер этого BAR при этому должен покрывать пространство адресов всех слейвов." Вот так и не могу, моя материнка не запускается при создании бара больше 2G. Собственно по этому и использую два бара по 4 МБ для создания окон для работы с ДДР. Проблема как раз в том, что не получается сделать так, как Вы описали выше. Я правда пытался покрыть не все адреса всех слейвов а склеить хотя бы два слейва. Выделил объём памяти для бара равный 2-м подряд идущим слейвам. Первый нормально работает, далее вижу что адреса заворачиваются в начало и снова идёт обращение к началу первого слейва. Не понимаю почему так... Quote Ответить с цитированием Share this post Link to post Share on other sites
gosha-z 0 Posted January 20 · Report post 8 hours ago, Kronac said: использую два бара по 4 МБ для создания окон для работы с ДДР. А какой в этом смысл? Все равно быстрее, чем через DMA, не получится Quote Ответить с цитированием Share this post Link to post Share on other sites
Kronac 0 Posted January 22 · Report post On 1/20/2021 at 6:50 PM, gosha-z said: А какой в этом смысл? Все равно быстрее, чем через DMA, не получится Специфика построения системы. Огромная пропускная способность не нужна. только иногда записывать и иногда вычитывать. ДМА тоже есть но он занимается другими задачами в автоматическом режиме без связи с ПК. Программе на ПК нужен только иногда доступ к памяти на небольших скоростях. Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted January 22 · Report post Приветствую! On 1/20/2021 at 8:43 AM, Kronac said: Добрый день. "Размер этого BAR при этому должен покрывать пространство адресов всех слейвов." Вот так и не могу, моя материнка не запускается при создании бара больше 2G. Собственно по этому и использую два бара по 4 МБ для создания окон для работы с ДДР. Проблема как раз в том, что не получается сделать так, как Вы описали выше. Я правда пытался покрыть не все адреса всех слейвов а склеить хотя бы два слейва. Выделил объём памяти для бара равный 2-м подряд идущим слейвам. Первый нормально работает, далее вижу что адреса заворачиваются в начало и снова идёт обращение к началу первого слейва. Не понимаю почему так... Думаю у вас что то с настройками самого интерконнекта. Если слейвы помещаются в размер BAR то они будут в нем видны целиком. Либо я не полностью переставляю как вы мапите эти слейвы в пространства BAR. Тут надо бы видеть всю структуру интерконнекта и его настройки. Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
Kronac 0 Posted January 22 (edited) · Report post 3 hours ago, RobFPGA said: Приветствую! Думаю у вас что то с настройками самого интерконнекта. Если слейвы помещаются в размер BAR то они будут в нем видны целиком. Либо я не полностью переставляю как вы мапите эти слейвы в пространства BAR. Тут надо бы видеть всю структуру интерконнекта и его настройки. Удачи! Rob. Подключал ILA до интерконнекта и после. В итоге мне приходит не тот адрес.. Допустим есть два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого 0x2000 0000. Я назначаю бару PCIe базовый адрес на амбе 0x1000 0000. Значит после того как закончится адрес 0x1FFF FFFF , должен прийти на интерконнект адрес 0x2000 0000... Но я его не вижу, от ядра приходит снова 0x1000 0000. С размерами точно не напутал, проверял несколько раз и игрался по разному.. Edited January 22 by Kronac Quote Ответить с цитированием Share this post Link to post Share on other sites
Alex77 0 Posted January 28 · Report post ну а размер данного бара какой в настройках ? Quote Ответить с цитированием Share this post Link to post Share on other sites
Kronac 0 Posted January 28 · Report post на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно. 2 hours ago, Alex77 said: ну а размер данного бара какой в настройках ? Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted January 28 · Report post Приветствую! 13 minutes ago, Kronac said: на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно. Эээ??? Чтобы для слейвов которые находятся в пространстве одного BAR не было доступа из этого BAR? "Не верю..." Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
Alex77 0 Posted January 28 (edited) · Report post 1 час назад, Kronac сказал: на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно. ИМХО Вы сами себе ззлой буратино: "два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого 0x2000 0000." Первый располагается с 256МБ и длиной 1МБ Второй располагается с 512МБ и длиной 1МБ BAR size в таком случае должен начинаться с 256МБ и иметь размер наверно 512МБ (но никак не 1МБ и не 2 и не 4) смысл в том что у вас слейвы стоят на расстоянии в 256МБ - значит и бар должен покрывать это расстояние + размер второго слейва, и учитывать кратность основанию 2. Edited January 28 by Alex77 Quote Ответить с цитированием Share this post Link to post Share on other sites
Kronac 0 Posted January 28 · Report post 1 hour ago, Alex77 said: ИМХО Вы сами себе ззлой буратино: "два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого 0x2000 0000." Первый располагается с 256МБ и длиной 1МБ Второй располагается с 512МБ и длиной 1МБ BAR size в таком случае должен начинаться с 256МБ и иметь размер наверно 512МБ (но никак не 1МБ и не 2 и не 4) смысл в том что у вас слейвы стоят на расстоянии в 256МБ - значит и бар должен покрывать это расстояние + размер второго слейва, и учитывать кратность основанию 2. Извиняюсь. Я немного не тот скриншот выложил. Много разных вариантов пробовал запутался сам и Вас всех запутал.. Quote Ответить с цитированием Share this post Link to post Share on other sites
Alex77 0 Posted January 28 · Report post 5 минут назад, Kronac сказал: Извиняюсь. Я немного не тот скриншот выложил. Много разных вариантов пробовал запутался сам и Вас всех запутал.. каков вопрос таков ответ. ;-) Quote Ответить с цитированием Share this post Link to post Share on other sites
Kronac 0 Posted January 28 (edited) · Report post Сейчас попробую понятнее. Вот последний проект с которым пытался побороть проблему. Есть 4 SLAVE AXI . Интересует S0 и S1. Их адреса на AXI S0: 0x2 0000 0000 (512К в последнем проекте, в котором пробовал) S1: 0x2 0008 0000 (512K) Я назначаю на BAR0 базовый адрес: 0x2 0000 0000. Размер бара: 4МБ. Получаю следующую картину: где 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, но больше никуда.. 28 minutes ago, Alex77 said: каков вопрос таков ответ. ;-) Вот сейчас, надеюсь, доступно объяснил =) Понимаю, что тяжело понять, что творится в голове у другого человека и что он хочет донести со своей колокольни.. Исходных данных маловато, понимаю) Edited January 28 by Kronac Quote Ответить с цитированием Share this post Link to post Share on other sites