Arbitraggio centralizzato parallelo: il bus PCI.
      
      Finora abbiamo visto schemi di arbitraggio del bus di tipo daisy chaining. L’alternativa a questa configurazione è data da una connessione dei dispositivi in parallelo. Iniziamo analizzando un sistema di arbitraggio di un bus molto diffuso: il bus PCI6 .
      L’arbitraggio del bus PCI è centralizzato. L’arbitro, nella maggior parte delle architetture è integrato nel chip bridge comunemente chiamato chipset7 presente sulla scheda madre.
      Come è riportato in figura 6 tutti i dispositivi sono collegati all’arbitro tramite una coppia di  linee, REQ#8 e GNT#. Quando un dispositivo richiede il controllo del bus non deve far altro che asserire REQ# e attendere finché l’arbitro non lo avrà autorizzato all’accesso tramite la linea GNT#. Il dispositivo potrà così pilotare il bus per il prossimo ciclo.
      Nella letteratura relativa all’architettura PCI, il dispositivo che prende il controllo del bus è detto initiator, mentre quello a cui è indirizzata la transizione dell’initiator è detto target. In una transazione PCI, l’initiator è sempre il master e il target è lo slave. E’ usato anche il termine agent per indicare un generico dispositivo, sia esso master che slave, che entra in gioco nella transazione.
      
PCI_640.gif
Figura 6        Schema di arbitraggio del bus PCI

      E’ interessante conoscere quali sono i segnali coinvolti durante un trasferimento dei dati una volta che il master ha accesso al bus. La transazione ha inizio con l’asserzione da parte del initiator del segnale FRAME#. Questo sarà mantenuto attivo fino al termine del trasferimento. Il master dichiara con quale target vuole comunicare specificando il suo indirizzo su AD e il tipo di transazione da effettuare su C/BE# (lettura o scrittura). Il target risponderà asserendo DEVSEL# in modo da essere individuato sul bus PCI, in caso contrario la transazione viene annullata. Due segnali, IRDY# sull’initiator e TRDY# sul target indicano lo stato di pronto dei due agents e la loro comune asserzione a ogni impulso di clock, abilita il trasferimento del singolo dato. Se anche solo uno dei due segnali è negato non avviene il passaggio del dato e si genera uno ciclo di wait. Quando il trasferimento è quasi alla fine viene disasserito FRAME# proprio sul penultimo dato, quindi, dopo l’ultimo dato viene disasserito IRDY#. I segnale FRAME# e IRDY# entrambi disasseriti indicano che il bus è a riposo (idle).
      
      Le specifiche del bus PCI lasciano al progettista la scelta della strategia di arbitraggio: sono consentite tecniche di priorità dinamica o di round robin. L’unico requisito da rispettare è quello che l’arbitro deve favorire quanto più possibile la politica del fairness tra le periferiche, evitando lunghe attese per la concessione del bus.
      Una possibile soluzione è quella in cui l’arbitro del bus è programmato dal sistema. In questo modo ad ogni avvio il software di startup può determinare le priorità da assegnare ad ogni singolo master sulla base delle proprie caratteristiche tecniche. Il sistema può, inoltre, decidere di gestire i  dispositivi PCI suddividendoli in due categorie. Nella prima sono inseriti quegli agents che richiedono un accesso veloce al bus o necessitano di una larghezza di banda maggiore per raggiungere un livello di utilizzo ottimale (vedi schede video o adattatori di rete ATM), nel secondo gruppo tutti gli altri che non hanno particolari necessità di funzionamento (schede SCSI o altre interfaccie di espansione del bus). Per la scelta del master successivo, l’arbitro dovrà quindi considerare il primo gruppo, a priorità rotante, che comprende gli elementi a priorità più alta è un elemento del secondo gruppo che varia ad ogni cambio delle priorità.
      Per comprende meglio il modo in cui variano le priorità dell’esempio proposto, si possono considerare i master A e B facenti parte del primo gruppo e X, Y e Z i master del secondo gruppo. Riferendoci alla figura 7 si comprende quale sarà l’ordine col quale i master potranno accedere al bus:
      
      A – B – X – A – B – Y – A – B – Z – A – B – X – …

