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

PCI 32x33 на Xilinx

Всем доброго времени суток.

Столкнулся вот с чем. PCI - мастер (плата, на ней Xilinx с PCI 32x33) читает и пишет в память. Читает со скоростью 300 Mbit/s, пишет со скоростью 900 Mbit/s.

Когда данные передаются из платы ("плата пишет"), кол-во слов в одной транзакции регулируется параметром LATENCY_TIMER.

Но изменение этого параметра не влияет на кол-во слов в одной транзакции, когда данные передаются в плату ("плата читает").

Возникает два вопроса:

1. Это нормально?

2. Какой параметр управляет кол-ом слов в одной транзакции, когда "плата читает"?

Если кто сталкивался, буду благодарен за ответ.

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


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

Встречный вопрос, плата читает непосредственно в ПЛИС или например в память на плате. Может у устройств различается скорость чтения/записи, примерно в три раза.

Как у флеш памяти, к примеру ~3 и ~10 МБит/с.

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


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

Встречный вопрос, плата читает непосредственно в ПЛИС или например в память на плате. Может у устройств различается скорость чтения/записи, примерно в три раза.

Как у флеш памяти, к примеру ~3 и ~10 МБит/с.

 

 

Плата читает непосредственно в ПЛИС.

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


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

Всем доброго времени суток.

Столкнулся вот с чем. PCI - мастер (плата, на ней Xilinx с PCI 32x33) читает и пишет в память. Читает со скоростью 300 Mbit/s, пишет со скоростью 900 Mbit/s.

...

1. Это нормально?

 

Это нормально. Скорость чтения всегда меньше скорости записи. Это происходит из-за начальной задержки ответа.

Увеличение скорости может произойти только при увеличении блока данных.

 

2. Какой параметр управляет кол-ом слов в одной транзакции, когда "плата читает"?

 

На PCI шине размер блока определяется только длительностью сигнала IRDY.

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


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

На PCI шине размер блока определяется только длительностью сигнала IRDY.

 

Секундочку.

На PCI шине в транзакции участвуют несколько сигналов. В частности, применительно к моему случаю, для чтения, происходит следующее.

Плата выставляет IRDY, через 1 такт "цель" выставляет TRDY. Спустя 16 тактов "цель" выставляет сигнал STOP, через такт снимается TRDY, ещё через такт снимается IRDY.

Далее плата пытается несколько раз выставить IRDY, но "цель" сигналом STOP обрубает эти попытки.

Примечательно то, что при записи "цель" сигналы STOP не вырабатывает.

Есть подозрение, что здесь как-то замешаны регистры MIN_GNT и MAX_LAT (У меня MIN_GNT=0F, MAX_LAT=FF), но нет чёткого понимания их функций.

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


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

Получается, что HOST даёт прочитать 16 слов а на последующее обращения отвечает RETRY. В принципе - имеет право.

Посмотрел что установлено на контроллере PCI9056 от PLX:

 

MAX_LAT 0

MIN_GNT 0xFF

 

PLX при этом обеспечивает скорость чтения до 90 МБайт/с

 

Может стоит попробовать изменить эти значения ?

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


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

Получается, что HOST даёт прочитать 16 слов а на последующее обращения отвечает RETRY. В принципе - имеет право.

Посмотрел что установлено на контроллере PCI9056 от PLX:

 

MAX_LAT 0

MIN_GNT 0xFF

 

PLX при этом обеспечивает скорость чтения до 90 МБайт/с

 

Может стоит попробовать изменить эти значения ?

 

Попробовал. Эффекта нет.

Насколько я понимаю, HOST отвечает не RETRY, а Disconnect, так как данные всё же передаются.

Т.е. получается, что "цель" неспособна продолжать блочную передачу. "... Вызвано неспособностью цели ответить в пределах требования времени ожидания..."

Но вот в чем казус, при записи-то HOST поддерживает блоки=64 слова.

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


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

