Nel framework PCI originale ("PCI convenzionale") e anche in PCI-X, i dispositivi corrispondevano a "slot", ciascuno con i propri connettori collegati allo stesso bus parallelo. Ogni slot aveva un pin ID univoco che era stato affermato durante l'enumerazione. L'enumerazione chiedeva essenzialmente (per ogni slot): "Ehi, c'è qualcosa di presente in questo slot?" Il dispositivo ha risposto guidando i dati sul bus in risposta a questo segnale. La mancanza di risposta non significava alcun dispositivo.
Un dispositivo potrebbe anche essere un "ponte", il che significava che formava un bus subordinato. Quel bus avrebbe un ID separato (assegnato dall'upstream) e avrebbe una propria serie di slot che erano enumerati in modo indipendente.
PCI-Express (PCIe) è totalmente diverso. PCIe non è in realtà un bus - come in una risorsa condivisa tra i dispositivi; invece ogni dispositivo ha una propria connessione seriale da punto a punto individuale al suo dispositivo a monte (e a tutti i dispositivi a valle - e se ha dispositivi a valle, significa che funziona anche come un ponte). Pensa a PCIe come a una LAN. Ogni bridge è analogo a uno switch, che ha un sacco di porte collegate ad altri dispositivi. Gli altri dispositivi possono essere terminali o potrebbero essere altri switch (ad esempio bridge PCIe).
PCIe è stato progettato in modo tale che la sua struttura concettuale e l'indirizzamento (e quindi il comportamento fornito al software) siano compatibili con PCI e PCI-X. L'implementazione però è completamente diversa. Nell'enumerare i dispositivi, ad esempio, dal momento che è punto-punto, l'unica domanda che deve essere determinata in ogni punto dell'enumerazione è "qualcosa lì?" Poiché ogni dispositivo ha un proprio set di fili indipendente, gli ID dei dispositivi sono essenzialmente tutti codificati (quindi ogni bridge, incluso il "complesso radice" di livello superiore, indica a ciascun dispositivo quale sarà il suo ID dispositivo).
In tutti i casi, la parte "funzione" del bus / dispositivo / funzione viene gestita rigorosamente all'interno della periferica. Ad esempio, un controller NIC a doppia porta avrà spesso due funzioni, una per ogni porta. Possono essere configurati e gestiti in modo indipendente, ma il percorso dei dati dalla CPU alla funzione è lo stesso per entrambi.