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

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

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


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

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

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


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

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

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

 

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

 

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

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


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

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

 

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

 

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

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

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


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

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

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

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

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

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

 

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

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


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

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

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

post-84837-1520331120_thumb.png

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


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

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

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

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

 

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

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

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

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


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

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

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

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

                                    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 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся :) На двух тактах работает несколько секунд и сдыхал.

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

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


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

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

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

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

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


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

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

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

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


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

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

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


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

Вернул на минимальную паузу в один такт между 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

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


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

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

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

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

 

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

 

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


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

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

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

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

 

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

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

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

 

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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