1. PCI шина с точки зрения мастера как по записи так и по чтению имеет одинаковую пропускную способность (при одинаковой длине транзакции). А на самом деле пропускная способность определяется возможностями Target. Сделаю предположение, что Вы подключаете плату в обычный PCI слот компьютера. Тогда скорость чтения мастерм будет определяться чипсетом, а если быть точным то южным мостом. Южный мост - это така же микросхема придуманая людьми :) и построена на тех же принципах, что и ваше устройство. Когда южный мост получает команду чтения из памяти он ее перенаправляет северному мосту, а что бы PCI шина не простаивала пока данных не пришли выставляет такое состояние как Disconect without data. Если Вы повторяете свой запрос, мост зная что он такое уже обслужил делает тоже самое несколько раз, до тех пор пока северный мост (общающийся с памятью) не пришлет ему пакет с размером краным степени 2, например 16 слов. Высылаются данные именно таким количеством, потому что по шине PCI нельзя определить, сколько именно мастер хочет получить данных. После получения данных южным мостом, он складывает их себе в буфер и далее как только получит очередной запрос на чтение из этого адреса выдаст данные без задержки.

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

3. Как добиться большей скорости чтения по PCI? Поскольку мы знаем, что чтение генерирует запрос на северный мост и ждет от него ответа, то для повышения пропускной способности необходимо выполнить несколько запросов по нарастающим адресам с шагом, например, в 16 слов. Таким образом южный мост сгенерирует несколько запросов северному собрату и получит все данные. При последующем чтении Вы получите все свои данные с меньшим интервалом между запросами. Называется эта технология - спекулятивное (упреждающее) чтение.

;)

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


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

1. PCI шина с точки зрения мастера как по записи так и по чтению имеет одинаковую пропускную способность (при одинаковой длине транзакции). А на самом деле пропускная способность определяется возможностями Target. Сделаю предположение, что Вы подключаете плату в обычный PCI слот компьютера. Тогда скорость чтения мастерм будет определяться чипсетом, а если быть точным то южным мостом. Южный мост - это така же микросхема придуманая людьми :) и построена на тех же принципах, что и ваше устройство. Когда южный мост получает команду чтения из памяти он ее перенаправляет северному мосту, а что бы PCI шина не простаивала пока данных не пришли выставляет такое состояние как Disconect without data. Если Вы повторяете свой запрос, мост зная что он такое уже обслужил делает тоже самое несколько раз, до тех пор пока северный мост (общающийся с памятью) не пришлет ему пакет с размером краным степени 2, например 16 слов. Высылаются данные именно таким количеством, потому что по шине PCI нельзя определить, сколько именно мастер хочет получить данных. После получения данных южным мостом, он складывает их себе в буфер и далее как только получит очередной запрос на чтение из этого адреса выдаст данные без задержки.

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

3. Как добиться большей скорости чтения по PCI? Поскольку мы знаем, что чтение генерирует запрос на северный мост и ждет от него ответа, то для повышения пропускной способности необходимо выполнить несколько запросов по нарастающим адресам с шагом, например, в 16 слов. Таким образом южный мост сгенерирует несколько запросов северному собрату и получит все данные. При последующем чтении Вы получите все свои данные с меньшим интервалом между запросами. Называется эта технология - спекулятивное (упреждающее) чтение.

;)

 

Временно забудем про задержку между транзакциями. Есть ли способ заставить северный мост передавать южному не по 16 слов, а по 64 слова?

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


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

Я Вам это уже написал используйте спекулятивное чтение. Других методов заставить пересылать большее количество данных я не знаю. А 16 слов - это размер строки в кэш памяти процессора. Поэтому контроллер памяти в северном мосте пересылает именно столько.

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


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

Временно забудем про задержку между транзакциями. Есть ли способ заставить северный мост передавать южному не по 16 слов, а по 64 слова?

 

А ваше устройство использует "MEMORY READ" или "MEMORY READ MULTIPLE"? Последняя команда как раз может и намекнуть бриджу, что читать будут много. Впрочем, это будет зависеть от конкретного бриджа. Некоторые имплементации реагируют на обе команды идентично.

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


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

А ваше устройство использует "MEMORY READ" или "MEMORY READ MULTIPLE"? Последняя команда как раз может и намекнуть бриджу, что читать будут много. Впрочем, это будет зависеть от конкретного бриджа. Некоторые имплементации реагируют на обе команды идентично.

 

 

YES!!!

Изменил на "MEMORY READ MULTIPLE", скорость чтения стала 700 Mbit/s.

По поводу упреждающего чтения, попробую как-нибудь на досуге.

Всех благодарю за помощь.

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


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

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

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

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

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

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

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

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

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

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