реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> kintex7+pci-e
exigo
сообщение Jan 9 2018, 09:32
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 30-01-15
Пользователь №: 84 837



Проверенными методами выделяю память, и передаю начальный адрес в ПЛИС через БАР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

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

Сообщение отредактировал exigo - Jan 9 2018, 09:35
Go to the top of the page
 
+Quote Post
exigo
сообщение Jan 15 2018, 04:31
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 30-01-15
Пользователь №: 84 837



Скажите, пожалуйста, кто знает, похоже на правду или я кардинально неправильно делаю sm.gif А то всё капаю капаю, а вдруг, где 1 бит не так. Буду благодарен конечно, если скините кусок рабочего кода.
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 15 2018, 07:12
Сообщение #33


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 224
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(exigo @ Jan 15 2018, 07:31) *
Скажите, пожалуйста, кто знает, похоже на правду или я кардинально неправильно делаю sm.gif А то всё капаю капаю, а вдруг, где 1 бит не так. Буду благодарен конечно, если скините кусок рабочего кода.

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
exigo
сообщение Jan 15 2018, 08:26
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 30-01-15
Пользователь №: 84 837



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

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

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

Сообщение отредактировал exigo - Jan 15 2018, 08:34
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 15 2018, 12:47
Сообщение #35


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 224
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(exigo @ Jan 15 2018, 11:26) *
Да и светодиоды использую для проверки и chipscope, в том то и дело, что на основе моей логике и пакеты формируются и все что надо выставляется, но по заданным адресам на пк так и тишина, вот и грешу на служебные слова в заголовке пакета, что выше скидывал, хотя судя по мануалам везде нули.
Функция запаси или автомат формирования запроса и данных, очень меня бы спас
А на счет бита, это я про бит мастер шины, мало ли, где что-то подобное упустил. (кстати через светодиод и проверил)

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

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


--------------------
Go to the top of the page
 
+Quote Post
exigo
сообщение Mar 6 2018, 10:12
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 30-01-15
Пользователь №: 84 837



Снова приветствую, запись завелась, теперь новый затык.
Пишу сл. образом: шина 128 бит, Первый TLP пакет(128 бит), и следом 8 пакетов данных. Все чудесно пишется, но только некоторое время. Ниже прилагаю скрин чипскопа. Каждый эксперимент прокачивает +- одинаковое количество данных. Пробовал кольцевой буфер и 1мб и 1кб, результат примерно один. Подскажите пожалуйста, почему падает tx_ready.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 6 2018, 12:00
Сообщение #37


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 224
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(exigo @ Mar 6 2018, 13:12) *
Снова приветствую, запись завелась, теперь новый затык.

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
exigo
сообщение Mar 7 2018, 03:54
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 30-01-15
Пользователь №: 84 837



Дада, вчера не успел на работе)
Поставил вивадо и запустил корку дма бета. Изучил формирование пакета и автомат управления сигналами. Собственно, чего и не хватало. До конца помогло разобраться в конфигурации ТЛП запроса, ну и организовал автомат управляющий ногами как на скрине выше.
Вот как формируется ТЛП запрос
Код
                                    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 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся sm.gif На двух тактах работает несколько секунд и сдыхал.

Сообщение отредактировал exigo - Mar 7 2018, 08:53
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 7 2018, 09:39
Сообщение #39


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 224
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(exigo @ Mar 7 2018, 06:54) *
добавил после пачек не 1 такт нулевой а 3, и поток пишется, есть такие же застои иногда, но не сдыхает. По расчетам 1.3 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся sm.gif На двух тактах работает несколько секунд и сдыхал.

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


--------------------
Go to the top of the page
 
+Quote Post
exigo
сообщение Mar 14 2018, 09:00
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 30-01-15
Пользователь №: 84 837



Вернул на минимальную паузу в один такт между TLP, добавил в этот такт доп проверку tx_buf (количество свободных буферов ядра), не даю им опуститься ниже 8, если опускается то в отдельном состояние автомата ожидает, пока ядро переварит и продолжает запись. Добился 1.6 ГБ/с.
И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 14 2018, 10:15
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 3 073
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(exigo @ Mar 14 2018, 12:00) *
И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать
Max payload определяется по совокупности всего пути от вашего устройства до root complex. Если там есть хоть один с max payload в 128, то можете у себя хоть 10G поставить - всё равно будет не более 128 sm.gif
Go to the top of the page
 
+Quote Post
toshas
сообщение Mar 14 2018, 15:47
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 365
Регистрация: 14-02-06
Пользователь №: 14 339



Цитата(exigo @ Mar 14 2018, 12:00) *
Вернул на минимальную паузу в один такт между 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
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd April 2018 - 17:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01049 секунд с 7
ELECTRONIX ©2004-2016