Indice articoli

 

pci-express





PCIe

PCI Express, abbreviato ufficialmente con PCIe (e molte volte confuse con PCI Extended, quest’ultimo ufficialmente abbreviato con PCI-X), è un formato di interfaccia per il bus di sistema e le periferiche di espansione. E’ stata create con l’intendo di rimpiazzare completamente le vecchie interfacce PCI, PCI-X, e AGP. L’interfaccia PCIe Express è fisicamente ed elettronicamente incompatibile con il format PCI, anche se condividono la stessa interfaccia software e quindi possono essere interconnesse tra loro. Durante lo sviluppo di questa nuova interfaccia, lo standard PCI Express veniva chiamato col il nome in codice Arapaho oppure 3GIO (che sta per 3rd Generation I/O).
Lo Standard PCIe è un formato di interfaccia seriale/parallelo. Questo standard (alla versione PCIe 1.1) è in grado di avere un transfer rate pari a 250 MB/s in ogni direzione per ogni canale. Con un massimo di 32 canali riusciamo quindi a raggiungere un transfer rate di ben 8GB/s in ogni direzione. Per capire meglio con un esempio pratico…un singolo canale PCIe ha quasi il doppio della potenza di trasferimento dello standard PCI; uno slot a quattro canali, ha un transfer rate paragonabile a quello di un PCI-X 1.0, e uno slot a otto canali lo possiamo paragonare alla versione più veloce dello standard AGP.
Diversamente dalle classiche porte di espansione PCI, lo standard PCI Express è sia full duplex che point to point. Questo significa che mentre il PCI-X 133mhz 64 bit e PCI Express x4 hanno lo stesso data transfer rate, se noi colleghiamo simultaneamente coppie multiple di dispositivi PCIe, avremo un grande incremento di performance pure.


In generale

Fisicamente il layer PCIe consiste in una rete di interconnessioni seriali. Un ponte che le schede madri utilizzano come uno switch multiplo che permette alle connessioni point to point tra i vari dispositivi di essere reindirizzate on the fly (ossia…al momento dell’utilizzo). Questo comportamento dinamico diventa anche parallelo dal momento che una coppia di devices può comunicare con un'altra allo stesso tempo. (Al contrario, le vecchie interfacce dei PC avevano tutte le periferiche costantemente collegate allo stesso bus, quindi solo una alla volta poteva “parlare”). Questo metodo è molto simile alla differenza tra conversazioni telefoniche dove siamo in diretto contatto con la persona con cui stiamo parlando o le conversazioni in un meeting dove dobbiamo aspettare il nostro turno per poter parlare. Questo formato permette inoltre il “canne grouping”, ossia dove canali multipli sono collegati insieme a una singola coppia di periferiche in modo da aumentare la banda passante (bandwith).
Il formato di unione in serie fu scelto al posto del tradizionale metodo in parallelo a causa del fenomeno globalmente conosciuto con timing skew. Questo fenomeno è una limitazione imposta dalla velocità della luce: quando un segnale elettrico percorre un filo viaggia ad una velocità finita. Siccome tracce differenti in un’interfaccia hanno lunghezze differenti, dei segnali paralleli trasmessi simultaneamente da una sorgente arrivano a destinazione in tempi diversi. Quando l’interconnessione del clock rate aumenta e arriva al punto dove le lunghezze d’onda di un singolo bit eccedono questa differenza di lunghezza della traccia, il bit di una singola parola non arriva a destinazione simultaneamente, così facendo è impossibile ricostruire la parola. Così la velocità della luce, combinata con la differenza di lunghezza tra la più lunga e la più corta traccia in una interconnessione parallela porta ad un massimo fisico di larghezza di banda per avere un trasferimento di dati stabile e sicuro. Un collegamento in serie dei canali non ha questo tipo di problemi visto che non ha bisogno che i dati arrivino simultaneamente a destinazione. PCIe è un esempio di questo tipo di connessione in serie. Altri esempio sono l’HyperTransport, il Serial ATA, e l’USB per farne alcuni dei più comuni. Ed è per questo motivo che nei server professionali si preferisce usare il SAS al posto delle normali connessioni.
Lo standard PCIe è stato supportato originariamente da Intel, che ha iniziato con il progetto Arapahoe, e ha seguito con il sistema InfiniBand. PCie è stato creato con l’intento di essere usato solo come un’interconnessione locale. E’ stato sviluppato per essere compatibile appieno con il vecchio standard PCI, in modo tale da rendere facile la conversione verso il PCIe appunto.


