はじめに
Cyclone® V SoC FPGA や Arria® V SoC FPGA などの SoC 搭載デバイスで PCI Express の Root Port の設計をする場合、Linkup 後に Root Port 自身及び Endpoint デバイスの Configuration Register を設定する必要があります。その際、どの様な Transaction を発行すれば良いか、ご質問を頂くことがあります。
規格上の話にはなりますが、分かり辛い点もありますので、イメージ図を使ってご説明させて頂きます!
Configuration Register にはどんな Transaction を発行する?
まず、PCI Express では以下の 2つの Type の Configuration Space Register を備えています。
- Type 1 Configuration Space Registers
- Root Port
- Type 0 Configuration Space Registers
- Endpoint
そして、下図の様なシステムを組む場合、Root Port の Type 1 Configuration Register にアクセスする際に使用する TLP (Transaction Layer Packet) は、CfgRd0 (Configuration Read Request Type 0) 及び CfgWr0 (Configuration Write Request Type 0) となります(PCIe の階層を跨がずにアクセスするリクエスト)。
一方、Endpoint 側の Type 0 Configuration Register にアクセスをする際には、CfgRd1 (Configuration Read Request Type 1) 及び CfgWr1 (Configuration Write Request Type 1) になります(PCIe の下位階層に対するリクエスト)。
こちらは規格書で記載されている内容になりますので、詳細は PCIe Base Specification をご覧ください。繰り返しになりますが、この様な構成の場合、Type 1 Configuration Register に対しては Configuration Request Type 0、Type 0 Configuration Register に対しては Configuration Request Type 1 を発行する、というのがポイントです。
よって、PCI Express を使用した Linkup 後の流れとしては、まずは CfgRd0 や CfgWr0 リクエストを発行して Root Port 自身の Register 設定を実施し、それが完了した後、CfgRd1 や CfgWr1 リクエストを発行して、Endpoint 側の Register 設定を実施します。この二つのリクエストが正常に完了すると、通常の Memory Read/Write といったリクエストが発行できるようになります。