Jump to content

    

Recommended Posts

Проверенными методами выделяю память, и передаю начальный адрес в ПЛИС через БАР0, на стороне плис успешно его считываю, там же в БАР0 записываю бит разрешающий писать по данному адресу. В ПЛИС по этому флагу собственно вот такой механизм записи в ПК, в нем очень не уверен, думаю из-за него и проблема. Так же прочитал, что должен быть в конфигурации выставлен бит мастер шины, по 0x4 адресу = 0x0006, т.е. 2 бит выставлен верно.

            if (write_en_f = '1') then                        
                        if ((s_axis_tx_tready) = '1') then
                         s_axis_tx_tlast <= '1' after TCQ;
                         s_axis_tx_tvalid <= '1' after TCQ;
                         s_axis_tx_tdata <= (
                                                    X"11111111" & --data
                                                    st_addr & --addr
                                                    "0000000000000000" &
                                                    "00000000" &
                                                    "0000" &
                                                    "1111" &
                                                    "01000000" &
                                                    '0' &
                                                    "000" &
                                                    "0000" &
                                                    '0' &
                                                    '0' &
                                                    "00" &
                                                    "00" &
                                                    req_len
                                                    ) after TCQ;

                            s_axis_tx_tkeep <= x"FFFF" after TCQ;
                        end if;
                
                    else         
                      s_axis_tx_tlast  <= '0' after TCQ;
                      s_axis_tx_tvalid <= '0' after TCQ;
                      s_axis_tx_tdata  <= (others => '0') after TCQ;
                      s_axis_tx_tkeep  <= (others => '1') after TCQ;
                  end if; --write_en_f

Не уверен, что этого достаточно, или параметры не верны, хочу по начальному адресу для начала хотя бы записать один пакет. На ПК тишина и в области памяти нули. Синего экрана даже нет, как будто ничего и не происходит.

Edited by exigo

Share this post


Link to post
Share on other sites

Скажите, пожалуйста, кто знает, похоже на правду или я кардинально неправильно делаю :) А то всё капаю капаю, а вдруг, где 1 бит не так. Буду благодарен конечно, если скините кусок рабочего кода.

Share this post


Link to post
Share on other sites
Скажите, пожалуйста, кто знает, похоже на правду или я кардинально неправильно делаю :) А то всё капаю капаю, а вдруг, где 1 бит не так. Буду благодарен конечно, если скините кусок рабочего кода.

А как же "его величество светодиод"? Делая проект на PCI-E нужно не забывать об удобной инфраструктуре отладки, а не гадать в слепую. Надо иметь возможность четко знать "вот тут не так", а "тут как надо".

 

Могу лишь посоветовать или даже скинуть код отладки. Я отлаживаю так: есть некий буфер из полей единого формата, куда я кидаю события или значения каких-то регистров + временная метка в микросекундах например. Когда событий накопилось допустим 1000, я сбрасываю это в UART. Так можно получить ясную картину что где когда происходило и отладить проблему, сверить с моделью. Сам UART на передачу чудовищно прост: просто делитель и {1'b0, data[7:0], 1'b1} всё.

 

Еще один мой подход - PCI-E пользовательскую логику можно вынести в отдельный модуль, и его то уже моделировать, ведь интерфейс PCI-E ядер на мой взгляд примитивен, так что его легко имитировать, и таким образом отлаживать саму логику свой части в Modelsim или ином симуляторе, используя обильный принтинг ($display или $fprintf и т.д.). А уже в top-модуле просто слепить свою логику и PCI-E ядро.

Share this post


Link to post
Share on other sites

Да и светодиоды использую для проверки и chipscope, в том то и дело, что на основе моей логике и пакеты формируются и все что надо выставляется, но по заданным адресам на пк так и тишина, вот и грешу на служебные слова в заголовке пакета, что выше скидывал, хотя судя по мануалам везде нули.

 

Функция запаси или автомат формирования запроса и данных, очень меня бы спас

 

А на счет бита, это я про бит мастер шины, мало ли, где что-то подобное упустил. (кстати через светодиод и проверил)

Edited by exigo

Share this post


Link to post
Share on other sites
Да и светодиоды использую для проверки и chipscope, в том то и дело, что на основе моей логике и пакеты формируются и все что надо выставляется, но по заданным адресам на пк так и тишина, вот и грешу на служебные слова в заголовке пакета, что выше скидывал, хотя судя по мануалам везде нули.