Sommario generale del protocollo Hardware


Il link PCIe è costruito attorno a una coppia dedicate e unidirezionale di connessioni in serie point-to-point conosciute come “canali”. Questo risulta essre in evidente contrasto con lo standard PCI, che è basato essenzialmente su un sistema di bus dove tutte le periferiche sono connesse allo stesso bus bidirezionale e parallelo a 32-bit o 64bit.
PCI Express è un protocollo a strati, che consiste essenzialmente in tre diversi layer: il Transaction Layer, un Data Link Layer, e un Physical Layer. Il Layer fisico è suddiviso ulteriormente in un sublayer logico ed uno elettrico.
Il sublayer logico a sua volta è frequentemente diviso in un Physical Coding Sublayer (PCS) e un sublayer Media Access Control (MAC).

Physical Layer

A livello elettrico, ogni canale utilizza due coppie segnali differenziali a basso voltaggio unidirezionali a 2.5 Gbit/s. La trasmissione e la ricezione sono coppie differenziali separate, per un totale di 4 cavi dati per canale.
Una connessione tra due periferiche PCIe viene chiamata “link”, ed è costituita dall’unione di 1 o più canali. Tutte le periferiche devono supportare come minimo un link a singolo canale (x1), ma possono anche supportare link più grandi composti di 2,4,8,12,16, o 32 canali. Ciò permette un’ampia compatibilità in due modi: una scheda PCIe può fisicamente entrare (e funzionare perfettamente) in un qualsiasi slot che è largo almeno quanto la scheda stessa (es.una scheda x1 potrà lavorare in qualsiasi slot), e uno slot di grandi dimensioni (per esempio un x16) può essrre connetto elettricamente con altri canali più piccoli (es. x1 o x8) sempre che riesca a provvedere alla corretta alimentazione richiesta dalla più grande ampiezza fisica dello slot. In entrambi i casi, il PCIe cercherà di usare il maggior numero di canali supportati vicendevolmente. Non è fisicamente possibile però inserire una scheda PCIe in uno slot più piccolo, nemmeno se fossero anche solo compatibili.
Il PCIe manda tutti i messaggi di controllo, incluse le interruzioni, attraverso lo stesso link usato per i dati. Il protocollo seriale non potrà mai essere bloccato, così la latenza sarà sempre compatibile con il PCI, che ha linee dedicate per le interruzioni.
I dati trasmessi su canali multipli sono intervallate, cioè significa che ogni byte successivo viene spedito attraverso il successivo canale. Le specifiche PCIe fanno riferimento a questo “interleaving” attraverso la voce “data striping”. Questo metodo richiede una grande complessità di hardware per sincronizzare (deskew) i dati trasmessi in striping, ma permette una maggiore potenza del canale.
Come tutti i grandi protocolli di trasmissione seriale, le informazioni riguardanti il Clock devono essere inserite nel segnale stesso. A livello fisico, PCI Express utilizza il comunissimo schema 8B/10B per l’encoding per assicurare che le stringhe di uno o zero consecutivi siano limitate in lunghezza. Questo è necessario per prevenire che il ricevitore perda la traccia dell’inizio e della fine del bit. Con questo schema di encoding, ogni 8Bit di trasmissione vengono rimpiazzati con 10 bit di trasmissione, consumanto un extra 20% di larghezza di banda elettrica.
Alcuni altri protocolli (SONET) usano differenti schemi di encoding, conosciuti come “scrambling” per implementare le informazioni del CLOCK all’interno del flusso di dati. Le specifiche del PCI Express definiscono anche un algoritmo di scrambling, ma questa forma di scrambling non deve essere confusa con quella inclusa nel SONET. Nel PCIe questa funzione viene utilizzata per evitare ripetizioni di serie di dati trasmessi.
La prima generazione PCIe è stata limitata ad un singolo rate di segnale a 2.5 Gbit/s. Le industrie specializzate in questo formato stanno già creando future versioni a 5 e 10 Gbit/s.

