周辺機器相互接続( PCI ) [ 3 ]は、コンピュータにハードウェアデバイスを接続するためのローカル コンピュータ バスであり、 PCI ローカル バス規格の一部です。PCI バスは、プロセッサ バスにある機能をサポートしますが、特定のプロセッサのネイティブ バスとは独立した標準化された形式で提供されます。PCI バスに接続されたデバイスは、バス マスターからは自身のバスに直接接続されているように見え、プロセッサのアドレス空間内のアドレスが割り当てられます。[ 4 ]これは、単一のバス クロックに同期したパラレルバスです。
接続デバイスは、マザーボードに取り付けられた集積回路(PCI 仕様では平面デバイスと呼ばれる)またはスロットに挿入される拡張カードのいずれかの形をとることができます。 PCI ローカルバスは、最初にIBM PC 互換機で実装され、複数の低速なIndustry Standard Architecture (ISA) スロットと 1 つの高速なVESA Local Bus (VLB) スロットの組み合わせをバス構成として置き換えました。その後、他の種類のコンピュータにも採用されました。 PC で使用される典型的な PCI カードには、ネットワーク カード、サウンド カード、モデム、ユニバーサル シリアル バス ( USB ) やシリアルなどの追加ポート、TV チューナー カード、ハードディスク ドライブ ホストアダプタなどがあります。 PCIビデオ カードは、帯域幅の要求が PCI の能力を超えるまで、ISA カードと VLB カードに取って代わりました。その後、ビデオ カードの好ましいインターフェイスは、 PCI の上位互換であるAccelerated Graphics Port (AGP) になり、その後PCI Expressに取って代わられました。[ 5 ]
最初の PCI 仕様はIntelによって開発されましたが、その後の標準の開発はPCI Special Interest Group ( PCI-SIG ) の責任となりました。[ 6 ]市販のデスクトップ コンピュータに搭載された最初の PCI バージョンは、32 ビットバスを使用していました。33 MHz バスクロックと PCI 1.0 規格では64 ビット版も規定されていたが、 5 V信号が使用されていた。 [ 7 ]これらのカードには位置決め用の切り欠きが 1 つある。PCI 規格のバージョン 2.0 では 3.3 V スロットが導入され、5 V カードの誤挿入を防ぐために物理的にコネクタが反転して区別される 。どちらの電圧でも動作できるユニバーサル カードには切り欠きが 2 つある。PCI 規格のバージョン 2.1 では、オプションで 66 MHz 動作が導入された。サーバー向けの PCI のバリアントである PCI Extended ( PCI-X ) は、PCI-X 1.0 では最大 133 MHz、PCI-X 2.0 では最大 533 MHz の周波数で動作した。ラップトップ カード用の内部コネクタであるMini PCIは、PCI 仕様のバージョン 2.2 で導入された。PCI バスは、外部ラップトップ コネクタ規格である CardBus としても採用された。[ 8 ]
PCIとPCI-Xは、シリアルレーンベースのアーキテクチャを採用したより新しい後継規格であるPCI Expressと技術的に区別するために、パラレルPCIまたは従来型PCIと呼ばれることもあります[ 9 ] 。 [ 10 ] [ 11 ]デスクトップコンピュータ市場におけるPCIの全盛期は、およそ1995年から2005年でした[ 10 ] 。PCIとPCI-Xは、ほとんどの用途で時代遅れになり、2013年以降、他の多くの最新マザーボードからほぼ姿を消しましたが、 2020年現在でも一部の最新デスクトップでは一般的です。後方互換性と比較的低コストでの製造を目的として、パラレルPCIは広く採用されています。また、産業用PCでは、多くの専用拡張カードがPCI Expressに移行せず、一部のISAカードがPCIに移行しなかったのと同様です。かつてPCI拡張カードで利用可能だった多くの種類のデバイスは、現在ではマザーボードに統合されているか、USBおよびPCI Expressバージョンで提供されています。


