AR# 7176

LogiCORE PCI - PCI システムでの BAR (Base Address Register) の設定

説明

キーワード : configure, setup, agent, コンフィギュレーション, セットアップ, エージェント

重要度 : 標準

概要 :
PCI システムで BAR (Base Address Register) を設定する方法を教えてください。

ソリューション

BAR (Base Address Register) は、PCI エージェントがメモリまたは I/O アドレス空間を使用する必要がある場合に使用されます。 コンフィギュレーション空間では 32 ビットのレジスタで、アドレス 0x10 から開始されます。 ザイリンクスの PCI LogiCORE では、インプリメントされる BAR のサイズとタイプの情報は cfg.v または cfg.vhd に記述されています。

`define ENABLE 1'b1
`define SIZE16M 32'hff00_0000
`define NOFETCH 1'b0
`define TYPE00 2'b00
`define MEMORY 1'b0

// BAR0
assign CFG[0] = `ENABLE ;
assign CFG[32:1] = `SIZE16M ;
assign CFG[33] = `NOFETCH ;
assign CFG[35:34] = `TYPE00 ;
assign CFG[36] = `MEMORY ;

BAR の詳細は、PCI ローカル バス仕様 3.0 のセクション 6.2.5 を参照してください。

システムの電源投入時に、ホストにより PCI エージェントで必要なメモリ サイズが判断され、開始アドレスが割り当てられます。 メモリ サイズは、BAR に 0xFFFFFFFF を書き込み、同じ BAR をリードバックすることによって判断されます。 上記の例では、BAR をリードバックすると、0xFF000000 が返されます。 最下位の 4 ビットは、プリフェッチ、タイプ、タイプ インジケータです。 中間の 20 ビットは、次に示す理由から、0 に固定されます。 これにより、最上位の 8 ビットのみが書き込み可能であることがホストに示されます。

ホストは、16MB のメモリ空間を割り当て、BAR に有効なアドレス (0xAA00000000 など) を書き込みます。 これにより、エージェントは 16MB のメモリ空間がアドレス AA00000000 から開始されることを識別します。 PCI 仕様によると、すべてのアドレス空間が自然に調整されるはずなので、16MB のアドレス空間は 16MB で割り切れるアドレスから開始します。 このため、中間の 20 ビットが 0 に固定されます。 ホストはサイズを識別する必要があり、エージェントはアドレスの格納にこれらのビットを使用する必要がありません。

メモリ BAR の場合、最小サイズには [31:4] が書き込み可能となるので、16 バイトとなります。 同様に、最大サイズには、ビット 31 のみが書き込み可能で、2GB となります。 I/O BAR の場合、タイプ インジケータに最下位の 2 ビットのみが必要なので、最小サイズは 4 バイトとなります。 PCI 仕様によると、最大 I/O サイズは 256 バイトです。
AR# 7176
日付 12/15/2012
ステータス アクティブ
種類 一般