Data Link Layer

Il Data Link Layer implementa sequenze di pacchetti Layer di transazione (Transaction Layer Packet TLPs) che sono generati dal Layer Transazione, protezione di dati attraverso un ciclo di check ridondanti con un codice a 32-bit (cyclic redundancy check alias CRC, ma più conosciuto in questo contesto come LCRC), e un protocollo di riconoscimento (ACK e NAK). I TLP che passano un check LCRC diventano una sequenza di numeri risultati dal riconoscimento, o ACK, mentre quelli che non passano questo check diventano NAK. Pacchetti TLP che diventano NAK o timeout che occorrono nell’attesa di un ACK, diventano dei TLP che vengono ritrasmessi da uno speciale buffer che trasmette la serie di dati del Data Link Layer. Questo garantisce la consegna dei TLP al posto di rumore elettrico, evitando così ogni possibile malfunzionamento della periferica.
I segnali ACK e NAK sono comunicati attraverso pacchetti di basso livello conosciuti come pacchetti del data link layer appunto (in inglese data link layer packet o DLLP). Questi DLLP sono spesso usati per comunicare il informazioni sul controllo del flusso tra i transaction layers di due periferiche connesse, come anche alcune funzioni di power management.

Transaction Layer

Il PCI Express implementa transazioni separate (trasmissioni nelle quali la richiesta e la risposta sono separate nel tempo), permettendo al canale di portare altro traffico nel frattempo che il la periferica target acquisisce i dati per la risposta.
Il PCI Express utilizza un controllo del flusso basato sui “crediti”. In questo schema, una periferica accumula un tot di crediti iniziali per ogni trasmissione del buffer nel sul Layer Transaction. La periferica all’altro capo del link, quando sta mandando un segnale alla prima, conterà il numero di crediti consumati da ogni TLP. La periferica che trasmette può funzionare e quindi inviare un segnale solo se inviandolo non eccede il numero massimo di crediti a sua disposizione. Quando la periferica che acquisisce ha processato tutti i TLP dal suo buffer, manderà un segnale di crediti alla periferica trasmettitrice così da dargli altri crediti ripristinando il numero iniziale a sua disposizione. Questo schema è molto più vantaggioso di altri quali il Wait States, o il protocollo basato sul HandShake, poiché il segnale di ritorno dei crediti non danneggia le performance.
La prima generazione di PCIe supporta un data rate di 250 MB/s in ogni direzione, per ogni canale. Questo risultato è un calcolo banale, che viene fuori dividendo dal rate di segnale fisico (2.5 Gbaud) diviso per il segnale di encoding (che come sopra detto corrisponde a 10bits/byte). Questo significa che una scheda PCIe con il canale le a x16 è capace (teoricamente) di un trasnfer rate di ben 250 x 16 = 4GB/s in ogni direzione. Questo dato è corretto, ma certamente è più utile fare un calcolo basato su il carico realmente utilizzabile, che dipende dal profilo del traffico stesso, che è una funzione delle applicazioni (software) di alto livello e di livelli di protocollo intermediari. Lunghi trasferimenti continui di dati (come accade spesso con i controller di memoria) possono utilizzare anche più del 95% della capacità grezza del data rate del PCIe. Questi trasferimenti beneficiano maggiormente del numero di canali (x2, x4, etc.). Ma in molte applicazioni tipiche (che possono essere i controller USB o Ehternet) il profilo del traffico è caratterizzato come corti pacchetti di dati ma con frequenti riconoscimenti. Questo tipo di traffico riduce l’efficienza del link, a causa di un surplus di pacchetti da analizzare e quindi forzatamente interrotti (o nella periferica stessa o nella CPU del PC). Questo perdita di efficienza però non è così grande nel PCIe.