Priorita_PCI_530.gif
Figura 7        Esempio di un possibile schema di arbitraggio.

       In questo modo i master del primo gruppo possono accedere al bus più frequentemente rispetto a quelli del secondo soddisfacendo così il requisito di fairness.
      
       Una volta che un dispositivo ha accesso al bus potrà utilizzarlo per effettuare una singola transazione e successivamente dovrà attendere per favorire eventuali altre richieste. In assenza di richieste da parte di altri dispositivi potrà continuare a utilizzare il bus ma ad ogni transizione dovrà seguire una fase di inattività.
      In situazioni particolari un master può continuare a mantenere asserito REQ# e se l’arbitro mantiene GNT# per mancanza di altre richieste a priorità più alta, può effettuare una serie di transizioni consecutive, impiegando al massimo il bus in una sequenza di cicli cosiddetti back-to-back. Nel momento in cui un secondo dispositivo fa una richiesta del bus l’arbitro nega il grant del master corrente, il quale campionando costantemente il proprio segnale di autorizzazione, è costretto a rilasciare il bus al termine della transazione in corso.
      Diversamente da altri schemi di arbitraggio quello del PCI è nascosto, cioè avviene durante il trasferimento precedente, in modo che nessun ciclo di bus venga penalizzato.
      
      Come nell’arbitraggio del Multibus I anche per il PCI è possibile implementare la tecnica del bus parking. Se il progettista ha implementato uno schema di bus parking, l’arbitro sarà in grado di indicare un master del bus al quale, in assenza di altre richieste, sarà sempre garantito il segnale GNT# asserito. Quindi, in assenza di altre linee REQ# attive, il bus master scelto per default avrà sempre immediato accesso al bus. Se il dispositivo su cui è “parcheggiato” il bus volesse effettuare una transazione può farlo immediatamente senza la necessità di asserire il segnale di REQ#, l’unica condizione è che il bus sia nello stato di idle (FRAME# e IRDY# disasseriti) e ovviamente GNT# asserito.
      La scelta del master su quale effettuare il parking deve essere compiuta in sede di progettazione. Si può optare di scegliere l’ultimo master che ha utilizzato il bus, o sceglierne uno predefinito per default.
      Un punto importante da evidenziare è che la scelta di implementare una tale tecnica delega al master candidato al bus parking la responsabilità della gestione dei segnali di indirizzamento quando il bus è idle. Potrebbe infatti verificarsi che, durante uno stato di idle, l’arbitro tolga il GNT# ad un master per assegnarlo ad un altro, e nello stesso istante il primo agents asserisca il segnale FRAME#. In questo caso il master continuerà la transazione andando a scrivere l’indirizzo del target su AD. Il secondo master che vede lo stato di idle ed ha ottenuto il GNT#, inizia anch’esso la comunicazione col suo slave. Questa situazione che in assenza del bus parking è gestita dall’arbitro, in questo caso è affidata al park master che dovrà garantire che tra la revoca del GNT# e la sua riassegnazione esista un ritardo (arbitration latency) di almeno un ciclo di clock9 .
      
      Concludiamo questa panoramica sull’arbitraggio del bus PCI analizzando  il caso di due agents che concorrono per l’uso del bus.
      Consideriamo due master A e B e supponiamo che A debba effettuare due transazioni mentre B debba compierne solo una. Supponiamo inoltre che B abbia una priorità più alta di A o che lo schema delle priorità sia rotazionale e che B sia quindi il successivo ad utilizzare il bus.

Grafico%20arbitraggio%20PCI_640.gif
Figura 8    Arbitraggio del bus PCI tra due master. Mostra come l’arbitro alterna il controllo del bus tra i due agents.
        
      Nella figura 8 è riportato l’andamento dei segnali durante la fase di arbitraggio tra i due initiator, ovvero il passaggio del controllo da un master ad un altro a priorità maggiore. Tutti i segnali sul bus PCI sono campionati sul fronte di salita del clock.
      
      Riferendoci alla figura 1-8 abbiamo la seguente successione di eventi di clock:
      
1. Il master A antecedentemente al clock 1 aveva già asserito il suo segnale di REQ# per cui l’arbitro,monitorando la richiesta, gli assegna il bus asserendo GNT#. Nello stesso periodo di clock il master B attiva il suo segnale di REQ#, indicando il desiderio di eseguire una transazione.

2. Durante il secondo ciclo di clock il master A campiona il suo GNT# asserito e lo stato idle del bus (FRAME# e IRDY# disasseriti). A questo punto A inizia la transazione asserendo FRAME# ma non disattiva REQ# in quanto deve effettuare una seconda transazione. L’arbitro, monitorando le richieste di A e B, inizia la fase di arbitraggio per determinare chi sarà il prossimo master. Questa fase avviene parallelamente al trasferimento dei dati di A (arbitraggio nascosto).    
3. Sul fronte di salita del terzo ciclo di clock, l’arbitro rimuove il grant dal master A e lo assegna al master B. Il master B non pùò comunque usare il bus finché questo non torna nello stato di riposo. Nel frattempo A disasserisce FRAME# perché sta per trasferire l’ultimo gruppo di dati.

4. Durante il clock 4 il master A conclude il suo primo trasferimento e riporta il bus nello stato di idle (disasserisce IRDY#).

5. Sul fronte di salita del clock 5 il master B vede il bus a riposo e asserisce FRAME# avviando la sua transazione.

6. Sul fronte di salita del sesto clock il master B disasserisce FRAME# perché sta per teminare il suo trasferimento. L’arbitro disasserisce il grant di B e, poiché A ha mantenuto la sua richiesta sempre attiva, asserisce GNT# di A.

7. Sul settimo fronte di salita di clock il master B riporta il bus nello stato di idle. Il master A monitorando il bus libero ne riprende il controllo.


first.pngprev.pngnext.pnglast.png