Функция запаси или автомат формирования запроса и данных, очень меня бы спас

А на счет бита, это я про бит мастер шины, мало ли, где что-то подобное упустил. (кстати через светодиод и проверил)

Я предлагаю сделать свой отладочный модуль вместо chipscope, некий 9-битный FIFO, где 8 бит данные на каждый байт, а 9-й бит означает начало пакета. Вот это потом вывалить в UART при этом начало пакета предварять символами 0x0D 0x0A. Тогда будет видно - вот такие пакеты зашли, такие вышли. Я так и отлаживал, имея легкочитаемые пакеты перед глазами, в которых легко найти ошибку, неверный битик.

Понятно что PCI-E это скорость света, а UART улитка, но всё равно, накопив немного пакетов на огромной скорости, их потом можно неспешно выдавить в UART и скушать терминалом.

 

И да, я не вижу кода драйвера - может настройка неверна в части ПО? Добро пожаловать на paste.org.ru и ссылки сюда, можно просто приложить исходник сюда к сообщениям - этот форум имеет такую функцию.

Share this post


Link to post
Share on other sites

Снова приветствую, запись завелась, теперь новый затык.

Пишу сл. образом: шина 128 бит, Первый TLP пакет(128 бит), и следом 8 пакетов данных. Все чудесно пишется, но только некоторое время. Ниже прилагаю скрин чипскопа. Каждый эксперимент прокачивает +- одинаковое количество данных. Пробовал кольцевой буфер и 1мб и 1кб, результат примерно один. Подскажите пожалуйста, почему падает tx_ready.

post-84837-1520331120_thumb.png

Share this post


Link to post
Share on other sites
Снова приветствую, запись завелась, теперь новый затык.

Стоп стоп стоп, прошу прощения, так дело не пойдет. Это не форум техподдержки, это по сути публичная база знаний.

Что было конкретно сделано чтобы решить проблему? Прошу дать краткое описание решения.

 

Пишу сл. образом: шина 128 бит, Первый TLP пакет(128 бит), и следом 8 пакетов данных. Все чудесно пишется, но только некоторое время. Ниже прилагаю скрин чипскопа. Каждый эксперимент прокачивает +- одинаковое количество данных. Пробовал кольцевой буфер и 1мб и 1кб, результат примерно один. Подскажите пожалуйста, почему падает tx_ready.

Используемое IP-ядро само автоматически проверяет доступность "кредитов"?

Какое время пишется - надо четко указать. И что происходит когда прокачка данных завершается - она завершается досрочно с зависанием, или аварийно. Или просто пакеты перестают идти?

Share this post


Link to post
Share on other sites

Дада, вчера не успел на работе)

Поставил вивадо и запустил корку дма бета. Изучил формирование пакета и автомат управления сигналами. Собственно, чего и не хватало. До конца помогло разобраться в конфигурации ТЛП запроса, ну и организовал автомат управляющий ногами как на скрине выше.

Вот как формируется ТЛП запрос

                                    s_axis_tx_tdata <= (
                                                        dma_addr & --lo addr
                                                        X"00000000" & --hi addr
                                                        X"0600" & --RID
                                                        "10000000"&--tx_tag
                                                        "1111" &
                                                        "1111" &
                                                        "01100000" & --write
                                                        '0' &
                                                        "000" &
                                                        "0000" &
                                                        '0' &
                                                        '0' &
                                                        "00" &
                                                        "00" &
                                                        "0000100000"    --32 DW                                            
                                                        ) after TCQ;

Передача как на скрине выше, организована циклическая запись, запись по сигнала Tx_ready. Валится Tx_ready от ядра и все встает(комп не зависает). По времени пересылает 125-130 пачек (TLP+8пакетов данных).

Может в ядре что-то сбрасывать надо периодически? Или в конфиге бит какой важный

 

update:

через BAR могу управлять dma_en своим сигналом, т.е. pcie устройство не отваливается, но запись более не происходит, т.к. tx_ready от ядра нет

upd2:

добавил после пачек не 1 такт нулевой а 3, и поток пишется, есть такие же застои иногда, но не сдыхает. По расчетам 1.3 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся :) На двух тактах работает несколько секунд и сдыхал.

