El bus PCI ( Peripheral Component Interconnect , o PCI ) [3] es un bus local de ordenador para conectar dispositivos de hardware en un ordenador y forma parte del estándar PCI Local Bus . El bus PCI admite las funciones que se encuentran en un bus de procesador , pero en un formato estandarizado que es independiente del bus nativo de cualquier procesador . Los dispositivos conectados al bus PCI aparecen ante un maestro de bus como conectados directamente a su propio bus y se les asignan direcciones en el espacio de direcciones del procesador . [4] Es un bus paralelo , sincrónico a un único reloj de bus . Los dispositivos conectados pueden adoptar la forma de un circuito integrado instalado en la placa base (llamado dispositivo planar en la especificación PCI) o una tarjeta de expansión que encaja en una ranura. El bus local PCI se implementó por primera vez en los IBM PC compatibles , donde reemplazó la combinación de varias ranuras lentas de arquitectura estándar de la industria (ISA) y una ranura rápida de bus local VESA (VLB) como configuración de bus. Posteriormente se ha adoptado para otros tipos de ordenadores. Las tarjetas PCI típicas que se utilizan en PC incluyen: tarjetas de red , tarjetas de sonido , módems , puertos adicionales como Universal Serial Bus ( USB ) o serial , tarjetas sintonizadoras de TV y adaptadores host de unidad de disco duro . Las tarjetas de video PCI reemplazaron a las tarjetas ISA y VLB hasta que las crecientes necesidades de ancho de banda superaron las capacidades de PCI. La interfaz preferida para las tarjetas de video luego se convirtió en Accelerated Graphics Port (AGP), un superconjunto de PCI, antes de dar paso a PCI Express. [5]
La primera versión de PCI que se encontró en las computadoras de escritorio minoristas fue un bus de 32 bits que usaba unReloj de bus de 33 MHz ySeñalización de 5 V , aunque el estándar PCI 1.0 también preveía una variante de 64 bits . [6] Estas tienen una muesca de ubicación en la tarjeta. La versión 2.0 del estándar PCI introdujo ranuras de 3,3 V, que se distinguen físicamente por un conector físico invertido para evitar la inserción accidental de tarjetas de 5 V. Las tarjetas universales, que pueden funcionar con cualquier voltaje, tienen dos muescas. La versión 2.1 del estándar PCI introdujo la operación opcional de 66 MHz. Una variante orientada al servidor de PCI, PCI Extended ( PCI-X ) operaba a frecuencias de hasta 133 MHz para PCI-X 1.0 y hasta 533 MHz para PCI-X 2.0. Un conector interno para tarjetas de computadora portátil, llamado Mini PCI , se introdujo en la versión 2.2 de la especificación PCI. El bus PCI también se adoptó para un estándar de conector externo para computadora portátil: el CardBus . [7] La primera especificación PCI fue desarrollada por Intel , pero el desarrollo posterior del estándar pasó a ser responsabilidad del PCI Special Interest Group ( PCI-SIG ). [8]
PCI y PCI-X a veces se denominan PCI paralela o PCI convencional [9] para distinguirlos tecnológicamente de su sucesor más reciente PCI Express , que adoptó una arquitectura serial basada en carriles. [10] [11] El apogeo de PCI en el mercado de las computadoras de escritorio fue aproximadamente de 1995 a 2005. [10] PCI y PCI-X se han vuelto obsoletos para la mayoría de los propósitos y han desaparecido en gran medida de muchas otras placas base modernas desde 2013; sin embargo, siguen siendo comunes en algunas computadoras de escritorio modernas a partir de 2020 [actualizar]por motivos de compatibilidad con versiones anteriores y el costo relativamente bajo de producción. Otra aplicación moderna común de PCI paralela es en PC industriales , donde muchas tarjetas de expansión especializadas, utilizadas aquí, nunca hicieron la transición a PCI Express, al igual que con algunas tarjetas ISA. Muchos tipos de dispositivos que antes estaban disponibles en tarjetas de expansión PCI ahora se integran comúnmente en placas base o están disponibles en versiones USB y PCI Express.
El trabajo sobre PCI comenzó en los laboratorios de arquitectura de Intel (IAL, también laboratorio de desarrollo de arquitectura) alrededor de 1990. Un equipo de ingenieros, principalmente de IAL, definió la arquitectura y desarrolló un chipset y una plataforma de prueba de concepto (Saturn) en colaboración con equipos de los sistemas de PC de escritorio de la empresa y las organizaciones de productos de lógica central.
PCI se empezó a utilizar inmediatamente en servidores, sustituyendo a la arquitectura Micro Channel (MCA) y a la Extended Industry Standard Architecture (EISA) como bus de expansión de servidor de elección. En los PC convencionales, PCI tardó más en sustituir a VLB y no consiguió una penetración significativa en el mercado hasta finales de 1994 en los PC Pentium de segunda generación . En 1996, VLB estaba prácticamente extinto y los fabricantes habían adoptado PCI incluso para los ordenadores Intel 80486 (486). [12] EISA siguió utilizándose junto con PCI hasta el año 2000. Apple Computer adoptó PCI para los ordenadores profesionales Power Macintosh (en sustitución de NuBus ) a mediados de 1995, y para la línea de productos Performa para el consumidor (en sustitución de LC Processor Direct Slot (PDS)) a mediados de 1996.
Fuera del mercado de servidores, la versión de 64 bits del PCI simple siguió siendo poco común en la práctica, [13] aunque fue utilizada, por ejemplo, por todas las computadoras Power Macintosh G3 y G4 (post-iMac) . [14]
Las revisiones posteriores de PCI añadieron nuevas características y mejoras de rendimiento, incluido un estándar de 3,3 V a 66 MHz y PCI-X a 133 MHz , y la adaptación de la señalización PCI a otros formatos. Tanto PCI-X 1.0b como PCI-X 2.0 son compatibles con algunos estándares PCI. Estas revisiones se utilizaron en hardware de servidor, pero el hardware de PC de consumo siguió siendo casi en su totalidad de 32 bits, 33 MHz y 5 voltios.
La PCI-SIG introdujo la PCI Express en serie en 2004. Desde entonces, los fabricantes de placas base han incluido cada vez menos ranuras PCI en favor del nuevo estándar. A finales de 2013, muchas placas base nuevas no ofrecen ranuras PCI en absoluto. [ cita requerida ]
PCI proporciona espacios de direcciones de memoria y puertos de E/S asignados a memoria separados para la familia de procesadores x86 , de 64 y 32 bits , respectivamente. Las direcciones en estos espacios de direcciones se asignan mediante software. Un tercer espacio de direcciones, llamado Espacio de configuración PCI , que utiliza un esquema de direccionamiento fijo, permite que el software determine la cantidad de memoria y espacio de direcciones de E/S que necesita cada dispositivo. Cada dispositivo puede solicitar hasta seis áreas de espacio de memoria o espacio de puerto de entrada/salida (E/S) a través de sus registros de espacio de configuración.
En un sistema típico, el firmware (o sistema operativo ) consulta todos los buses PCI en el momento del inicio (a través de PCI Configuration Space ) para averiguar qué dispositivos están presentes y qué recursos del sistema (espacio de memoria, espacio de E/S, líneas de interrupción, etc.) necesita cada uno. Luego asigna los recursos y le dice a cada dispositivo cuál es su asignación.
El espacio de configuración PCI también contiene una pequeña cantidad de información sobre el tipo de dispositivo, lo que ayuda a un sistema operativo a elegir controladores de dispositivo para él, o al menos a tener un diálogo con un usuario sobre la configuración del sistema.
Los dispositivos pueden tener una memoria de solo lectura (ROM) incorporada que contiene código ejecutable para procesadores x86 o PA-RISC , un controlador de firmware abierto o una ROM opcional . Estos suelen ser necesarios para los dispositivos que se utilizan durante el inicio del sistema, antes de que el sistema operativo cargue los controladores de dispositivos.
Además, existen temporizadores de latencia PCI , que son un mecanismo para que los dispositivos PCI Bus-Mastering compartan el bus PCI de manera justa. En este caso, "justo" significa que los dispositivos no utilizarán una porción tan grande del ancho de banda del bus PCI disponible que otros dispositivos no puedan realizar el trabajo necesario. Tenga en cuenta que esto no se aplica a PCI Express.
El funcionamiento de este sistema consiste en que cada dispositivo PCI que puede funcionar en modo bus-master debe implementar un temporizador, denominado temporizador de latencia, que limita el tiempo que el dispositivo puede mantener el bus PCI. El temporizador se inicia cuando el dispositivo obtiene la propiedad del bus y realiza una cuenta regresiva al ritmo del reloj PCI. Cuando el contador llega a cero, el dispositivo debe liberar el bus. Si no hay otros dispositivos esperando a que se le asigne la propiedad del bus, puede simplemente volver a tomar el bus y transferir más datos. [17]
Los dispositivos deben seguir un protocolo para poder compartir las líneas de solicitud de interrupción (IRQ). El bus PCI incluye cuatro líneas de interrupción, INTA# a INTD#, todas las cuales están disponibles para cada dispositivo. Hasta ocho dispositivos PCI comparten la misma línea IRQ (INTINA# a INTINH#) en sistemas x86 habilitados para APIC . Las líneas de interrupción no están conectadas en paralelo como lo están las otras líneas del bus PCI. Las posiciones de las líneas de interrupción rotan entre las ranuras, por lo que lo que aparece como la línea INTA# para un dispositivo es INTB# para el siguiente e INTC# para el siguiente. Los dispositivos de función única generalmente usan su INTA# para la señalización de interrupciones, por lo que la carga del dispositivo se distribuye de manera bastante uniforme entre las cuatro líneas de interrupción disponibles. Esto alivia un problema común con el uso compartido de interrupciones.
La asignación de líneas de interrupción PCI a líneas de interrupción del sistema, a través del puente de host PCI, depende de la implementación. El firmware específico de la plataforma o el código del sistema operativo deben saber esto y configurar el campo "línea de interrupción" en el espacio de configuración de cada dispositivo para indicar a qué IRQ está conectado.
Las líneas de interrupción PCI se activan por nivel . Se eligió esta opción en lugar de la activación por flanco para obtener una ventaja al dar servicio a una línea de interrupción compartida y por razones de robustez: las interrupciones activadas por flanco son fáciles de pasar por alto.
Las revisiones posteriores de la especificación PCI añaden compatibilidad con interrupciones señalizadas por mensaje . En este sistema, un dispositivo señala su necesidad de servicio realizando una escritura en la memoria, en lugar de afirmar una línea dedicada. Esto alivia el problema de la escasez de líneas de interrupción. Incluso si los vectores de interrupción siguen siendo compartidos, no sufre los problemas de compartición de las interrupciones activadas por nivel. También resuelve el problema de enrutamiento, porque la escritura en la memoria no se modifica de forma impredecible entre el dispositivo y el host. Finalmente, debido a que la señalización de mensajes es en banda , resuelve algunos problemas de sincronización que pueden ocurrir con escrituras publicadas y líneas de interrupción fuera de banda .
PCI Express no tiene líneas de interrupción físicas en absoluto. Utiliza interrupciones señalizadas por mensajes exclusivamente.
Estas especificaciones representan la versión más común de PCI utilizada en PC normales:
La especificación PCI también proporciona opciones para señalización de 3,3 V, ancho de bus de 64 bits y reloj de 66 MHz, pero estas no se encuentran comúnmente fuera del soporte PCI-X en placas base de servidor.
El árbitro de bus PCI realiza el arbitraje de bus entre varios maestros en el bus PCI. Cualquier número de maestros de bus puede residir en el bus PCI, así como las solicitudes para el bus. Un par de señales de solicitud y concesión está dedicado a cada maestro de bus.
Las tarjetas PCI típicas tienen una o dos muescas clave, según el voltaje de señalización. Las tarjetas que requieren 3,3 voltios tienen una muesca a 56,21 mm de la placa posterior de la tarjeta; las que requieren 5 voltios tienen una muesca a 104,41 mm de la placa posterior. Esto permite que las tarjetas se coloquen solo en ranuras con un voltaje que admitan. Las "tarjetas universales" que aceptan cualquiera de los dos voltajes tienen ambas muescas clave.
El conector PCI se define como que tiene 62 contactos en cada lado del conector de borde , pero dos o cuatro de ellos se reemplazan por muescas de llave, por lo que una tarjeta tiene 60 o 58 contactos en cada lado. El lado A se refiere al 'lado de soldadura' y el lado B se refiere al 'lado del componente': si la tarjeta se sostiene con el conector apuntando hacia abajo, una vista del lado A tendrá la placa posterior a la derecha, mientras que una vista del lado B tendrá la placa posterior a la izquierda. La distribución de pines de los lados B y A es la siguiente, mirando hacia abajo en el conector de la placa base (los pines A1 y B1 son los más cercanos a la placa posterior). [16] [18] [19]
El PCI de 64 bits extiende esto con 32 contactos adicionales en cada lado que proporcionan AD[63:32], C/BE[7:4]#, la señal de paridad PAR64 y una serie de pines de alimentación y tierra.
La mayoría de las líneas están conectadas a cada ranura en paralelo. Las excepciones son:
Notas:
La mayoría de las tarjetas PCI de 32 bits funcionarán correctamente en ranuras PCI-X de 64 bits, pero la velocidad de reloj del bus estará limitada a la frecuencia de reloj de la tarjeta más lenta, una limitación inherente a la topología de bus compartido de PCI. Por ejemplo, cuando se instala un periférico PCI 2.3 de 66 MHz en un bus PCI-X capaz de alcanzar 133 MHz, toda la placa base del bus estará limitada a 66 MHz. Para evitar esta limitación, muchas placas base tienen dos o más buses PCI/PCI-X, con un bus destinado a su uso con periféricos PCI-X de alta velocidad y el otro bus destinado a periféricos de uso general.
Muchas tarjetas PCI-X de 64 bits están diseñadas para funcionar en modo de 32 bits si se insertan en conectores de 32 bits más cortos, con cierta pérdida de rendimiento. [22] [23] Un ejemplo de esto es la tarjeta de interfaz SCSI de 64 bits Adaptec 29160. [24] Sin embargo, algunas tarjetas PCI-X de 64 bits no funcionan en ranuras PCI estándar de 32 bits. [25] [ ¿ Fuente poco confiable? ]
La instalación de una tarjeta PCI-X de 64 bits en una ranura de 32 bits dejará la parte de 64 bits del conector del borde de la tarjeta sin conectar y sobresaliendo. Esto requiere que no haya componentes de la placa base ubicados de manera que obstruyan mecánicamente la parte sobresaliente del conector del borde de la tarjeta.
Alturas de los soportes PCI:
Longitudes de tarjeta PCI (soporte estándar y 3,3 V): [28]
Longitudes de tarjeta PCI (soporte de perfil bajo y 3,3 V): [29]
Mini PCI se agregó a la versión PCI 2.2 para su uso en computadoras portátiles y algunos enrutadores; [ cita requerida ] utiliza un bus de 32 bits, 33 MHz con conexiones alimentadas (solo 3,3 V; 5 V está limitado a 100 mA) y soporte para bus mastering y DMA . El tamaño estándar de las tarjetas Mini PCI es aproximadamente una cuarta parte de sus contrapartes de tamaño completo. No hay acceso a la tarjeta desde fuera de la carcasa, a diferencia de las tarjetas PCI de escritorio con soportes que llevan conectores. Esto limita los tipos de funciones que puede realizar una tarjeta Mini PCI.
Se han desarrollado muchos dispositivos Mini PCI, como Wi-Fi , Fast Ethernet , Bluetooth , módems (a menudo Winmodems ), tarjetas de sonido , aceleradores criptográficos , SCSI , controladores IDE - ATA , SATA y tarjetas combinadas. Las tarjetas Mini PCI se pueden utilizar con hardware equipado con PCI normal, utilizando convertidores Mini PCI a PCI. La Mini PCI ha sido reemplazada por la Mini Tarjeta PCI Express mucho más estrecha.
Las tarjetas mini PCI tienen un consumo máximo de energía de 2 W, lo que limita la funcionalidad que se puede implementar en este formato. También deben admitir la señal PCI CLKRUN# que se utiliza para iniciar y detener el reloj PCI con fines de administración de energía.
Existen tres formatos de tarjeta : tarjetas Tipo I, Tipo II y Tipo III. El conector de tarjeta utilizado para cada tipo incluye: el Tipo I y II utilizan un conector de apilamiento de 100 pines, mientras que el Tipo III utiliza un conector de borde de 124 pines, es decir, el conector para los Tipos I y II difiere del del Tipo III, donde el conector está en el borde de una tarjeta, como con un SO-DIMM . Los 24 pines adicionales proporcionan las señales adicionales necesarias para enrutar la E/S de vuelta a través del conector del sistema (audio, AC-Link , LAN , interfaz de línea telefónica). Las tarjetas Tipo II tienen conectores montados RJ11 y RJ45. Estas tarjetas deben estar ubicadas en el borde de la computadora o estación de acoplamiento para que los puertos RJ11 y RJ45 se puedan montar para acceso externo.
El mini PCI es distinto del micro PCI de 144 pines. [30]
El tráfico del bus PCI consta de una serie de transacciones del bus PCI. Cada transacción consta de una fase de dirección seguida de una o más fases de datos . La dirección de las fases de datos puede ser desde el iniciador hasta el destino (transacción de escritura) o viceversa (transacción de lectura), pero todas las fases de datos deben estar en la misma dirección. Cualquiera de las partes puede pausar o detener las fases de datos en cualquier momento. (Un ejemplo común es un dispositivo PCI de bajo rendimiento que no admite transacciones en ráfaga y siempre detiene una transacción después de la primera fase de datos).
Cualquier dispositivo PCI puede iniciar una transacción. Primero, debe solicitar permiso a un árbitro del bus PCI en la placa base. El árbitro concede el permiso a uno de los dispositivos solicitantes. El iniciador comienza la fase de dirección difundiendo una dirección de 32 bits más un código de comando de 4 bits y luego espera a que un destino responda. Todos los demás dispositivos examinan esta dirección y uno de ellos responde unos ciclos más tarde.
El direccionamiento de 64 bits se realiza mediante una fase de direccionamiento de dos etapas. El iniciador transmite los 32 bits de dirección más bajos, acompañados de un código de comando especial de "ciclo de dirección dual". Los dispositivos que no admiten el direccionamiento de 64 bits simplemente no pueden responder a ese código de comando. En el siguiente ciclo, el iniciador transmite los 32 bits de dirección más altos, más el código de comando real. La transacción funciona de manera idéntica a partir de ese momento. Para garantizar la compatibilidad con dispositivos PCI de 32 bits, está prohibido utilizar un ciclo de dirección dual si no es necesario, es decir, si los bits de dirección de orden superior son todos cero.
Mientras que el bus PCI transfiere 32 bits por fase de datos, el iniciador transmite 4 señales de habilitación de bytes activos bajos que indican qué bytes de 8 bits se deben considerar significativos. En particular, una escritura debe afectar solo a los bytes habilitados en el dispositivo PCI de destino. Tienen poca importancia para las lecturas de memoria, pero las lecturas de E/S pueden tener efectos secundarios. El estándar PCI permite explícitamente una fase de datos sin bytes habilitados, que debe comportarse como una operación sin efecto.
PCI tiene tres espacios de direcciones: memoria, dirección de E/S y configuración.
Las direcciones de memoria tienen un tamaño de 32 bits (opcionalmente 64 bits), admiten almacenamiento en caché y pueden ser transacciones en ráfagas.
Las direcciones de E/S se utilizan para la compatibilidad con el espacio de direcciones del puerto de E/S de la arquitectura Intel x86 . Aunque la especificación del bus PCI permite transacciones en ráfaga en cualquier espacio de direcciones, la mayoría de los dispositivos solo lo admiten para direcciones de memoria y no para E/S.
Por último, el espacio de configuración PCI proporciona acceso a 256 bytes de registros de configuración especiales por dispositivo PCI. Cada ranura PCI tiene su propio rango de direcciones de espacio de configuración. Los registros se utilizan para configurar los rangos de direcciones de E/S y de memoria de los dispositivos a los que deben responder desde los iniciadores de transacciones. Cuando se enciende una computadora por primera vez, todos los dispositivos PCI responden solo a sus accesos al espacio de configuración. El BIOS de la computadora busca dispositivos y les asigna rangos de direcciones de E/S y de memoria.
Si ningún dispositivo reclama una dirección, la fase de dirección del iniciador de la transacción se agotará y el iniciador cancelará la operación. En el caso de las lecturas, es habitual proporcionar todos los unos para el valor de los datos leídos (0xFFFFFFFF). Por lo tanto, los dispositivos PCI generalmente intentan evitar el uso del valor de todos los unos en registros de estado importantes, de modo que un error de este tipo pueda ser detectado fácilmente por el software.
Hay 16 códigos de comando de 4 bits posibles, y 12 de ellos están asignados. Con la excepción del ciclo de dirección dual único, el bit menos significativo del código de comando indica si las siguientes fases de datos son de lectura (datos enviados desde el destino al iniciador) o de escritura (datos enviados desde un iniciador al destino). Los destinos PCI deben examinar el código de comando así como la dirección y no responder a fases de dirección que especifiquen un código de comando no compatible.
Los comandos que hacen referencia a líneas de caché dependen de que el registro de tamaño de línea de caché del espacio de configuración PCI esté configurado correctamente; no se pueden utilizar hasta que esto se haya hecho.
Poco después de la promulgación de la especificación PCI, se descubrió que las transacciones prolongadas de algunos dispositivos, debido a reconocimientos lentos, ráfagas de datos prolongadas o alguna combinación de estas, podían provocar un desbordamiento o una insuficiencia de capacidad del búfer en otros dispositivos. Las recomendaciones sobre la sincronización de las fases individuales de la Revisión 2.0 se hicieron obligatorias en la Revisión 2.1: [32] : 3
Además, a partir de la revisión 2.1, todos los iniciadores capaces de generar más de dos fases de datos deben implementar un temporizador de latencia programable. El temporizador comienza a contar ciclos de reloj cuando se inicia una transacción (el iniciador afirma FRAME#). Si el temporizador ha expirado y el árbitro ha eliminado GNT#, entonces el iniciador debe terminar la transacción en la próxima oportunidad legal. Esta suele ser la siguiente fase de datos, pero las transacciones de escritura en memoria e invalidación deben continuar hasta el final de la línea de caché.
Los dispositivos que no pueden cumplir con esas restricciones de tiempo deben usar una combinación de escrituras publicadas (para escrituras de memoria) y transacciones retrasadas (para otras escrituras y todas las lecturas). En una transacción retrasada, el destino registra la transacción (incluidos los datos de escritura) internamente y cancela (afirma STOP# en lugar de TRDY#) la primera fase de datos. El iniciador debe volver a intentar exactamente la misma transacción más tarde. Mientras tanto, el destino realiza la transacción internamente y espera la transacción reintentada. Cuando se ve la transacción reintentada, se entrega el resultado almacenado en búfer.
Un dispositivo puede ser el objetivo de otras transacciones mientras completa una transacción retrasada; debe recordar el tipo de transacción, la dirección, las selecciones de bytes y el valor de los datos (si es una escritura) y solo completar la transacción correcta.
Si el objetivo tiene un límite en la cantidad de transacciones retrasadas que puede registrar internamente (los objetivos simples pueden imponer un límite de 1), obligará a esas transacciones a volver a intentarse sin registrarlas. Se tratarán cuando se complete la transacción retrasada actual. Si dos iniciadores intentan la misma transacción, una transacción retrasada iniciada por uno puede enviar su resultado al otro; esto es inofensivo.
Un objetivo abandona una transacción retrasada cuando un reintento logra entregar el resultado almacenado en el búfer, se reinicia el bus o cuando transcurren 2 15 = 32768 ciclos de reloj (aproximadamente 1 ms) sin ver un reintento. Esto último nunca debería suceder en un funcionamiento normal, pero evita un bloqueo de todo el bus si se reinicia o funciona mal un iniciador.
El estándar PCI permite que varios buses PCI independientes se conecten mediante puentes de bus que reenviarán operaciones de un bus a otro cuando sea necesario. Aunque PCI tiende a no utilizar muchos puentes de bus, los sistemas PCI Express utilizan muchos puentes PCI a PCI, generalmente llamados puerto raíz PCI Express ; cada ranura PCI Express parece ser un bus independiente, conectado a los demás mediante un puente. El puente de host PCI (generalmente el puente norte en las plataformas x86) interconecta la CPU, la memoria principal y el bus PCI. [33]
En general, cuando un puente de bus detecta una transacción en un bus que debe ser reenviada al otro, la transacción original debe esperar hasta que la transacción reenviada se complete antes de que haya un resultado listo. Una excepción notable ocurre en el caso de las escrituras en memoria. Aquí, el puente puede registrar los datos de escritura internamente (si tiene espacio) y señalar la finalización de la escritura antes de que la escritura reenviada se haya completado. O, de hecho, antes de que haya comenzado. Estas escrituras "enviadas pero aún no recibidas" se conocen como "escrituras publicadas", por analogía con un mensaje de correo postal. Aunque ofrecen una gran oportunidad para obtener ganancias de rendimiento, las reglas que rigen lo que está permitido son algo intrincadas. [34]
El estándar PCI permite que los puentes de bus conviertan varias transacciones de bus en una transacción más grande en determinadas situaciones. Esto puede mejorar la eficiencia del bus PCI.
Las transacciones de escritura en direcciones consecutivas se pueden combinar en una ráfaga de escritura más larga, siempre que el orden de los accesos en la ráfaga sea el mismo que el orden de las escrituras originales. Se permite insertar fases de datos adicionales con todas las habilitaciones de bytes desactivadas si las escrituras son casi consecutivas.
Es posible fusionar varias escrituras en partes disjuntas de la misma palabra en una única escritura con habilitaciones de varios bytes. En este caso, las escrituras que se presentaron al puente de bus en un orden particular se fusionan para que se produzcan al mismo tiempo cuando se reenvían.
No se pueden combinar varias escrituras en el mismo byte o bytes , por ejemplo, realizando solo la segunda escritura y omitiendo la primera que se sobrescribió. Esto se debe a que la especificación PCI permite que las escrituras tengan efectos secundarios.
Las transacciones del bus PCI están controladas por cinco señales de control principales, dos impulsadas por el iniciador de una transacción (FRAME# e IRDY#) y tres impulsadas por el objetivo (DEVSEL#, TRDY# y STOP#). Hay dos señales de arbitraje adicionales (REQ# y GNT#) que se utilizan para obtener permiso para iniciar una transacción. [6] Todas son activas-bajas , lo que significa que el estado activo o afirmado es un voltaje bajo . Las resistencias pull-up en la placa base garantizan que permanecerán altas (inactivas o deassertadas ) si no son controladas por ningún dispositivo, pero el bus PCI no depende de las resistencias para cambiar el nivel de la señal; todos los dispositivos impulsan las señales altas durante un ciclo antes de dejar de impulsar las señales.
Todas las señales del bus PCI se muestrean en el flanco ascendente del reloj. Las señales cambian nominalmente en el flanco descendente del reloj, lo que le da a cada dispositivo PCI aproximadamente medio ciclo de reloj para decidir cómo responder a las señales que observa en el flanco ascendente y medio ciclo de reloj para transmitir su respuesta al otro dispositivo.
El bus PCI requiere que cada vez que el dispositivo que controla una señal del bus PCI cambie, debe transcurrir un ciclo de respuesta entre el momento en que un dispositivo deja de controlar la señal y el momento en que el otro dispositivo comienza a funcionar. Sin esto, podría haber un período en el que ambos dispositivos controlen la señal, lo que interferiría con el funcionamiento del bus.
La combinación de este ciclo de respuesta y el requisito de activar una línea de control durante un ciclo antes de dejar de activarla significa que cada una de las líneas de control principales debe estar activa durante un mínimo de dos ciclos cuando cambian de propietario. El protocolo de bus PCI está diseñado de modo que esto rara vez sea una limitación; solo en unos pocos casos especiales (en particular, transacciones rápidas consecutivas) es necesario insertar un retraso adicional para cumplir con este requisito.
Cualquier dispositivo en un bus PCI que sea capaz de actuar como maestro de bus puede iniciar una transacción con cualquier otro dispositivo. Para garantizar que solo se inicie una transacción a la vez, cada maestro debe esperar primero una señal de concesión de bus, GNT#, de un árbitro ubicado en la placa base. Cada dispositivo tiene una línea de solicitud independiente REQ# que solicita el bus, pero el árbitro puede "estacionar" la señal de concesión de bus en cualquier dispositivo si no hay solicitudes actuales.
El árbitro puede eliminar GNT# en cualquier momento. Un dispositivo que pierde GNT# puede completar su transacción actual, pero no puede iniciar otra (afirmando FRAME#) a menos que observe que GNT# afirmó el ciclo antes de que comience.
El árbitro también puede proporcionar GNT# en cualquier momento, incluso durante la transacción de otro maestro. Durante una transacción, se afirman FRAME# o IRDY# o ambos; cuando se desautorizan ambos, el bus está inactivo. Un dispositivo puede iniciar una transacción en cualquier momento en que se afirme GNT# y el bus esté inactivo.
Una transacción de bus PCI comienza con una fase de dirección . El iniciador (normalmente un chipset ), al ver que tiene GNT# y que el bus está inactivo, envía la dirección de destino a las líneas AD[31:0], el comando asociado (por ejemplo, lectura de memoria o escritura de E/S) a las líneas C/BE[3:0]# y baja el FRAME#.
Cada dispositivo examina la dirección y el comando y decide si responder como el objetivo afirmando DEVSEL#. Un dispositivo debe responder afirmando DEVSEL# dentro de 3 ciclos. Los dispositivos que prometen responder dentro de 1 o 2 ciclos se dice que tienen "DEVSEL rápido" o "DEVSEL medio", respectivamente. (En realidad, el tiempo para responder es de 2,5 ciclos, ya que los dispositivos PCI deben transmitir todas las señales medio ciclo antes para que puedan recibirse tres ciclos después).
Un dispositivo debe retener la dirección en el primer ciclo; el iniciador debe eliminar la dirección y el comando del bus en el ciclo siguiente, incluso antes de recibir una respuesta DEVSEL#. El tiempo adicional está disponible solo para interpretar la dirección y el comando después de que se capturan.
En el quinto ciclo de la fase de dirección (o antes si todos los demás dispositivos tienen DEVSEL medio o más rápido), se permite una "decodificación sustractiva" general para algunos rangos de direcciones. Esto lo utiliza habitualmente un puente de bus ISA para direcciones dentro de su rango (24 bits para memoria y 16 bits para E/S).
En el sexto ciclo, si no ha habido respuesta, el iniciador puede abortar la transacción anulando el FRAME#. Esto se conoce como terminación de aborto maestro y es habitual que los puentes de bus PCI devuelvan datos de todos unos (0xFFFFFFFF) en este caso. Por lo tanto, los dispositivos PCI generalmente están diseñados para evitar el uso del valor de todos unos en registros de estado importantes, de modo que un error de este tipo pueda detectarse fácilmente mediante software.
Notas:
En el flanco ascendente del reloj 0, el iniciador observa que FRAME# e IRDY# están altos y que GNT# está bajo, por lo que activa la dirección, el comando y confirma FRAME# a tiempo para el flanco ascendente del reloj 1. Los destinos bloquean la dirección y comienzan a decodificarla. Pueden responder con DEVSEL# a tiempo para el reloj 2 (DEVSEL rápido), 3 (medio) o 4 (lento). Los dispositivos de decodificación sustractiva, al no ver ninguna otra respuesta en el reloj 4, pueden responder en el reloj 5. Si el maestro no ve una respuesta en el reloj 5, finalizará la transacción y eliminará FRAME# en el reloj 6.
TRDY# y STOP# se desactivan (están en estado alto) durante la fase de dirección. El iniciador puede activar IRDY# tan pronto como esté listo para transferir datos, lo que teóricamente podría ocurrir en el reloj 2.
Para permitir el direccionamiento de 64 bits, un maestro presentará la dirección en dos ciclos consecutivos. Primero, envía los bits de dirección de orden inferior con un comando especial de "dirección de ciclo dual" en C/BE[3:0]#. En el ciclo siguiente, envía los bits de dirección de orden superior y el comando real. Los ciclos de dirección dual están prohibidos si los bits de dirección de orden superior son cero, por lo que los dispositivos que no admiten el direccionamiento de 64 bits simplemente no pueden responder a los comandos de ciclo dual.
_ 0_ 1_ 2_ 3_ 4_ 5_ 6_ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ___ GNT# \___/XXXXXXXXXXXXXXXXXXXXX _______ MARCO# \_______________________ ___ ___ AD[31:0] -------<___X___>--------------- (Bits bajos, luego bits altos) ___ ___ _______________ C/BE[3:0]# -------<___X___X_______________ (DAC, luego comando real) ___________________________ DEVSEL# \___\___\___\___ Rápido Medio Lento _ _ _ _ _ _ _ _ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ 0 1 2 3 4 5 6
Las direcciones para el acceso al espacio de configuración PCI utilizan una decodificación especial. En estas, las líneas de dirección de orden inferior especifican el desplazamiento del registro de configuración PCI deseado y se ignoran las líneas de dirección de orden superior. En su lugar, una señal de dirección adicional, la entrada IDSEL, debe ser alta antes de que un dispositivo pueda activar DEVSEL#. Cada ranura conecta una línea de dirección de orden superior diferente al pin IDSEL y se selecciona utilizando la codificación one-hot en las líneas de dirección superiores.
Después de la fase de dirección (específicamente, comenzando con el ciclo en el que DEVSEL# pasa a nivel bajo) viene una ráfaga de una o más fases de datos . En todos los casos, el iniciador impulsa las señales de selección de bytes activos bajos en las líneas C/BE[3:0]#, pero los datos en AD[31:0] pueden ser impulsados por el iniciador (en el caso de escrituras) o el destino (en el caso de lecturas).
Durante las fases de datos, las líneas C/BE[3:0]# se interpretan como habilitaciones de bytes activos bajos . En caso de una escritura, las señales activadas indican cuáles de los cuatro bytes en el bus AD se deben escribir en la ubicación direccionada. En el caso de una lectura, indican en qué bytes está interesado el iniciador. Para las lecturas, siempre es legal ignorar las señales de habilitación de bytes y simplemente devolver los 32 bits; se requieren recursos de memoria almacenable en caché para devolver siempre 32 bits válidos. Las habilitaciones de bytes son principalmente útiles para los accesos al espacio de E/S donde las lecturas tienen efectos secundarios.
El estándar PCI permite explícitamente una fase de datos con las cuatro líneas C/BE# anuladas, y no debe tener ningún efecto en el destino excepto avanzar la dirección en el acceso en ráfaga en curso.
La fase de datos continúa hasta que ambas partes estén listas para completar la transferencia y continuar con la siguiente fase de datos. El iniciador afirma IRDY# ( iniciador listo ) cuando ya no necesita esperar, mientras que el destino afirma TRDY# ( objetivo listo ). Cualquiera que sea el lado que proporciona los datos debe impulsarlo en el bus AD antes de afirmar su señal de listo.
Una vez que uno de los participantes afirma su señal de listo, no puede dejar de estar listo ni alterar de otro modo sus señales de control hasta el final de la fase de datos. El receptor de datos debe bloquear el bus AD en cada ciclo hasta que vea que se han confirmado tanto IRDY# como TRDY#, lo que marca el final de la fase de datos actual e indica que los datos recién bloqueados son la palabra que se va a transferir.
Para mantener la velocidad de ráfaga completa, el transmisor de datos tiene entonces medio ciclo de reloj después de ver que se activan IRDY# y TRDY# para impulsar la siguiente palabra en el bus AD.
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ___ _______ ___ ___ ___ AD[31:0] ---<___XXXXXXXXX_______XXXXX___X___X___ (Si se escribe) ___ ___ _______ ___ ___ AD[31:0] ---<___>~~~<XXXXXXXXX___X_______X___X___ (Si se lee) ___ _______________ _______ ___ ___ C/BE[3:0]# ---<___X_______________X_______X___X___ (Siempre debe ser válido) _______________ | ___ | | | IRDY# x \_______/ x \___________ ___________________ | | | | TRDY# xx \___________________ ___________ | | | | DEVSEL# \___________________________ ___ | | | | MARCO# \___________________________________ _ _ _ _ _ |_ _ |_ |_ |_ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ 0 1 2 3 4 5 6 7 8 9
Esto continúa el ciclo de dirección ilustrado anteriormente, suponiendo un único ciclo de dirección con DEVSEL medio, de modo que el objetivo responde a tiempo para el reloj 3. Sin embargo, en ese momento, ninguno de los lados está listo para transferir datos. Para el reloj 4, el iniciador está listo, pero el objetivo no. En el reloj 5, ambos están listos y se lleva a cabo una transferencia de datos (como lo indican las líneas verticales). Para el reloj 6, el objetivo está listo para transferir, pero el iniciador no. En el reloj 7, el iniciador se vuelve listo y se transfieren los datos. Para los relojes 8 y 9, ambos lados permanecen listos para transferir datos, y los datos se transfieren a la velocidad máxima posible (32 bits por ciclo de reloj).
En caso de una lectura, el reloj 2 está reservado para girar el bus AD, por lo que no se permite que el objetivo maneje datos en el bus incluso si es capaz de DEVSEL rápido.
En teoría, un objetivo que admita DEVSEL rápido podría comenzar a responder a una lectura en el ciclo posterior a la presentación de la dirección. Sin embargo, este ciclo está reservado para la respuesta del bus AD. Por lo tanto, un objetivo puede no controlar el bus AD (y, por lo tanto, no puede afirmar TRDY#) en el segundo ciclo de una transacción. La mayoría de los objetivos no serán tan rápidos y no necesitarán ninguna lógica especial para hacer cumplir esta condición.
Cualquiera de las partes puede solicitar que una ráfaga finalice después de la fase de datos actual. Los dispositivos PCI simples que no admiten ráfagas de varias palabras siempre solicitarán esto inmediatamente. Incluso los dispositivos que admiten ráfagas tendrán algún límite en la longitud máxima que pueden admitir, como el final de su memoria direccionable.
El iniciador puede marcar cualquier fase de datos como la última de una transacción anulando la confirmación de FRAME# al mismo tiempo que confirma IRDY#. El ciclo después de que el destino confirma TRDY#, la transferencia de datos final se completa, ambos lados anulan la confirmación de sus respectivas señales RDY# y el bus vuelve a estar inactivo. El maestro no puede anular la confirmación de FRAME# antes de confirmar IRDY#, ni puede anular la confirmación de FRAME# mientras espera, con IRDY# confirmada, a que el destino confirme TRDY#.
La única excepción menor es una terminación de aborto maestro , cuando ningún objetivo responde con DEVSEL#. Obviamente, no tiene sentido esperar a TRDY# en tal caso. Sin embargo, incluso en este caso, el maestro debe afirmar IRDY# durante al menos un ciclo después de desautorizar FRAME#. (Comúnmente, un maestro afirmará IRDY# antes de recibir DEVSEL#, por lo que simplemente debe mantener IRDY# afirmado durante un ciclo más). Esto es para garantizar que se respeten las reglas de temporización de respuesta del bus en la línea FRAME#.
El objetivo solicita al iniciador que finalice una ráfaga afirmando STOP#. El iniciador finalizará la transacción anulando FRAME# en la siguiente oportunidad legal; si desea transferir más datos, continuará en una transacción separada. El objetivo puede hacer esto de varias formas:
Siempre se necesitará al menos un ciclo para que el iniciador detecte una solicitud de desconexión iniciada por el objetivo y responda anulando el FRAME#. Hay dos subcasos, que requieren la misma cantidad de tiempo, pero uno requiere una fase de datos adicional:
Si el iniciador finaliza la ráfaga al mismo tiempo que el objetivo solicita la desconexión, no hay ningún ciclo de bus adicional.
Para los accesos al espacio de memoria, se puede acceder a las palabras de una ráfaga en varios órdenes. Los bits de dirección de orden inferior innecesarios AD[1:0] se utilizan para transmitir el orden solicitado por el iniciador. Un destino que no admita un orden en particular debe terminar la ráfaga después de la primera palabra. Algunos de estos órdenes dependen del tamaño de la línea de caché, que se puede configurar en todos los dispositivos PCI.
Si el desplazamiento inicial dentro de la línea de caché es cero, todos estos modos se reducen al mismo orden.
Los modos de alternancia de línea de caché y de ajuste de línea de caché son dos formas de obtener líneas de caché con palabras críticas primero. El modo de alternancia realiza una operación XOR en la dirección suministrada con un contador incremental. Este es el orden nativo para los procesadores Intel 486 y Pentium. Tiene la ventaja de que no es necesario conocer el tamaño de la línea de caché para implementarlo.
La versión 2.1 de PCI dejó obsoleto el modo de alternancia y agregó el modo de ajuste de línea de caché, [32] : 2 , donde la búsqueda se realiza de manera lineal, dando un giro al final de cada línea de caché. Cuando se obtiene por completo una línea de caché, la búsqueda salta al desplazamiento inicial en la siguiente línea de caché.
La mayoría de los dispositivos PCI solo admiten un rango limitado de tamaños de líneas de caché típicas; si el tamaño de la línea de caché está programado con un valor inesperado, fuerzan el acceso de una sola palabra.
PCI también admite acceso en ráfaga al espacio de E/S y de configuración, pero solo se admite el modo lineal. (Esto se utiliza rara vez y puede tener errores en algunos dispositivos; es posible que no lo admitan, pero tampoco fuerzan correctamente el acceso de una sola palabra).
Esta es la ráfaga de escritura de cuatro palabras a la velocidad más alta posible, finalizada por el maestro:
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ ___ ___ ___ ___ ___ AD[31:0] ---<___X___X___X___X___>---<___> ___ ___ ___ ___ ___ C/BE[3:0]# ---<___X___X___X___X___>---<___> | | | | ___ IRDY# ^^^^^^^^\______________/ ^^^^^ | | | | ___ TRDY# ^^^^^^^^\______________/ ^^^^^ | | | | ___ DEVSEL# ^^^^^^^^\______________/ ^^^^^ ___ | | | ___ MARCO N.° \_______________/ | ^^^^\____ _ _ |_ |_ |_ |_ _ _ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ 0 1 2 3 4 5 6 7
En el borde del reloj 1, el iniciador comienza una transacción al controlar una dirección, un comando y afirmar FRAME#. Las otras señales están inactivas (indicadas por ^^^), activadas por las resistencias pull-up de la placa base. Ese podría ser su ciclo de respuesta. En el ciclo 2, el objetivo activa tanto DEVSEL# como TRDY#. Como el iniciador también está listo, se produce una transferencia de datos. Esto se repite durante tres ciclos más, pero antes del último (borde del reloj 5), el maestro desactiva FRAME#, lo que indica que este es el final. En el borde del reloj 6, el bus AD y FRAME# no se activan (ciclo de respuesta) y las otras líneas de control se activan durante 1 ciclo. En el borde del reloj 7, otro iniciador puede iniciar una transacción diferente. Este también es el ciclo de respuesta para las otras líneas de control.
La ráfaga de lectura equivalente requiere un ciclo más, porque el objetivo debe esperar 1 ciclo para que el bus AD dé la vuelta antes de poder afirmar TRDY#:
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ ___ ___ ___ ___ ___ AD[31:0] ---<___>---<___X___X___X___>---<___> ___ _______ ___ ___ ___ C/BE[3:0]# ---<___X_______X___X___X___>---<___> ___ | | | | ___ IRDY# ^^^^\___________________/ ^^^^^ ___ _____ | | | | ___ TRDY# ^^^^ \______________/ ^^^^^ ___ | | | | ___ DEVSEL# ^^^^\___________________/ ^^^^^ ___ | | | ___ MARCO N.° \___________________/ | ^^^^\____ _ _ _ |_ |_ |_ |_ _ _ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ 0 1 2 3 4 5 6 7 8
Una ráfaga de alta velocidad terminada por el objetivo tendrá un ciclo adicional al final:
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ ___ ___ ___ ___ ___ AD[31:0] ---<___>---<___X___X___X___XXXX>---- ___ _______ ___ ___ ___ ___ C/BE[3:0]# ---<___X_______X___X___X___X___>---- | | | | ___ IRDY# ^^^^^^^\_______________________/ _____ | | | | _______ TRDY# ^^^^^^^ \______________/ ________________ | ___ ALTO# ^^^^^^^ | | | \_______/ | | | | ___ DEVSEL# ^^^^^^^\_______________________/ ___ | | | | ___ MARCO N.º \_______________________/ ^^^^ _ _ _ |_ |_ |_ |_ _ _ CLK_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ 0 1 2 3 4 5 6 7 8
En el borde del reloj 6, el objetivo indica que desea detenerse (con datos), pero el iniciador ya está manteniendo IRDY# bajo, por lo que hay una quinta fase de datos (borde del reloj 7), durante la cual no se transfieren datos.
El bus PCI detecta errores de paridad, pero no intenta corregirlos reintentando operaciones; es puramente una indicación de falla. Debido a esto, no hay necesidad de detectar el error de paridad antes de que ocurra, y el bus PCI lo detecta algunos ciclos después. Durante una fase de datos, el dispositivo que esté controlando las líneas AD[31:0] calcula la paridad par sobre ellas y las líneas C/BE[3:0]#, y la envía a la línea PAR un ciclo después. Todas las reglas de acceso y ciclos de respuesta para el bus AD se aplican a la línea PAR, solo un ciclo después. El dispositivo que escucha en el bus AD verifica la paridad recibida y confirma la línea PERR# (error de paridad) un ciclo después. Esto generalmente genera una interrupción del procesador, y el procesador puede buscar en el bus PCI el dispositivo que detectó el error.
La línea PERR# solo se utiliza durante las fases de datos, una vez que se ha seleccionado un objetivo. Si se detecta un error de paridad durante una fase de dirección (o la fase de datos de un ciclo especial), los dispositivos que lo observan activan la línea SERR# (error del sistema).
Incluso cuando algunos bytes están enmascarados por las líneas C/BE# y no están en uso, aún deben tener algún valor definido, y este valor debe usarse para calcular la paridad.
Debido a la necesidad de un ciclo de respuesta entre los diferentes dispositivos que controlan las señales del bus PCI, en general es necesario tener un ciclo inactivo entre las transacciones del bus PCI. Sin embargo, en algunas circunstancias se permite omitir este ciclo inactivo, pasando directamente del ciclo final de una transferencia (IRDY# confirmado, FRAME# desautorizado) al primer ciclo de la siguiente (FRAME# confirmado, IRDY# desautorizado).
Un iniciador sólo puede realizar transacciones consecutivas cuando:
Las restricciones de tiempo adicionales pueden provenir de la necesidad de dar la vuelta a las líneas de control del objetivo, en particular DEVSEL#. El objetivo anula la confirmación de DEVSEL#, lo que lo eleva, en el ciclo posterior a la fase de datos final, que en el caso de transacciones consecutivas es el primer ciclo de la fase de dirección. El segundo ciclo de la fase de dirección se reserva entonces para la respuesta de DEVSEL#, por lo que si el objetivo es diferente del anterior, no debe confirmar DEVSEL# hasta el tercer ciclo (velocidad media de DEVSEL).
Un caso en el que no puede surgir este problema es si el iniciador sabe de alguna manera (probablemente porque las direcciones comparten suficientes bits de orden superior) que la segunda transferencia está dirigida al mismo destino que la anterior. En ese caso, puede realizar transacciones consecutivas. Todos los destinos PCI deben admitir esto.
También es posible que el objetivo lleve un registro de los requisitos. Si nunca realiza un DEVSEL rápido, se cumplen trivialmente. Si lo hace, debe esperar hasta el tiempo DEVSEL medio a menos que:
Los objetivos que tienen esta capacidad lo indican mediante un bit especial en un registro de configuración PCI, y si todos los objetivos en un bus la tienen, todos los iniciadores pueden usar transferencias consecutivas libremente.
Un puente de bus de decodificación sustractiva debe saber que debe esperar este retraso adicional en el caso de ciclos consecutivos, para anunciar soporte consecutivo.
A partir de la revisión 2.1, [ se necesita una aclaración ] la especificación PCI incluye compatibilidad opcional con 64 bits. Esto se proporciona a través de un conector extendido que proporciona las extensiones de bus de 64 bits AD[63:32], C/BE[7:4]# y PAR64, y una serie de pines de alimentación y tierra adicionales. El conector PCI de 64 bits se puede distinguir de un conector de 32 bits por el segmento adicional de 64 bits.
Las transacciones de memoria entre dispositivos de 64 bits pueden utilizar los 64 bits para duplicar la velocidad de transferencia de datos. Las transacciones que no sean de memoria (incluidas las de configuración y acceso al espacio de E/S) no pueden utilizar la extensión de 64 bits. Durante una ráfaga de 64 bits, el direccionamiento de ráfaga funciona igual que en una transferencia de 32 bits, pero la dirección se incrementa dos veces por fase de datos. La dirección de inicio debe estar alineada con 64 bits; es decir, AD2 debe ser 0. Los datos correspondientes a las direcciones intermedias (con AD2 = 1) se transportan en la mitad superior del bus AD.
Para iniciar una transacción de 64 bits, el iniciador controla la dirección de inicio en el bus AD y afirma REQ64# al mismo tiempo que FRAME#. Si el destino seleccionado puede admitir una transferencia de 64 bits para esta transacción, responde afirmando ACK64# al mismo tiempo que DEVSEL#. Un destino puede decidir, en función de cada transacción, si permite una transferencia de 64 bits.
Si se activa REQ64# durante la fase de dirección, el iniciador también activa los 32 bits superiores de la dirección y una copia del comando de bus en la mitad superior del bus. Si la dirección requiere 64 bits, se requiere un ciclo de dirección dual, pero la mitad superior del bus lleva la mitad superior de la dirección y el código de comando final durante ambos ciclos de la fase de dirección; esto permite que un destino de 64 bits vea la dirección completa y comience a responder antes.
Si el iniciador ve que se afirma DEVSEL# sin ACK64#, realiza fases de datos de 32 bits. Los datos que se habrían transferido en la mitad superior del bus durante la primera fase de datos se transfieren en cambio durante la segunda fase de datos. Normalmente, el iniciador controla los 64 bits de datos antes de ver DEVSEL#. Si falta ACK64#, puede dejar de controlar la mitad superior del bus de datos.
Las líneas REQ64# y ACK64# se mantienen activas durante toda la transacción, salvo la última fase de datos, y se desactivan al mismo tiempo que FRAME# y DEVSEL#, respectivamente.
La línea PAR64 funciona igual que la línea PAR, pero proporciona paridad uniforme sobre AD[63:32] y C/BE[7:4]#. Solo es válida para fases de dirección si se confirma REQ64#. PAR64 solo es válida para fases de datos si se confirman tanto REQ64# como ACK64#.
PCI originalmente incluía soporte opcional para coherencia de caché de escritura diferida . Esto requería soporte por parte de destinos de memoria almacenables en caché, que escucharían dos pines de la caché en el bus, SDONE (snoop done) y SBO# (snoop backoff). [35]
Debido a que esto rara vez se implementó en la práctica, se eliminó de la revisión 2.2 de la especificación PCI, [16] [36] y los pines se reutilizaron para el acceso a SMBus en la revisión 2.3. [18]
La memoria caché vigilaría todos los accesos a la memoria, sin confirmar DEVSEL#. Si detectara un acceso que podría estar almacenado en caché, haría que SDONE estuviera en nivel bajo (no se realizó el espionaje). Un objetivo que admita la coherencia evitaría completar una fase de datos (confirmando TRDY#) hasta que observara que SDONE estaba en nivel alto.
En el caso de una escritura en datos que estaban limpios en la caché, la caché solo tendría que invalidar su copia y confirmaría SDONE tan pronto como esto se estableciera. Sin embargo, si la caché contenía datos sucios, la caché tendría que volver a escribirlos antes de que el acceso pudiera continuar, por lo que confirmaría SBO# al generar SDONE. Esto indicaría al objetivo activo que confirme STOP# en lugar de TRDY#, lo que provocaría que el iniciador se desconectara y volviera a intentar la operación más tarde. Mientras tanto, la caché arbitraría para el bus y volvería a escribir sus datos en la memoria.
Los objetivos que admiten la coherencia de caché también deben finalizar las ráfagas antes de que crucen las líneas de caché.
Al desarrollar y/o solucionar problemas del bus PCI, el análisis de las señales de hardware puede ser muy importante. Los analizadores lógicos y los analizadores de bus son herramientas que recopilan, analizan y decodifican señales para que los usuarios las visualicen de manera útil.
La serie ZX370 es un adaptador de 64 bits real que amplía la red para lograr un mayor rendimiento y, al mismo tiempo, ofrece compatibilidad con las ranuras PCI estándar de 32 bits.
Compatible con versiones anteriores de ranuras PCI de 32 bits y 33 MHz.
Aunque la Adaptec SCSI Card 29160 es una tarjeta PCI de 64 bits, también funciona en una ranura PCI de 32 bits. Cuando se instala en una ranura PCI de 32 bits, la tarjeta se ejecuta automáticamente en el modo más lento de 32 bits.