PCIの開発は、1990年頃にインテル・アーキテクチャ・ラボ(IAL、アーキテクチャ開発ラボとも呼ばれる)で始まった。主にIALのエンジニアからなるチームが、同社のデスクトップPCシステムおよびコアロジック製品部門のチームと協力し、アーキテクチャを定義し、概念実証用のチップセットとプラットフォーム(Saturn)を開発した。
PCIはすぐにサーバーで使われるようになり、サーバー拡張バスとしてマイクロチャネルアーキテクチャ(MCA)や拡張産業標準アーキテクチャ(EISA)に取って代わりました。主流のPCでは、PCIはVLBに取って代わるのが遅く、第2世代Pentium PCで1994年後半まで市場に大きく浸透しませんでした。1996年までにVLBはほぼ消滅し、メーカーはIntel 80486(486)コンピュータにもPCIを採用しました。[ 12 ] EISAは2000年までPCIと並行して使用され続けました。Apple Computerは1995年半ばにプロフェッショナル向けPower Macintoshコンピュータ(NuBusに取って代わる)にPCIを採用し、1996年半ばには消費者向けPerforma製品ライン(LC Processor Direct Slot(PDS)に取って代わる)にPCIを採用しました。
サーバー市場以外では、プレーンな PCI の 64 ビット版は実際には稀であったが、[ 13 ]例えば(iMac 以降の) G3およびG4 Power Macintosh コンピュータすべてで使用されていた。[ 14 ]
PCIの後の改訂版では、 66MHz 3.3V規格や133MHz PCI -Xなどの新機能や性能向上、そしてPCI信号方式のその他のフォームファクタへの対応などが追加されました。PCI-X 1.0bとPCI-X 2.0はどちらも一部のPCI規格との下位互換性があります。これらの改訂版はサーバーハードウェアで使用されましたが、一般消費者向けPCハードウェアはほぼすべて32ビット、33MHz 、5Vのままでした。
PCI-SIGは2004年頃にシリアルPCI Expressを導入しました。それ以来、マザーボードメーカーは新しい規格を優先し、PCIスロットの数を徐々に減らしたり、あるいは完全に廃止したりしてきました。ブリッジアダプタを使用することで、従来のPCIカードをPCI Expressマザーボードで使用できるようになります。
PCIは、 x86プロセッサファミリ向けに、それぞれ64ビットと32ビットのメモリおよびメモリマップドI/Oポートのアドレス空間を個別に提供します。これらのアドレス空間のアドレスはソフトウェアによって割り当てられます。PCIコンフィギュレーション空間と呼ばれる3つ目のアドレス空間は、固定アドレッシング方式を採用しており、ソフトウェアが各デバイスに必要なメモリおよびI/Oアドレス空間の量を決定できます。各デバイスは、コンフィギュレーション空間レジスタを介して、最大6つのメモリ空間または入出力(I/O)ポート空間を要求できます。
一般的なシステムでは、ファームウェア(またはオペレーティングシステム)は起動時に(PCIコンフィギュレーションスペースを介して)すべてのPCIバスに問い合わせを行い、どのデバイスが存在し、それぞれがどのようなシステムリソース(メモリ空間、I/O空間、割り込み線など)を必要としているかを把握します。そして、リソースを割り当て、各デバイスに割り当てられたリソースを通知します。
PCI構成空間には、少量のデバイスタイプ情報も含まれており、これはオペレーティングシステムがデバイスドライバを選択する際、あるいは少なくともシステム構成についてユーザーと対話する際に役立ちます。
デバイスには、x86またはPA-RISCプロセッサ用の実行可能コード、オープンファームウェアドライバ、またはオプションROMを含むオンボード読み出し専用メモリ(ROM)が搭載されている場合があります。これらは通常、オペレーティングシステムによってデバイスドライバがロードされる前の、システム起動時に使用されるデバイスに必要です。
さらに、PCIレイテンシータイマーという仕組みがあり、これはPCIバスマスタリングデバイスがPCIバスを公平に共有するためのものです。ここでいう「公平」とは、デバイスが利用可能なPCIバス帯域幅の大部分を占有しすぎて、他のデバイスが必要な処理を実行できなくなることがないことを意味します。なお、これはPCI Expressには適用されません。
この仕組みは、バスマスターモードで動作できる各PCIデバイスが、レイテンシータイマーと呼ばれるタイマーを実装し、そのデバイスがPCIバスを保持できる時間を制限するというものです。タイマーはデバイスがバスの所有権を取得すると開始され、PCIクロックの速度でカウントダウンします。カウンタがゼロになると、デバイスはバスを解放する必要があります。バスの所有権を待っている他のデバイスがない場合は、単にバスを再び取得してさらにデータを転送することができます。[ 17 ]
デバイスは、割り込み要求(IRQ) ラインを共有できるように、プロトコルに従う必要があります。PCI バスには、INTA# から INTD# までの 4 つの割り込みラインがあり、それぞれが各デバイスで使用できます。APIC 対応の x86 システムでは、最大 8 つの PCI デバイスが同じ IRQ ライン (INTINA# から INTINH#) を共有します。割り込みラインは、他の PCI バスラインのように並列に配線されていません。割り込みラインの位置はスロット間でローテーションするため、あるデバイスでは INTA# ラインに見えるものが、次のデバイスでは INTB# となり、その次のデバイスでは INTC# となります。通常、単一機能デバイスは割り込み信号に INTA# を使用するため、デバイスの負荷は使用可能な 4 つの割り込みライン全体にほぼ均等に分散されます。これにより、割り込みの共有に関する一般的な問題が軽減されます。
PCIホストブリッジを介したPCI割り込みラインとシステム割り込みラインのマッピングは、実装に依存します。プラットフォーム固有のファームウェアまたはオペレーティングシステムコードは、このことを認識し、各デバイスの構成空間にある「割り込みライン」フィールドを設定して、どのIRQに接続されているかを示します。
PCI割り込みラインはレベルトリガー方式を採用しています。これは、共有割り込みラインを処理する際に有利になるため、また堅牢性を高めるためにエッジトリガー方式よりも選択されました。エッジトリガー方式の割り込みは見逃しやすいためです。
PCI仕様の後の改訂版では、メッセージシグナリング割り込みのサポートが追加されました。このシステムでは、デバイスは専用ラインをアサートするのではなく、メモリ書き込みを実行することでサービスが必要であることを通知します。これにより、割り込みライン不足の問題が軽減されます。割り込みベクタが共有される場合でも、レベルトリガー割り込みのような共有の問題は発生しません。また、メモリ書き込みがデバイスとホスト間で予測不能な変更を受けないため、ルーティングの問題も解決されます。さらに、メッセージシグナリングはインバンドであるため、ポストライトやアウトオブバンド割り込みラインで発生する可能性のある同期の問題も解決されます。
PCI Expressには物理的な割り込み線は一切ありません。メッセージシグナルによる割り込みのみを使用します。

これらの仕様は、一般的なPCで使用されている最も一般的なPCI規格を表しています。
PCI規格では、 3.3V信号、64ビットバス幅、66MHz クロックなどのオプションも提供されていますが、これらはサーバーマザーボードのPCI-Xサポート以外ではあまり見かけません。
PCIバスアービタは、PCIバス上の複数のマスター間でバス調停を行います。PCIバス上には任意の数のバスマスターが存在し、バスへの要求も同時に受け付けることができます。各バスマスターには、要求信号と許可信号のペアが1組ずつ割り当てられています。

一般的なPCIカードには、信号電圧に応じて1つまたは2つのキーノッチがあります。3.3 ボルトを必要とするカードは 、カードのバックプレートから56.21mmの位置にあるピン位置12と13にノッチがあり、5 ボルトを必要とするカードは 、バックプレートから104.41mmの位置にあるピン位置50と51にノッチがあります。これにより、カードは対応する電圧のスロットにのみ装着できます。どちらの電圧にも対応する「ユニバーサルカード」には、両方のキーノッチがあります。
PCI コネクタは、エッジ コネクタの両側に 62 個の接点があると定義されていますが、そのうち 2 つまたは 4 つがキー ノッチに置き換えられているため、カードの両側には 60 個または 58 個の接点があります。A 面は「はんだ付け側」、B 面は「コンポーネント側」を指します。コネクタを下向きにしてカードを持つと、A 面のビューではバックプレートが右側にあり、B 面のビューではバックプレートが左側にあります。B 面と A 面のピン配置は、マザーボード コネクタを上から見た場合、次のようになります (ピン A1 と B1 がバックプレートに最も近い)。[ 16 ] [ 18 ] [ 19 ]
64ビットPCIでは、AD[63:32]、C/BE[7:4]#、PAR64パリティ信号、および多数の電源ピンとグランドピンを提供する32個の接点が両側に追加されます。
ほとんどの配線は各スロットに並列に接続されています。例外は以下のとおりです。
注:


ほとんどの32ビットPCIカードは64ビットPCI-Xスロットでも正常に動作しますが、バスのクロック周波数は最も遅いカードのクロック周波数に制限されます。これはPCIの共有バス構造に内在する制限です。例えば、133MHzのPCI-Xバスに66MHzのPCI 2.3周辺機器を装着すると 、バス全体のバックプレーンは66MHzに制限されます 。この制限を回避するため、多くのマザーボードには2つ以上のPCI/PCI-Xバスが搭載されており、一方のバスは高速PCI-X周辺機器用、もう一方のバスは汎用周辺機器用となっています。
多くの64ビットPCI-Xカードは、短い32ビットコネクタに挿入した場合、パフォーマンスが多少低下するものの、32ビットモードで動作するように設計されています。[ 22 ] [ 23 ]例として、Adaptec 29160 64ビットSCSIインターフェースカードが挙げられます。[ 24 ]ただし、一部の64ビットPCI-Xカードは、標準の32ビットPCIスロットでは動作しません。[ 25 ]
64ビットPCI-Xカードを32ビットスロットに取り付けると、カードエッジコネクタの64ビット部分が接続されずに突き出た状態になります。そのため、マザーボード上の部品が、突き出たカードエッジコネクタ部分を機械的に妨げるような位置にあってはなりません。
PCIブラケットの高さ:
PCIカードの長さ(標準ブラケットと3.3V ):[ 28 ]
PCIカードの長さ(ロープロファイルブラケットと3.3V ):[ 29 ]