Edited by exigo

Share this post


Link to post
Share on other sites
добавил после пачек не 1 такт нулевой а 3, и поток пишется, есть такие же застои иногда, но не сдыхает. По расчетам 1.3 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся :) На двух тактах работает несколько секунд и сдыхал.

Что если насыпать туда заведомо лошадиное количество пустых тактов? Что будет? И оставить на час - и понять, будут ли затыки, просадки.

Потом можно будет вернуть до 3-4 пустых.

Share this post


Link to post
Share on other sites

Вернул на минимальную паузу в один такт между TLP, добавил в этот такт доп проверку tx_buf (количество свободных буферов ядра), не даю им опуститься ниже 8, если опускается то в отдельном состояние автомата ожидает, пока ядро переварит и продолжает запись. Добился 1.6 ГБ/с.

И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать

Share this post


Link to post
Share on other sites
И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать
Max payload определяется по совокупности всего пути от вашего устройства до root complex. Если там есть хоть один с max payload в 128, то можете у себя хоть 10G поставить - всё равно будет не более 128 :)

Share this post


Link to post
Share on other sites
Вернул на минимальную паузу в один такт между TLP, добавил в этот такт доп проверку tx_buf (количество свободных буферов ядра), не даю им опуститься ниже 8, если опускается то в отдельном состояние автомата ожидает, пока ядро переварит и продолжает запись. Добился 1.6 ГБ/с.

И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать

 

 

1.6 Гбайт/с это и есть предел. Обычно можно брать за правду правило - 200 Мбайт/с на 1 lane 1 gen, т.е. x4 gen2 это и есть около 200*4*2 = 1600 Мбайт/с.

Вот XAPP1289 где гоняли данные ПЛИС-to-ПЛИС https://www.xilinx.com/support/documentatio...89-dma-pcie.pdf

Share this post


Link to post
Share on other sites

Всем привет, благополучно юзал pcie. Но тут мне обновили ПК и на новом железе все перестало работать. Мой проект успешно позволяет записать управляющие адреса и размер буфера в БАР, но после включения ДМА устройство отваливается и в БАР 0xffffffffff все, или и того виснет комп.

Решил проверить на xilinx примерах дма стримера и дма передачи(от которых отталкивался и они работали на старом ПК), после загрузки в железо комп сразу зависает, даже драйвер не дает поставить.

Подскажите пожалуйста, в какую сторону копать?

 

В устройстве проблем нет, подключил к компу схожим на мой старый, все путем.

 

Share this post


Link to post
Share on other sites
Всем привет, благополучно юзал pcie. Но тут мне обновили ПК и на новом железе все перестало работать. Мой проект успешно позволяет записать управляющие адреса и размер буфера в БАР, но после включения ДМА устройство отваливается и в БАР 0xffffffffff все, или и того виснет комп.

Решил проверить на xilinx примерах дма стримера и дма передачи(от которых отталкивался и они работали на старом ПК), после загрузки в железо комп сразу зависает, даже драйвер не дает поставить.

Подскажите пожалуйста, в какую сторону копать?

 

В устройстве проблем нет, подключил к компу схожим на мой старый, все путем.

Может в теме этот вопрос был отвечен, но я всю тему не помню. Поэтому спрошу - Вы кредиты смотрите? Ждете необходимого минимального значения кредитов прежде чем слать?

У меня была такая проблема - на новом быстром компе проблем не было, на старом висло, потому что не успевало выгребать из буферов. В любом случае, так называемые кредиты - очень важная деталь, и ее нужно обязательно проверять в процессе работы.

 

Выше увидел, вы опираетесь на tx_ready. Оно может дает возможность слать, если приемные буфера приемной стороны хоть немного свободны, только достаточно ли в них места? Так что просто на tx_ready я бы не полагался, хотя Xilinx PCI-E еще не нюхал, предстоит до НГ освоить PCI на Xilinx.

Edited by AVR

Share this post


Link to post
Share on other sites

В последних версиях еще отслеживаю кредиты (tx_buf)

Но дело в том, что комп быстрее стал, и раньше когда не хватало кредитов он не зависал.

И интересно, что xilinx примеры не запускаются.

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