Скачиваний:
117
Добавлен:
15.09.2014
Размер:
2.71 Mб
Скачать

Устройство само может и не пользоваться этими возможностями (см. бит 7 регистра команд), но должно «понимать» такие циклы. Задерживая сигнал FRAME*, устройство рискует потерять право доступа к шине, если арбитр получит запрос от более приоритетного устройства.

Протокол квитирования обеспечивает надежность обмена — ведущее устройство всегда получает информацию об отработке транзакции ЦУ. Средством повышения надежности (достоверности) является применение контроля паритета: линии AD[31:0] и С/ВЕ[3:0]# и в фазе адреса, и в фазе данных защищены битом паритета PAR (количество единичных бит этих линий, включая PAR, должно быть четным). Действительное значение PAR появляется на шине с задержкой в один такт относительно линий AD и С/ВЕ#. При обнаружении ошибки ЦУ вырабатывается сигнал PERR* (со сдвигом на такт после действительности бита паритета). В подсчете паритета при передаче данных учитываются все байты, включая и недействительные (отмеченные высоким уровнем сигнала С/ВЕх#). Состояние бит, даже и в недействительных байтах данных, во время фазы данных должно оставаться стабильным.

Каждая транзакция на шине должна быть завершена планово или прекращена, при этом шина должна перейти в состояние покоя (сигналы FRAME* и IRDY# пассивны). Завершение транзакции выполняется либо по инициативе ведущего устройства, либо по инициативе ПУ. Ведущее устройство может завершить транзакцию одним из следующих способов.

Нормальное завершение ( Camletiori) выполняется по окончании обмена данными.

Завершение по тайм-ауту (Time-out) происходит, когда во время транзакции у ведущего устройства отбирают право науправление шиной (снятием сигнала GNT#) и истекает время, указанное в его таймере Latency Timer. Это может случиться, если адресованное ЦУ оказалось непредвиденно медленным или запланирована слишком длинная транзакция. Короткие транзакции (с одной - двумя фазами данных) даже в случае снятия сигнала GNT# и срабатывания таймера завершаются нормально. Транзакция отвергается (Master-Abort), когда в течение заданного времени ведущее устройство не получает ответа ЦУ (DEVSEL*).

Транзакция может быть прекращена по инициативе ЦУ; для этого оно может ввести сигнал STOP*. Возможны три типа прекращения.

Повтор (Retry) — сигнал STOP* вводится при пассивном сигнале TRDY* до первойфазы данных. Этаситуация возникает, когда ЦУ из-за внутренней занятости не успевает выдать первые данные в положенный срок (16 тактов). Повтор являетсяуказаниемведущемуустройствуна необходимостьновогозапускатойже транзакции.

Отключение (Disconnect) — сигнал STOP* вводится во время или после первой фазы данных. Если сигнал STOP* введен при активном сигнале TRDY* очереднойфазыданных, тоэтиданные передаютсяинатомтранзакциязавершается. Если сигнал STOP* введен при пассивном сигнале TRDY*, то транзакция завершаетсябезпередачиданныхочереднойфазы. Отключение производится, когдаЦУнеспособносвоевременновыдатьилипринятьочереднуюпорциюданных пакета.

Отказ (Target-Abort) — сигнал STOP* вводится одновременно со снятием сигнала DEVSEL* (в предыдущих случаях во время появление сигнала STOP* сигнал DEVSEL* был активен). После этого данные уже не передаются. Отказ вводится, когдаЦУобнаруживаетфатальнуюошибку или иныеусловия, покоторымоноуженикакнесможетобслужитьданныйзапрос.

Использование трех типов прекращения вовсе не обязательно для всех ЦУ, однако любое ведущее устройство должно быть готово к завершению транзакций по любой из этих причин.

6.2.3. Команды шины, адресация памяти и ввода-вывода

Работа шины контролируется несколькими таймерами, не позволяющими попусту расходовать такты шины и планировать распределение полосы пропускания. Каждое ЦУ должно достаточно быстро отвечать на адресованную ему транзакцию.

Задержка первой фазы данных (target initial latency), то есть задержка появления сигнала TRDY* относительно FRAME*, не должна превышать 16тактов-шины. Если устройство

по своей природе иногда может не успевать уложиться в этот интервал, оно должно формировать сигнал STOP*, прекращая транзакцию. Это заставит ведущее устройство повторить транзакцию, и с большой вероятностью эта попытка окажется успешной. Если устройство медленное и часто не укладывается в 16 тактов, то оно должно откладывать транзакцию (Delayed Transaction). Кроме того, ЦУ имеет инкрементный механизм слежения за длительностью циклов (Incremental Latency Mechanism), который не позволяет интервалу между соседними фазами данных ъ пакете (target subsequent latency) превышать 8 тактов шины. Если ЦУ не успевает работать в таком темпе, оно обязано остановить транзакцию. Желательно, чтобы устройство сообщало о своем «неуспевании» как можно раньше, не выжидая предельных 16 или 8 тактов, — это экономит полосу пропускания шины.

Инициатор тоже не должен задерживать поток — допустимая задержка от начала FRAME* до сигнала IRDY* (master data latency) и между фазами данных не должна превышать 8 тактов. Если ЦУ время от времени отвергает операцию записи в память с запросом повтора (это, к примеру, может происходить при записи в видеопамять), то есть «предел терпения» для завершения операции. Таймер максимального времени исполнения (maximum complete time) имеет порог 10 мкс — 334 такта при 33 МГц или 668 тактов на 66 МГц, за которое инициатор должен иметь возможность «протолкнуть» хоть одну фазу данных. Таймер начинает отсчет с момента запроса повтора операции записи в память и сбрасывается при последующем завершении транзакции записи в память, отличном от запроса повтора. Устройства, не способные выдерживать ограничение на максимальное время исполнения записи в память, должны предоставлять драйверу возможность определять их состояние, в котором достаточно быстрая запись в память невозможна. Драйвер, естественно, должен учитывать это состояние и не «напрягать» шину и устройство бесплодными попытками записи.

Каждое ведущее устройство, способное сформировать пакет с более чем двумя фазами данных, должно иметь собственный программируемый таймер задержки (Latency Timer), регулирующий поведение ведущего устройства, когда у него отбирают право управления шиной. Таймер запускается по каждому сигналу FRAME*, введенному этим ведущим устройством. Поведение ведущего устройства по достижении порога зависит от типа команды и состояния сигналов FRAME* и GNT* на момент срабатывания таймера.

Если ведущее устройство снимает сигнал FRAME* до срабатывания таймера, транзакция завершается нормально.

Если сигнал GNT# снят и исполняемая команда не является записью памяти с инвалидацией, то инициатор обязан сократить транзакцию, сняв сигнал FRAME*.При этом ему позволяется завершить текущую и выполнить еще одну фазу данных.

Если сигнал GNT# снят и исполняется запись в память с инвалидацией, то инициатор должен завершить транзакцию по концу текущей (если передается непоследнее двойное слово строки) или следующей (если двойное слово — последнее) строки кэша.

Задержка арбитража (arbitration latency) определяется как число тактов от подачи инициатором запроса REQ# до получения права управления шиной GNT#. Эта задержка зависит от активности других инициаторов, быстродействия устройств (чем меньше они вводят тактов ожидания, тем лучше) и «проворности» собственно арбитра. В зависимости от исполняемой команды и состояния сигналов ведущее устройство должно либо сократить транзакцию, либо продолжать ее до запланированного завершения.

При конфигурировании ведущие устройства сообщают свои потребности, указывая максимально допустимую задержку предоставления доступа к шине (Max_Lat) и минимальное время, на которое им должно предоставляться управление шиной (Mi n_GNT). Эти потребности определяются присущим устройству темпом передачи данных и его организацией.

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

устройств со скоростью передачи данных до 5 Мбайт/с иметь буфер, по крайней мере, на 4 двойных слова. Для более высоких скоростей рекомендуется буфер на 32 двойных слова. Для обмена с системной памятью наиболее эффективны транзакции, работающие с целыми строками кэша, что тоже учитывают при определении размера буфера. Однако увеличение размера буфера может вызвать трудности при обработке ошибок, а также вести к увеличению задержек доставки данных (пока устройство не заполнит определенный объем буфера, оно не начнет передачу этих данных по шине, и их потребители будут ожидать).

В спецификации приводится пример организации карты Fast Ethernet (скорость передачи

— 10 Мбайт/с), у которой для каждого направления передачи имеется 64-байтный буфер, поделенный на две половины. Когда адаптер заполняет одну половину буфера приходящим кадром, он выводит в память накопленное содержимое другой половины, после чего они меняются местами. Каждая половина выводится в память за 8 фаз данных (около 0,25 мкс на частоте 33 МГц), что соответствует установке MIN_GNT=1. При скорости прихода данных 10 Мбайт/с каждая половина заполняется за 3,2 мкс, что соответствует установке М AX_L АТ= 12 (здесь время задается в интервалах по 0,25 мкс).

6.2.4. Таймеры, задержки и буферы

В каждой команде шины указывается адрес данных, передаваемых в первой фазе данных пакета. Адрес для каждой последующей фазы данных пакета увеличивается на 4 (следующее двойное слово), но в командах обращения к памяти порядок может быть иным (см. ниже). Байты шины AD, несущие действительную информацию, выбираются сигналами С/ВЕ[3:0]# в фазах данных. Внутри пакета эти сигналы могут менять состояние от фазы к фазе произвольным образом. Разрешенные байты могут быть разрозненными; возможны фазы данных, в которых не разрешено ни одного байта. В отличие от шины ISA, на PCI нет динамического изменения разрядности — все устройства должны подключаться к шине 32-разрядным способом. Если в устройстве PCI применяются функциональные схемы иной разрядности (к примеру, нужно подключить микросхему 8255, имеющую 8-битную шину данных и четыре регистра), то приходится принимать схемотехнические методы преобразования, отображающие все регистры на 32-разрядную шину AD.

Адресация памяти, портов и конфигурационных регистров различна.

♦ В циклах

обращения к памяти адрес, выровненный по границе двойного слова,

передается

по линиям AD[31:2]; линии AD[1:0] задают порядок адресов в пакете:

00 — линейное инкрементирование; адрес последующей фазы отличается от предыдущего на число байтов шины (4 для 32-битной и 8 для 64-битной шины).

10 — Cacheline Wrap mode, сворачивание адресов с учетом длины строки кэш-памяти. В транзакции адрес для очередной фазы увеличивается до достижения границы строки кэша, после чегопереходитнаначало этойстрокииувеличивается до адреса, предшествующего начальному. Если транзакция длиннее строки кэша, то она продолжится в следующей строке с того же смещения, что и началась. Так, при длине строки 16 байт и 32-битной шине транзакция, начавшаяся с адреса xxxxxxOSh, будет иметь последующие фазы данных, относящиеся к адресам xxxxxxOCh, xxxxxxOOh, xxxxxx04h; и далее к xxxxxxlSh, xxxxxxlCh, xxxxxxlOh, xxxxxx!4h. Длина строки кэша прописывается в конфигурационном пространстве устройства

(см. п. 6.2.12). Если устройства не имеет регистра Cache Line Size, то оно должно прекратитьтранзакцию после первой фазы данных;

01 и 11 — зарезервировано, может использоваться как указание на отключение (Disconnect) после первой фазы данных.

♦ В циклах обращения

к портам ввода-вывода

для адресации любого байта исполь

зуются все линии AD[31:0]. При этом биты адреса AD[31:2] указывают на адрес двойногослова,

к которому принадлежат передаваемые данные, а младшие биты адреса AD[1:0] должны

соответствовать байтам,

которые могут быть

разрешены сигналами С/ВЕ[3:0]#. При

AD[1:0]=00 допустимо С/ВЕ[3:0]# - хххО или 1111, приАО[1:0]«01-С/ВЕ[3:0]# = хх01или1111,приАО[1:0]=10-С/ВЕ[3:0]# = х011 или 1111, при AD[1:0]=11 — С/ВЕ[3:0]# = 0111 (передается лишь байт 3) или 1111 (ни один байт не разрешен). Эти циклы тоже могут быть пакетными, хотя на практике эта возможность используется редко.

В

циклах

конфигурационной

записи/считывания

устройство

(карта

расши

 

рения) выбирается индивидуальным сигналом IDSEL; функция адресуется битами AD[10:8], а

 

конфигурационные регистры (только двойные слова) адресуются битами AD[7:2], при этом

 

AD[1:0]=00.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команды шины PCI определяются значениями бит С/ВЕ# в фазе адреса (табл. 6.12).

 

 

Команда

подтверждения

прерывания

предназначена

для

чтения

вектора

пре

 

рываний.

По

протоколу

она

выглядит

 

как

команда

чтения,

неявно

адресован

 

ная к системному контроллеру прерываний. Здесь в фазе адреса по шине AD полезная

 

информация не передается, но ее инициатор (главный мост) должен обеспечить стабильность

 

сигналов и корректность паритета. В PC 8-битный вектор передается в байте 0 по готовности

 

контроллера прерываний (по сигналу TRDY#). Подтверждение прерываний выполняется за

 

один цикл (первый холостой цикл, который процессоры х86 делают в дань совместимости со

 

стариной, мостом подавляется).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Специальный цикл отличается от всех

 

других

тем,

 

что

является

широковеща

 

тельным. Однако ни один агент на него не отвечает, а главный

мост или

иное

 

устройство, вводящее этот цикл, всегда завершает его способом Master Abort (на него требуется

 

6 тактов шины). Специальный цикл предназначен для генерации широковещательных

 

сообщений — их могут читать любые «заинтересованные» агенты шины. Тип сообщения

 

декодируется содержимым линий AD[15:0], на линиях AD[31:16] могут помещаться данные,

 

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

 

мосты используют ее информацию для управления распространением сообщения. Сообщения с

 

кодами OOOOh, 000lh и 0002h требуются для указания на отключение (Shutdown), остановку

 

(Halt) процессора или специфические функции процессора х8б, связанные с кэшем и

 

трассировкой. Коды 0003-FFFFh зарезервированы. Специальный цикл может генерироваться тем

 

же аппаратно-программным механизмом, что и конфигурационные циклы (см. п. 6.2.11),но со

 

специфическим значением адреса.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команды

чтения и записи ввода-вывода

служат

для

 

обращения

к

пространству

 

портов. Линии AD содержат адрес байта, причем декодированию подлежат и биты ADO и AD1

 

(несмотря на то, что имеются сигналы ВЕх#). Порты PCI могут быть 16или 32-битными. Для

 

адресации портов на шине PCI доступны все 32 бита адреса, но процессоры х86 могут

 

использовать только младшие 16 бит.

 

 

 

 

 

 

 

 

 

 

 

 

 

Команды

обращения к памяти,

кроме

обычного

чтения

и

записи,

включают

чте

 

ние строк кэш-памяти, множественное чтение (нескольких строк),

запись

с

ин-

 

валидацией.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команды

конфигурационного чтения и записи адресуются

к

конфигурационному

 

пространству устройств (см. п. 6.2.12). Обращение производится только двойными словами.

 

Структура содержит идентификатор устройства и производите для, состояние и команду,

 

информацию о занимаемых ресурсах и ограничения на использование шины. Для генерации

 

данных команд требуется специальный аппаратно-программный механизм (см. п. 6.2.11).

 

 

Чтение

строк

памяти

применяется,

когда

в

транзакции планируется

более

 

двух

 

32-битных передач (обычно это чтение до конца строки кэша).

 

 

 

 

 

 

 

 

Множественное

чтение

памяти

используется

 

для

 

транзакций,

пересекающих

границы строк кэш-памяти.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Запись

с инвалидацией применяется к целым строкам

кэша

и

позволяет

 

опти

 

мизировать циклы обратной записи «грязных» строк кэша.

 

 

 

 

 

 

 

 

 

Двухадресный цикл позволяет по 32-битной шине обращаться к устройствам с 64-битной адресацией. В этом случае младшие 32 бита адреса передаются в цикле данного типа, а за ним следует обычный цикл, определяющий тип обмена и несущий старшие 32 бита адреса. Шина PCI допускает 64-битную адресацию портов ввода-вывода (для х86 это бесполезно, но PCI существует и на других платформах).

Таблица 6.12. Декодирование команд шины PCI С/ВЕ[3:0] Типкоманды

0000

Interrupt Acknowledge — подтверждение прерывания

0001

Special Cycle — специальный цикл

0010

I/O Read — чтение порта ввода-вывода

0011

I/O Write —запись в порт ввода-вывода

Соседние файлы в папке ПУЭВМ