ミニPCIは、ノートパソコンや一部のルーターで使用するためにPCIバージョン2.2に追加されました。32ビット、33MHzのバスを使用し、電源接続(3.3Vのみ、5Vは100mAに制限)とバスマスタリングおよびDMAのサポートを備えています。ミニPCIカードの標準サイズは、フルサイズのカードの約4分の1です。コネクタをブラケットで固定するデスクトップPCIカードとは異なり、ケースの外側からカードにアクセスすることはできません。そのため、ミニPCIカードで実行できる機能の種類が制限されます。
Mini PCIデバイスは、Wi-Fi、Fast Ethernet、Bluetooth、モデム(多くはWinmodem)、サウンドカード、暗号化アクセラレータ、SCSI、IDE - ATA、SATAコントローラ、およびコンボカードなど、数多く開発されました。Mini PCIカードは、Mini PCI-to-PCIコンバータを使用することで、通常のPCI対応ハードウェアと併用できます。Mini PCIは、より幅の狭いPCI Express Mini Cardに取って代わられました。
ミニPCIカードの 最大消費電力は2Wであるため、このフォームファクタで実装できる機能が制限されます。また、電力管理のためにPCIクロックの開始と停止に使用されるCLKRUN# PCI信号をサポートする必要があります。
カードのフォームファクタは、タイプ I、タイプ II、タイプ III の 3 種類あります。各タイプで使用されるカード コネクタは次のとおりです。タイプ I と II は 100 ピンのスタッキング コネクタを使用し、タイプ III は 124 ピンのエッジ コネクタを使用します。つまり、タイプ I と II のコネクタは、SO -DIMMのようにカードの端にあるタイプ III のコネクタとは異なります。追加の 24 ピンは、システム コネクタ (オーディオ、AC-Link、LAN 、電話回線インターフェイス) を介してI/O をルーティングするために必要な追加信号を提供します。タイプ II カードには、RJ11 および RJ45 マウント コネクタがあります。これらのカードは、RJ11 および RJ45 ポートを外部アクセス用にマウントできるように、コンピュータまたはドッキング ステーションの端に配置する必要があります。
Mini PCIは144ピンのMicro PCIとは異なります。[ 30 ]
PCIバスのトラフィックは、一連のPCIバス・トランザクションで構成されます。各トランザクションは、アドレス・フェーズとそれに続く1つ以上のデータ・フェーズからなります。データ・フェーズの方向は、イニシエータからターゲット(書き込みトランザクション)またはターゲットからイニシエータ(読み出しトランザクション)のいずれかですが、すべてのデータ・フェーズは同じ方向でなければなりません。どちらの側も、任意の時点でデータ・フェーズを一時停止または停止できます。(一般的な例としては、バースト・トランザクションをサポートせず、最初のデータ・フェーズの後に必ずトランザクションを停止する低性能のPCIデバイスが挙げられます。)
どのPCIデバイスもトランザクションを開始できます。まず、マザーボード上のPCIバスアービタに許可を要求します。アービタは、要求したデバイスのうち1つに許可を与えます。開始デバイスは、32ビットのアドレスと4ビットのコマンドコードをブロードキャストしてアドレスフェーズを開始し、ターゲットからの応答を待ちます。他のすべてのデバイスはこのアドレスを調べ、数サイクル後にいずれかのデバイスが応答します。
64ビットアドレッシングは、2段階のアドレスフェーズを使用して行われます。イニシエータは、下位32ビットのアドレスと、特別な「デュアルアドレスサイクル」コマンドコードをブロードキャストします。64ビットアドレッシングをサポートしていないデバイスは、このコマンドコードに応答できません。次のサイクルでは、イニシエータは上位32ビットのアドレスと実際のコマンドコードを送信します。トランザクションは、それ以降は同じように動作します。32ビットPCIデバイスとの互換性を確保するため、上位アドレスビットがすべてゼロの場合など、必要でない限りデュアルアドレスサイクルを使用することは禁止されています。
PCIバスはデータフェーズごとに32ビットを転送しますが、イニシエータはアクティブローのバイトイネーブル信号を4つ送信し、どの8ビットバイトが重要とみなされるかを示します。特に、書き込みはターゲットPCIデバイスで有効化されたバイトのみに影響を与える必要があります。これらのバイトはメモリ読み出しにはほとんど影響しませんが、I/O読み出しには副作用が生じる可能性があります。PCI規格では、有効化されたバイトがないデータフェーズを明示的に許可しており、これは何もしない動作として扱われます。
PCIには、メモリ、I/Oアドレス、コンフィギュレーションという3つのアドレス空間があります。
メモリアドレスは32 ビット(オプションで64ビット)のサイズで、キャッシュをサポートし、バーストトランザクションに対応しています。
I/Oアドレスは、Intel x86アーキテクチャのI/Oポートアドレス空間との互換性を確保するためのものです。PCIバスの仕様では、任意のアドレス空間でのバーストトランザクションが可能ですが、ほとんどのデバイスはメモリアドレスのみをサポートし、I/Oアドレスはサポートしていません。
最後に、PCI構成空間は、 PCIデバイスごとに256バイトの特殊構成レジスタへのアクセスを提供します。各PCIスロットには、独自の構成空間アドレス範囲が割り当てられます。これらのレジスタは、トランザクション開始者からの応答に応じてデバイスのメモリおよびI/Oアドレス範囲を設定するために使用されます。コンピュータの電源が最初にオンになると、すべてのPCIデバイスは構成空間へのアクセスにのみ応答します。コンピュータのBIOSはデバイスをスキャンし、メモリおよびI/Oアドレス範囲を割り当てます。
アドレスがどのデバイスにも使用されていない場合、トランザクション開始者のアドレスフェーズがタイムアウトし、開始者は操作を中止します。読み取りの場合、読み取りデータ値にはすべて1(0xFFFFFFFF)を指定するのが一般的です。そのため、PCIデバイスは、このようなエラーをソフトウェアで容易に検出できるように、重要なステータスレジスタにすべて1の値を使用することを避けるようにしています。
4ビットのコマンドコードは16種類あり、そのうち12種類が割り当てられています。固有のデュアルアドレスサイクルを除き、コマンドコードの最下位ビットは、後続のデータフェーズが読み出し(ターゲットからイニシエータへ送信されるデータ)か書き込み(イニシエータからターゲットへ送信されるデータ)かを示します。PCIターゲットは、アドレスだけでなくコマンドコードも確認し、サポートされていないコマンドコードを指定するアドレスフェーズには応答してはなりません。
キャッシュラインを参照するコマンドは、PCI構成空間のキャッシュラインサイズレジスタが正しく設定されていることを前提としています。そのため、設定が完了するまではこれらのコマンドを使用できません。
PCI仕様の公布後まもなく、一部のデバイスでは、応答の遅延、長いデータバースト、またはそれらの組み合わせにより、トランザクションが長くなり、他のデバイスでバッファアンダーランまたはオーバーランが発生する可能性があることが判明しました。リビジョン2.0における各フェーズのタイミングに関する推奨事項は、リビジョン2.1で必須となりました。[ 32 ]: 3
さらに、改訂版2.1以降、2つ以上のデータフェーズをバーストできるすべてのイニシエータは、プログラム可能なレイテンシタイマーを実装する必要があります。このタイマーは、トランザクションが開始されたとき(イニシエータがFRAME#をアサートしたとき)にクロックサイクルのカウントを開始します。タイマーが期限切れになり、アービタがGNT#を削除した場合、イニシエータは次の有効な機会でトランザクションを終了する必要があります。これは通常、次のデータフェーズですが、メモリ書き込みトランザクションと無効化トランザクションはキャッシュラインの最後まで継続する必要があります。
これらのタイミング制限を満たせないデバイスは、ポストライト(メモリ書き込み用)と遅延トランザクション(その他の書き込みおよびすべての読み出し用)を組み合わせて使用する必要があります。遅延トランザクションでは、ターゲットはトランザクション(書き込みデータを含む)を内部的に記録し、最初のデータフェーズを中止(TRDY#ではなくSTOP#をアサート)します。イニシエータは、後でまったく同じトランザクションを再試行する必要があります。その間、ターゲットは内部的にトランザクションを実行し、再試行されたトランザクションを待ちます。再試行されたトランザクションが検出されると、バッファリングされた結果が配信されます。
デバイスは、遅延トランザクションを完了している間にも、他のトランザクションのターゲットとなる可能性があります。そのため、トランザクションの種類、アドレス、バイト選択、および(書き込みの場合は)データ値を記憶し、正しいトランザクションのみを完了する必要があります。
ターゲットが内部的に記録できる遅延トランザクションの数に制限を設けている場合(単純なターゲットでは1に制限される場合がある)、それらのトランザクションは記録されずに再試行されます。これらのトランザクションは、現在の遅延トランザクションが完了したときに処理されます。2つのイニシエータが同じトランザクションを試行した場合、一方のイニシエータが開始した遅延トランザクションの結果が他方のイニシエータに渡される可能性がありますが、これは問題ありません。
ターゲットは、バッファリングされた結果のリトライが成功した場合、バスがリセットされた場合、またはリトライが受信されないまま 2 15 = 32768 クロックサイクル (約 1 ms) が経過した場合に、遅延トランザクションを中止します。後者は通常の動作では発生しませんが、イニシエータがリセットまたは誤動作した場合にバス全体がデッドロックするのを 防ぎます。
PCI 規格では、複数の独立した PCI バスをバスブリッジで接続し、必要に応じてあるバスの操作を別のバスに転送することができます。PCI ではバスブリッジをあまり使用しませんが、PCI Expressシステムでは、通常PCI Express ルートポートと呼ばれる多数の PCI-to-PCI ブリッジを使用します。各 PCI Express スロットは、ブリッジで他のスロットに接続された独立したバスのように見えます。PCI ホストブリッジ (通常、 x86 プラットフォームではノースブリッジ) は、CPU、メインメモリ、および PCI バスを相互接続します。[ 33 ]
一般的に、バスブリッジが一方のバスでトランザクションを検出し、それを他方のバスに転送する必要がある場合、元のトランザクションは、転送されたトランザクションが完了するまで結果を待たなければなりません。注目すべき例外は、メモリ書き込みの場合です。この場合、ブリッジは書き込みデータを内部に記録し(空き容量がある場合)、転送された書き込みが完了する前に書き込みの完了を通知することができます。あるいは、転送が開始される前に通知することも可能です。このような「送信済みだが未到着」の書き込みは、郵便メッセージになぞらえて「ポスト書き込み」と呼ばれます。これらはパフォーマンス向上に大きな可能性をもたらしますが、何が許容されるかを規定するルールはやや複雑です。[ 34 ]
PCI規格では、特定の状況下でバスブリッジが複数のバス・トランザクションを1つの大きなトランザクションに変換することを許可しています。これにより、PCIバスの効率を向上させることができます。
連続するアドレスへの書き込みトランザクションは、バースト内のアクセス順序が元の書き込み順序と同じである限り、より長いバースト書き込みとして結合することができます。書き込みがほぼ連続している場合は、すべてのバイトイネーブルをオフにした追加のデータフェーズを挿入することが許可されます。
同一ワードの異なる部分への複数の書き込みは、複数のバイトイネーブルをアサートすることで、単一の書き込みにマージされることがあります。この場合、特定の順序でバスブリッジに提示された書き込みはマージされ、転送時に同時に実行されます。
同じバイトまたは複数のバイトへの書き込みは、例えば、2回目の書き込みのみを実行し、上書きされた最初の書き込みをスキップするといった方法で結合することはできません。これは、PCI仕様では書き込みに副作用が生じることが許容されているためです。
PCI バス トランザクションは、5 つの主要な制御信号によって制御されます。そのうち 2 つはトランザクションの開始者によって駆動され (FRAME# と IRDY#)、3 つはターゲットによって駆動されます (DEVSEL#、TRDY#、および STOP#)。トランザクションを開始する許可を取得するために使用される追加の 2 つのアービトレーション信号 (REQ# と GNT#) があります。[ 7 ]これらはすべてアクティブ ローであり、アクティブ状態またはアサート状態は低電圧です。マザーボード上のプルアップ抵抗により、デバイスによって駆動されていない場合は高 (非アクティブまたはデアサート) に保たれますが、PCI バスは信号レベルを変更するために抵抗に依存しません。すべてのデバイスは、信号の駆動を停止する前に、1 サイクルの間信号を高レベルに駆動します。
PCIバス信号はすべてクロックの立ち上がりエッジでサンプリングされます。信号は通常クロックの立ち下がりエッジで変化するため、各PCIデバイスは立ち上がりエッジで観測した信号に対する応答方法を決定するのに約半クロックサイクル、応答を他のデバイスに送信するのにさらに半クロックサイクルの猶予が与えられます。
PCIバスでは、PCIバス信号を駆動するデバイスが切り替わるたびに、一方のデバイスが信号駆動を停止してから他方のデバイスが信号駆動を開始するまでの間に、1ターンアラウンドサイクルが経過する必要がある。これがなければ、両方のデバイスが同時に信号を駆動する期間が生じ、バスの動作に支障をきたす可能性がある。
このターンアラウンドサイクルと、制御線を駆動停止する前に1サイクルの間ハイレベルに駆動する必要があるという要件の組み合わせにより、各メイン制御線は所有者が変わる際に最低2サイクルの間ハイレベルに維持されなければなりません。PCIバスプロトコルは、これがほとんど制約にならないように設計されています。ごく一部の特殊なケース(特に高速な連続トランザクション)でのみ、この要件を満たすために追加の遅延を挿入する必要があります。
PCIバス上でバスマスターとして動作可能なデバイスは、他のどのデバイスともトランザクションを開始できます。一度に1つのトランザクションのみが開始されるようにするため、各マスターはまずマザーボード上のアービタからバス許可信号(GNT#)を待機する必要があります。各デバイスにはバスを要求する個別の要求ライン(REQ#)がありますが、現在要求がない場合、アービタはバス許可信号を任意のデバイスに「保留」することができます。
アービタはいつでもGNT#を削除できます。GNT#を失ったデバイスは、現在のトランザクションを完了することはできますが、開始する前のサイクルでGNT#がアサートされていることを確認しない限り、(FRAME#をアサートすることによって)新しいトランザクションを開始することはできません。
アービタは、他のマスターのトランザクション中を含め、いつでもGNT#を提供することができます。トランザクション中は、FRAME#またはIRDY#、あるいはその両方がアサートされます。両方がデアサートされると、バスはアイドル状態になります。デバイスは、GNT#がアサートされ、バスがアイドル状態であればいつでもトランザクションを開始できます。
PCIバスのトランザクションはアドレスフェーズから始まります。イニシエータ(通常はチップセット)は、GNT#信号が出力され、バスがアイドル状態であることを確認すると、ターゲットアドレスをAD[31:0]ラインに、関連するコマンド(メモリ読み出しやI/O書き込みなど)をC/BE[3:0]#ラインに出力し、FRAME#信号をローレベルにプルダウンします。
各デバイスはアドレスとコマンドを検査し、DEVSEL#をアサートすることでターゲットとして応答するかどうかを決定します。デバイスは3サイクル以内にDEVSEL#をアサートして応答する必要があります。1サイクルまたは2サイクル以内に応答することを約束するデバイスは、それぞれ「高速DEVSEL」または「中速DEVSEL」を持つと言われます。(実際には、PCIデバイスはすべての信号を半サイクル早く送信して3サイクル後に受信できるようにする必要があるため、応答時間は2.5サイクルです。)
デバイスは最初のサイクルでアドレスをラッチする必要があります。イニシエータは、DEVSEL#応答を受信する前であっても、次のサイクルでバスからアドレスとコマンドを削除する必要があります。追加の時間は、アドレスとコマンドがキャプチャされた後にそれらを解釈するためにのみ使用できます。
アドレスフェーズの5サイクル目(または他のすべてのデバイスが中速以上のDEVSELを備えている場合はそれ以前)に、一部のアドレス範囲に対して包括的な「減算デコード」が許可されます。これは、ISAバスブリッジがその範囲内のアドレス(メモリの場合は24ビット、I/Oの場合は16ビット)に対して一般的に使用します。
6サイクル目に応答がない場合、イニシエータはFRAME#をデアサートすることでトランザクションを中止することができます。これはマスタ中止終了と呼ばれ、この場合、PCIバスブリッジは通常、すべて1のデータ(0xFFFFFFFF)を返します。そのため、PCIデバイスは一般的に、重要なステータスレジスタにすべて1の値を使用しないように設計されており、このようなエラーをソフトウェアで容易に検出できるようになっています。
![]()
注:
クロック 0 の立ち上がりエッジで、イニシエータは FRAME# と IRDY# の両方がハイ、GNT# がローであることを検出するため、アドレスとコマンドを駆動し、クロック 1 の立ち上がりエッジに間に合うように FRAME# をアサートします。ターゲットはアドレスをラッチし、デコードを開始します。ターゲットは、クロック 2 (高速 DEVSEL)、3 (中速)、または 4 (低速) に間に合うように DEVSEL# で応答する場合があります。減算デコード デバイスは、クロック 4 までに他の応答がない場合は、クロック 5 で応答する場合があります。マスターがクロック 5 までに応答を検出しない場合、トランザクションを終了し、クロック 6 で FRAME# を削除します。
アドレスフェーズ中は、TRDY#とSTOP#は非アクティブ(ハイ)状態になります。イニシエータは、データ転送の準備が整い次第、IRDY#をアクティブにすることができます。理論的には、クロック2でアクティブ化することも可能です。
64ビットアドレス指定を可能にするため、マスタはアドレスを2サイクル連続して送信します。まず、C/BE[3:0]# に特別な「デュアルサイクルアドレス」コマンドを使用して下位アドレスビットを送信します。次のサイクルで、上位アドレスビットと実際のコマンドを送信します。上位アドレスビットがゼロの場合、デュアルサイクルアドレスは禁止されるため、64ビットアドレス指定をサポートしていないデバイスは、デュアルサイクルコマンドに応答できません。
_ 0_ 1_ 2_ 3_ 4_ 5_ 6_ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ___ GNT# \___/XXXXXXXXXXXXXXXXXXXXXXX _______ フレーム# \_______________________ ___ ___ AD[31:0] -------<___X___>--------------- (下位ビット、上位ビット) ___ ___ _______________ C/BE[3:0]# -------<___X___X_______________ (DAC、次に実際のコマンド) ___________________________ 開発番号 \___\___\___\___ 速い 中速 遅い _ _ _ _ _ _ _ _ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ 0 1 2 3 4 5 6
PCIコンフィギュレーション空間へのアクセスに使用されるアドレスは、特別なデコード方式を採用しています。この場合、下位アドレス線は目的のPCIコンフィギュレーションレジスタのオフセットを指定し、上位アドレス線は無視されます。代わりに、デバイスがDEVSEL#をアサートする前に、追加のアドレス信号であるIDSEL入力がハイレベルである必要があります。各スロットは、異なる上位アドレス線をIDSELピンに接続し、上位アドレス線でのワンホットエンコーディングによって選択されます。
アドレスフェーズ(具体的には、DEVSEL#がローになるサイクルから始まる)の後には、1つ以上のデータフェーズのバーストが続きます。いずれの場合も、イニシエータはC/BE[3:0]#ラインにアクティブローのバイト選択信号を駆動しますが、AD[31:0]上のデータは、イニシエータ(書き込みの場合)またはターゲット(読み出しの場合)によって駆動される場合があります。
データフェーズ中、C/BE[3:0]# ラインはアクティブローのバイトイネーブルとして解釈されます。書き込みの場合、アサートされた信号は、ADバス上の4バイトのうち、アドレス指定場所に書き込まれるバイトを示します。読み出しの場合、イニシエータが関心を持つバイトを示します。読み出しの場合、バイトイネーブル信号を無視して32ビットすべてを返すことは常に有効です。キャッシュ可能なメモリリソースは、常に32ビットの有効な値を返す必要があります。バイトイネーブルは、読み出しに副作用があるI/O空間アクセスで主に役立ちます。
PCI規格では、4本のC/BE#ラインすべてが非アクティブ化されたデータフェーズが明示的に許可されており、進行中のバーストアクセスのアドレスを進めること以外に、ターゲットに何ら影響を与えてはならない。
データフェーズは、両者が転送を完了して次のデータフェーズに進む準備が整うまで続きます。イニシエータは待機が不要になった時点でIRDY#(イニシエータ準備完了)信号を発信し、ターゲットはTRDY#(ターゲット準備完了)信号を発信します。データを提供する側は、準備完了信号を発信する前に、ADバス上でデータを送信する必要があります。
参加者のいずれかが準備完了信号を発信すると、データフェーズが終了するまで、準備完了状態を解除したり、制御信号を変更したりすることはできません。データ受信側は、IRDY#とTRDY#の両方が発信されるまで、各サイクルでADバスをラッチする必要があります。IRDY#とTRDY#の両方が発信されると、現在のデータフェーズの終了が示され、ラッチされたデータが転送されるワードであることがわかります。
フルバースト速度を維持するために、データ送信側は、IRDY#とTRDY#の両方がアサートされたことを確認してから半クロックサイクル以内に、次のワードをADバスに送り込む。
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ___ _______ ___ ___ ___ AD[31:0] ---<___XXXXXXXXX__________XXXXX___X___X___ (書き込みの場合) ___ ___ _______ ___ ___ AD[31:0] ---<___>~~~<XXXXXXXX___X_______X___X___ (読み取りの場合) ___ _______________ _______ ___ ___ C/BE[3:0]# ---<___X_______________X_______X___X___ (常に有効である必要があります) _______________ | ___ | | | IRDY# x \_______/ x \___________ ___________________ | | | | TRDY# xx \___________________ ___________ | | | | 開発番号 \___________________________ ___ | | | | フレーム# \___________________________________ _ _ _ _ _ |_ _ |_ |_ |_ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ 0 1 2 3 4 5 6 7 8 9
これは、メディア DEVSEL を使用した単一のアドレス サイクルを想定して、上記のアドレス サイクルを継続します。ターゲットはクロック 3 に間に合うように応答します。ただし、この時点では、どちらの側もデータ転送の準備ができていません。クロック 4 では、イニシエータは準備完了ですが、ターゲットは準備完了ではありません。クロック 5 では、両方とも準備完了となり、データ転送が行われます (垂直線で示されています)。クロック 6 では、ターゲットは転送準備完了ですが、イニシエータは準備完了ではありません。クロック 7 では、イニシエータが準備完了となり、データが転送されます。クロック 8 と 9 では、両側ともデータ転送の準備完了のままであり、データは可能な限り最大の速度 (クロック サイクルあたり 32 ビット) で転送されます。
読み出しの場合、クロック2はADバスの方向転換のために予約されているため、ターゲットが高速DEVSELに対応していても、バス上でデータを駆動することは許可されません。
高速DEVSELをサポートするターゲットは、理論的にはアドレスが提示された次のサイクルで読み取りに応答を開始できます。ただし、このサイクルはADバスのターンアラウンド用に予約されています。そのため、ターゲットはトランザクションの2サイクル目でADバスを駆動することはできません(したがって、TRDY#をアサートすることもできません)。ほとんどのターゲットはこれほど高速ではないため、この条件を強制するための特別なロジックは必要ありません。
どちらの側も、現在のデータフェーズの後にバーストを終了するよう要求できます。マルチワードバーストをサポートしないシンプルなPCIデバイスは、常に即座にこれを要求します。バーストをサポートするデバイスであっても、アドレス指定可能なメモリの終端など、サポートできる最大長に何らかの制限があります。
イニシエータは、IRDY# をアサートすると同時に FRAME# をデアサートすることで、トランザクション内の任意のデータフェーズを最終フェーズとしてマークできます。ターゲットが TRDY# をアサートした後のサイクルで、最終データ転送が完了し、両側がそれぞれの RDY# 信号をデアサートし、バスは再びアイドル状態になります。マスタは、IRDY# をアサートする前に FRAME# をデアサートしてはならず、また、IRDY# をアサートした状態でターゲットが TRDY# をアサートするのを待っている間に FRAME# をデアサートしてはなりません。
唯一の例外は、マスターが異常終了し、どのターゲットからも DEVSEL# が応答されない場合です。このような場合、TRDY# を待つのは明らかに無意味です。ただし、この場合でも、マスターは FRAME# をデアサートした後、少なくとも 1 サイクルの間 IRDY# をアサートする必要があります。(通常、マスターは DEVSEL# を受信する前に IRDY# をアサートするため、IRDY# をアサートした状態を 1 サイクル長く維持する必要があります。)これは、FRAME# ラインでバスのターンアラウンドタイミング規則が遵守されるようにするためです。
ターゲットは、STOP# をアサートすることで、イニシエータにバーストの終了を要求します。イニシエータは、次の有効な機会に FRAME# をデアサートすることでトランザクションを終了します。さらにデータを転送したい場合は、別のトランザクションで続行します。ターゲットがこれを行う方法はいくつかあります。
イニシエータがターゲット側からの切断要求を検知し、FRAME#をデアサートして応答するまでには、常に少なくとも1サイクルかかります。これには2つのサブケースがあり、どちらも同じ時間がかかりますが、1つは追加のデータフェーズが必要です。
イニシエータがバーストを終了し、同時にターゲットが切断を要求する場合、追加のバスサイクルは発生しません。
メモリ空間へのアクセスにおいて、バースト内のワードは複数の順序でアクセスされる可能性があります。不要な下位アドレスビットAD[1:0]は、イニシエータが要求する順序を伝えるために使用されます。特定の順序をサポートしないターゲットは、最初のワードの後にバーストを終了する必要があります。これらの順序の一部は、すべてのPCIデバイスで構成可能なキャッシュラインサイズに依存します。
キャッシュライン内の開始オフセットがゼロの場合、これらのモードはすべて同じ次数に縮小されます。
キャッシュライントグルモードとキャッシュラインラップモードは、クリティカルワード優先のキャッシュラインフェッチの2つの形式です。トグルモードでは、指定されたアドレスとインクリメントされるカウンタをXOR演算します。これは、Intel 486およびPentiumプロセッサのネイティブな順序です。このモードの利点は、実装時にキャッシュラインサイズを知る必要がないことです。
PCI バージョン 2.1 では、トグル モードが廃止され、キャッシュ ライン ラップ モードが追加されました。[ 32 ] : 2このモードでは、フェッチは線形に進行し、各キャッシュ ラインの末尾で折り返されます。1 つのキャッシュ ラインが完全にフェッチされると、フェッチは次のキャッシュ ラインの開始オフセットにジャンプします。
ほとんどのPCIデバイスは、一般的なキャッシュラインサイズの範囲が限られています。キャッシュラインサイズが予期しない値にプログラムされている場合、シングルワードアクセスが強制されます。
PCIはI/Oおよびコンフィギュレーション空間へのバーストアクセスもサポートしていますが、リニアモードのみがサポートされています。(これはほとんど使用されておらず、一部のデバイスではバグが発生する可能性があります。デバイスによってはサポートされていない場合もありますが、シングルワードアクセスを適切に強制することもできません。)
これはマスターによって終了される、可能な限り最速の4ワード書き込みバーストです。
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# ^^^^^^^^\______________/ ^^^^^ ___ | | | ___ フレーム番号 \_______________/ | ^^^^\____ _ _ |_ |_ |_ |_ _ _ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ 0 1 2 3 4 5 6 7
クロック エッジ 1 で、イニシエータはアドレス、コマンドを駆動し、FRAME# をアサートすることでトランザクションを開始します。他の信号はアイドル状態 (^^^ で示されます) で、マザーボードのプルアップ抵抗によってハイにプルアップされています。これがターンアラウンド サイクルである可能性があります。サイクル 2 で、ターゲットは DEVSEL# と TRDY# の両方をアサートします。イニシエータも準備完了であるため、データ転送が行われます。これがさらに 3 サイクル繰り返されますが、最後のサイクル (クロック エッジ 5) の前に、マスターは FRAME# をデアサートし、これが終了であることを示します。クロック エッジ 6 で、AD バスと FRAME# は非駆動状態 (ターンアラウンド サイクル) になり、他の制御線は 1 サイクルの間ハイに駆動されます。クロック エッジ 7 で、別のイニシエータが別のトランザクションを開始できます。これも他の制御線のターンアラウンド サイクルです。
同等の読み取りバーストにはさらに1サイクルかかります。ターゲットは、TRDY#をアサートする前に、ADバスがターンバックするまで1サイクル待つ必要があるためです。
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# ^^^^\___________________/ ^^^^^ ___ | | | ___ フレーム番号 \___________________/ | ^^^^\____ _ _ _ |_ |_ |_ |_ _ _ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ 0 1 2 3 4 5 6 7 8
ターゲットによって停止された高速バーストは、最後に余分なサイクルを持つことになる。
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# ^^^^^^^ \_____________/ ________________ | ___ 停止# ^^^^^^^ | | | \_______/ | | | | ___ DEVSEL# ^^^^^^^\_______________________/ ___ | | | | ___ フレーム番号 \_______________________/ ^^^^ _ _ _ |_ |_ |_ |_ _ _ CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ 0 1 2 3 4 5 6 7 8
クロックエッジ6で、ターゲットは(データとともに)停止したいと示しますが、イニシエータはすでにIRDY#をローに保持しているため、5番目のデータフェーズ(クロックエッジ7)があり、その間はデータは転送されません。
PCIバスはパリティエラーを検出しますが、操作を再試行してエラーを修正しようとはしません。これは純粋に障害を示すものです。そのため、パリティエラーが発生する前に検出する必要はなく、PCIバスは実際には数サイクル後にエラーを検出します。データフェーズ中、AD[31:0]ラインを駆動しているデバイスは、AD[31:0]ラインとC/BE[3:0]#ラインの偶数パリティを計算し、1サイクル後にPARラインに送信します。ADバスのすべてのアクセスルールとターンアラウンドサイクルは、1サイクル後のPARラインに適用されます。ADバスで待機しているデバイスは、受信したパリティをチェックし、その1サイクル後にPERR#(パリティエラー)ラインをアサートします。これにより、通常はプロセッサ割り込みが発生し、プロセッサはPCIバス上でエラーを検出したデバイスを検索できます。
PERR# ラインは、ターゲットが選択された後のデータフェーズでのみ使用されます。アドレスフェーズ(または特殊サイクルのデータフェーズ)でパリティエラーが検出された場合、それを監視しているデバイスは SERR# (システムエラー) ラインをアサートします。
C/BE# ラインによってマスクされ、使用されていないバイトであっても、それらのバイトには何らかの定義済み値が必要であり、その値はパリティを計算するために使用されなければならない。
PCIバス信号を駆動する異なるデバイス間でターンアラウンドサイクルが必要となるため、一般的にはPCIバストランザクション間にアイドルサイクルが必要です。しかし、状況によってはこのアイドルサイクルをスキップし、ある転送の最終サイクル(IRDY#アサート、FRAME#デアサート)から次の転送の最初のサイクル(FRAME#アサート、IRDY#デアサート)に直接移行することが認められています。
イニシエータは、以下の条件を満たす場合にのみ、連続したトランザクションを実行できます。
ターンアラウンドの必要性から生じる追加のタイミング制約は、特にターゲット制御線、DEVSEL# です。ターゲットは、最終データフェーズの次のサイクルで DEVSEL# をデアサートしてハイにします。バックツーバックトランザクションの場合、これはアドレスフェーズの最初のサイクルです。アドレスフェーズの 2 番目のサイクルは DEVSEL# のターンアラウンド用に予約されているため、ターゲットが前のターゲットと異なる場合は、3 番目のサイクル (中速 DEVSEL 速度) まで DEVSEL# をアサートしてはなりません。
この問題が発生しないケースの一つは、イニシエータが何らかの方法で(おそらくアドレスが十分な上位ビットを共有しているため)2回目の転送が1回目の転送と同じターゲット宛てであることを知っている場合です。この場合、イニシエータは連続してトランザクションを実行できます。すべてのPCIターゲットはこれをサポートする必要があります。
ターゲット側が要件を追跡することも可能です。高速 DEVSEL が一度も実行されない場合、要件は容易に満たされます。高速 DEVSEL が実行される場合は、以下の例外を除き、中程度の DEVSEL 時間が経過するまで待機する必要があります。
この機能を持つターゲットは、PCI構成レジスタの特別なビットによってそれを示しており、バス上のすべてのターゲットがこの機能を持っている場合、すべてのイニシエータはバックツーバック転送を自由に使用できます。
減算復号バスブリッジは、連続するサイクルが発生した場合にこの余分な遅延が発生することを認識し、連続サポートを通知する必要があります。
PCI仕様は、リビジョン2.1以降、オプションで64ビットサポートに対応しています。これは、64ビットバス拡張であるAD[63:32]、C/BE[7:4]#、PAR64、および多数の追加電源ピンとグランドピンを備えた拡張コネクタを介して提供されます。64ビットPCIコネクタは、追加の64ビットセグメントによって32ビットコネクタと区別できます。
64 ビット デバイス間のメモリ トランザクションでは、64 ビットすべてを使用してデータ転送速度を 2 倍にすることができます。非メモリ トランザクション (構成や I/O 空間へのアクセスを含む) では、64 ビット拡張を使用することはできません。64 ビット バースト中は、バースト アドレス指定は 32 ビット転送と同様に機能しますが、アドレスはデータ フェーズごとに 2 回インクリメントされます。開始アドレスは 64 ビット境界にアラインされている必要があります。つまり、AD2 は 0 でなければなりません。中間アドレス (AD2 = 1) に対応するデータは、AD バスの上位半分で転送されます。
64ビットトランザクションを開始するには、イニシエータはADバス上の開始アドレスを駆動し、FRAME#と同時にREQ64#をアサートします。選択されたターゲットがこのトランザクションで64ビット転送をサポートできる場合、ターゲットはDEVSEL#と同時にACK64#をアサートして応答します。ターゲットは、トランザクションごとに64ビット転送を許可するかどうかを決定できます。
アドレスフェーズ中にREQ64#がアサートされると、イニシエータはアドレスの上位32ビットとバスコマンドのコピーをバスの上位半分に出力します。アドレスが64ビットを必要とする場合、デュアルアドレスサイクルは依然として必要ですが、バスの上位半分は両方のアドレスフェーズサイクルでアドレスの上位半分と最終コマンドコードを伝送します。これにより、64ビットのターゲットはアドレス全体を認識し、より早く応答を開始できます。
イニシエータがACK64#なしでDEVSEL#がアサートされたことを検出すると、32ビットのデータフェーズを実行します。最初のデータフェーズ中にバスの上位半分で転送されるはずだったデータは、代わりに2番目のデータフェーズで転送されます。通常、イニシエータはDEVSEL#を検出する前に64ビットすべてのデータを駆動します。ACK64#が欠落している場合、データバスの上位半分の駆動を停止する可能性があります。
REQ64#とACK64#のラインは、最後のデータフェーズを除いてトランザクション全体を通してアサートされたままになり、それぞれFRAME#とDEVSEL#と同時にデアサートされます。
PAR64ラインはPARラインと全く同じように動作しますが、AD[63:32]とC/BE[7:4]#に対して偶数パリティを提供します。アドレスフェーズでは、REQ64#がアサートされている場合にのみ有効です。データフェーズでは、REQ64#とACK64#の両方がアサートされている場合にのみ有効です。
PCI は当初、ライトバックキャッシュ コヒーレンスのオプション サポートを含んでいました。これには、キャッシュ可能なメモリ ターゲットによるサポートが必要で、キャッシュからバス上の 2 つのピン、SDONE (スヌープ完了) と SBO# (スヌープ バックオフ) を監視する必要がありました。[ 35 ]
これは実際にはほとんど実装されなかったため、PCI仕様の改訂版2.2から削除され[ 16 ] [ 36 ] 、改訂版2.3ではSMBusアクセス用にピンが再利用された[ 18 ] 。
キャッシュは、DEVSEL# をアサートすることなく、すべてのメモリアクセスを監視します。キャッシュされる可能性のあるアクセスを検出すると、SDONE をローレベル(スヌープ未実行)にします。コヒーレンスをサポートするターゲットは、SDONE がハイレベルになるまでデータフェーズ(TRDY# をアサート)の完了を回避します。
キャッシュ内のデータがクリーンな場合、キャッシュは自身のコピーを無効化するだけでよく、無効化が確立されるとすぐに SDONE をアサートします。しかし、キャッシュにダーティデータが含まれている場合、アクセスを続行する前にキャッシュはそれを書き戻す必要があります。そのため、SDONE を発生させる際に SBO# をアサートします。これにより、アクティブなターゲットは TRDY# ではなく STOP# をアサートするように通知され、イニシエータは切断して後で操作を再試行します。その間、キャッシュはバスの調停を行い、自身のデータをメモリに書き戻します。
キャッシュコヒーレンシをサポートするターゲットでは、バースト信号がキャッシュラインを越える前に終端させる必要もある。

PCIバスの開発やトラブルシューティングを行う際には、ハードウェア信号の解析が非常に重要です。 ロジックアナライザやバスアナライザは、信号を収集、解析、デコードし、ユーザーが有用な形で表示できるようにするツールです。
Synopsys、Lattice Semiconductor、Rambusなどの企業は、PCIバス規格を使用する半導体ASICを設計するためのシリコンIPコアを提供している。
シリーズは真の64ビットアダプタであり、ネットワークパイプラインを拡張してスループットを向上させながら、標準の32ビットPCIスロットとの下位互換性を提供します。
33MHz PCIスロット
との下位互換性あり。
SCSI カード 29160 は 64 ビット PCI カードですが、32 ビット PCI スロットでも動作します。32 ビット PCI スロットにインストールすると、カードは自動的に低速の 32 ビット モードで動作します。
{{citation}}: CS1 maint: 非推奨のアーカイブサービス (リンク)。