Comments
Description
Transcript
ブロック RAM を使用した高速読み出し/書き 込み CAM
アプリケーション ノート: Virtex シリーズ R XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き 込み CAM 著者 : Jean-Louis Brelet 概要 CAM (Content Addressable Memory) を使用すると、データの検索速度が向上します。データの編成 と読み出し/書き込み速度についての必要条件は、アプリケーションによって異なります。このアプリ ケーション ノートで説明する革新的なデザインは、高速な比較と書き込みを必要とする小規模な組み込 み型 CAM に適しています。参照用 のデザインは、Virtex™ FPGA の True Dual-Port™ Block SelectRAM+ 機能を使用して作成されています。アプリケーション ノート XAPP201『Virtex デバイス における各種の CAM デザインの概要』では、CAM をインプリメントするときに利用できる各種のソ リューションについて触れ、このアプリケーション ノートで説明するソリューションを紹介しています。 はじめに このアプリケーション ノートで説明する革新的なデザイン手法を使用すると、Virtex デバイスに組み込 まれている Block SelectRAM+™ メモリを深さが 16 ワード、幅が 8 ビット (16 X 8) の CAM として使 用できます。参照用のデザイン (付録 A 参照) として、16 X 8 の CAM としてコンフィギュレーションし た複数のブロック RAM をカスケードできる、パラメータ化可能な Verilog コードと VHDL コードが提 供されています。1 または 2 クロック サイクルの書き込みと 1 クロック サイクルの比較 (読み出し) の場 合、CAM の速度は Virtex のブロック RAM のアクセス時間と等しくなります。 中規模サイズの CAM は、異なるデザイン手法によって Virtex スライスでインプリメントできます。 Virtex デバイスで CAM をデザインする 3 つの方法、および CAM のサイズと速度の比較については、 XAPP201 を参照してください。 CAM16X8 マクロ CAM16X8 には、次のような特徴があります。 • • • • • • • • • • • • • • • 128 ビット 16 ワード X 8 ビットの構成 比較 (読み出し) と書き込みのデータ入力バスが独立 デコードされたアドレス出力 (16 ビット ワンホット デコードされたアドレス) 完全な同期比較ポート (読み出しポート) 完全な同期書き込みポート 1 クロック サイクルの比較 (1 つまたは複数の比較) 1 クロック サイクルの書き込み (および 1 クロック サイクルの消去) 比較イネーブル入力 書き込みイネーブル入力 書き込みまたは消去モード (書き込みの場合は 1、消去の場合は 0 にアサート) 比較リセット ポート (出力バスを同期して強制的にゼロに設定) カスケード可能 デバイス コンフィギュレーション時に初期化 (デフォルトは空) 1 個の Virtex Block SelectRAM+ メモリにフィット 図 1 に、True Dual-Port Block SelectRAM+ メモリに組み込まれている CAM16X8 マクロを示します。 書き込みポート A は、読み出しポート B から独立しています。どちらのポートも、それぞれのクロッ クに対して完全に同期が取られています。 © 2000 Xilinx, Inc. All rights reserved.Xilinx のすべての商標、登録商標、特許、免責事項は、 http://www.xilinx.co.jp/legal.htm に記載されています。他のすべての商標および登録商標は、それぞれの所有者に属します。 XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 1 ブロック RAM を使用した高速読み出し/書き込み CAM R ライト ポート (A) DATA_WRITE[7:0] ADDR[3:0] ERASE_WRITE WRITE_ENABLE CLK_WRITE リード ポート (B) DATA_MATCH[7:0] MATCH_ENABLE MATCH_RST CLK_MATCH MATCH [15:0] X204_01_091099 図 1: CAM16X8 マクロ Virtex FPGA では、各デバイスのブロック RAM の数に基づいて、異なるサイズの CAM を簡単に実現 できます。表 1 に、カスケード可能な CAM16X8 マクロを使用して Virtex デバイスで実現できる CAM の編成の組み合わせを示します。 表 1: Virtex デバイスにおける最大の CAM の幅と深さ 2 Virtex デバイス Block SelectRAM の数 最大の CAM サイズ 最大の CAM の幅 最大の CAM の深さ XCV50 8 1,024 ビット 16 X 64 ビット 128 X 8 ビット XCV100 10 1,280 ビット 16 X 80 ビット 160 X 8 ビット XCV150 12 1,536 ビット 16 X 96 ビット 192 X 8 ビット XCV200 14 1,792 ビット 16 X 112 ビット 224 X 8 ビット XCV300 16 2,048 ビット 16 X 128 ビット 256 X 8 ビット XCV50E 16 2,048 ビット 16 X 128 ビット 256 X 8 ビット XCV400 20 2,560 ビット 16 X 160 ビット 320 X 8 ビット XCV100E 20 2,560 ビット 16 X 160 ビット 320 X 8 ビット XCV600 24 3,072 ビット 16 X 192 ビット 384 X 8 ビット XCV800 28 3,584 ビット 16 X 224 ビット 448 X 8 ビット XCV200E 28 3,584 ビット 16 X 224 ビット 448 X 8 ビット XCV1000 32 4,096 ビット 16 X 256 ビット 512 X 8 ビット XCV300E 32 4,096 ビット 16 X 256 ビット 512 X 8 ビット XCV400E 40 5,120 ビット 32 X 160 ビット 640 X 8 ビット XCV600E 72 9,216 ビット 32 X 288 ビット 1,152 X 8 ビット XCV1000E 96 12,288 ビット 64 X 192 ビット 1,536 X 8 ビット XCV405E (EM) 140 17,920 ビット 64 X 280 ビット 2.240 X 8 ビット XCV1600E 144 18,432 ビット 64 X 288 ビット 2,304 X 8 ビット XCV2000E 160 20,480 ビット 128 X 160 ビット 2,560 X 8 ビット XCV2600E 184 23,552 ビット 128 X 184 ビット 2,944 X 8 ビット XCV3200E 208 26,624 ビット 128 X 208 ビット 3,328 X 8 ビット XCV812E (EM) 280 35,840 ビット 128 X 280 ビット 4480 X 8 ビット www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R CAM の出力は、16 ビット ワンホット デコードされたアドレスと同じようにデコードされたアドレス なので、ロジックを追加しなくても深さを拡張できます。各ロケーションには、1 個のアドレス ビット 出力があります。特定のアドレスにデータがある場合、対応するアドレス ラインが High になります。 データがない場合、アドレス ラインは Low になります。デコードされたアドレスの出力によって、複 数の比較、つまり、1 クロック サイクルで複数のロケーションにある同じデータを検出することができ ます。書き込みモードは、16 ワード X 8 ビットのメモリ ブロックのいずれかに 8 ビットのデータを書 き込むことと同様です。 図 2 に、4 個の Block SelectRAM+ プリミティブで作成した 64 ワード X 8 ビットの CAM の読み出し モードを示します。64 ビットのデコードされたアドレス バスは、4 個のデコードされた 16 ビット アド レスをマージして生成されます。 8 8 8 8 CAM (16 × 8) CAM (16 × 8) CAM (16 × 8) CAM (16 × 8) MATCH [63:0] DATA_MATCH [7:0] [63:48] 64 [47:32] [31:16] [15:0] CLK_MATCH 48 32 16 X204_02_091099 図 2: 読み出しモードの 64 ワード X 8 ビット CAM 書き込みモードでは、6 ビットのバスが 64 X 8 の CAM のアドレスとして使用されます。このアドレス バスは、各 CAM16X8 のアドレス入力に対する 4 ビット バスと、いずれかの CAM ブロックを選択す るためにデコードされる 2 ビット バスから構成されます。 8 ビットのデータを 64 のロケーション (6 ビット アドレス バス) のいずれかに書き込むには、6 ビット アドレス バスの上位 2 ビットで 4 個の CAM16X8 ブロックのいずれかを選択します。最下位 4 ビット は、各ブロックの通常のアドレス入力 ADDR[3:0] に接続されます。 デザインの幅も、AND ゲートを追加することで拡張できます。各 CAM16X8 には、合計で 8 ビットの ワード幅のみが含まれています。2 個の CAM16X8 を使用すると 16 ビット幅が可能になり、8 ビット は 1 番目の CAM16X8 ブロックに、残りの 8 ビットは 2 番目の CAM16X8 ブロックに格納されます。 データが検出されるのは、両方の 8 ビット ロケーションの内容と指定した 16 ビット データが一致する 場合のみです。それぞれの CAM の出力信号に 2 入力 AND ゲートを接続すると、最終的なデコードさ れたアドレスが得られます。図 3 に、2 個の Block SelectRAM+ プリミティブで作成した読み出しモー ドの 16 ワード X 16 ビット CAM を示します。 基本となる CAM16X8 マクロのアドレスはワンホット デコードされるので、CAM の深さと幅の両方を 同時に拡張して、入出力機能は同じままで必要なサイズの CAM を作成できます。 XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 3 ブロック RAM を使用した高速読み出し/書き込み CAM R [15:8] CAM (16 × 8) [7:0] CAM (16 × 8) MATCH [15:0] DATA_MATCH [15:0] [15] [15] [15] [1] [0] [0] [15:0] CLK_MATCH [1] [1] [15:0] [0] X204_03_091099 図 3: 読み出しモードの 16 ワード X 16 ビット CAM CAM16X8 ブロックをカスケードして最適な速度を達成するには、Virtex 列ごとの Block SelectRAM+ メモリの数を考慮しなければなりません。各 Virtex デバイスには、2 つの Block SelectRAM+ 列があり ます。1 列のブロック数は、Virtex デバイスによって異なります。 表 2 に、 1 つの Virtex 列だけを使用して高速な組み込み型 CAM ブロックを作成した、いくつかの CAM サイズを示します。 表 2: 一部の Virtex デバイスの CAM サイズ Virtex デバイス 列ごとのブロック RAM の数 アプリケーション 列の数 列ごとの CAM サイズ 列ごとの CAM ブロック XCV50 4 2 512 ビット 64 X 8 ビット XCV50E 4 4 512 ビット 64 X 8 ビット XCV300 8 2 1,024 ビット 128 X 8 ビット XCV300 8 2 1,024 ビット 64 X 16 ビット XCV300E 8 4 1,024 ビット 64 X 16 ビット XCV405E 10 14 1,792 ビット 64 X 28 ビット XCV812E 14 20 2,560 ビット 80 X 32 ビット XCV1000 16 2 2,048 ビット 128 X 16 ビット XCV1000 16 2 2,048 ビット 64 X 32 ビット XCV1000E 16 6 2,048 ビット 64 X 32 ビット XCV1600E 18 8 2,304 ビット 72 X 32 ビット XCV2000E 20 8 2,560 ビット 80 X 32 ビット 組み込み型 CAM ブロックは、ネットワーク デザインやデータ処理など、多くのアプリケーションで役 立ちます。小規模な CAM は、瞬間的なプロトコル検出や並列処理の選択、ネットワークとルータの フィルタ処理などを可能にします。 通常、複数プロトコル アプリケーションでは、1 つの入力データ ストリームに異なる扱いが必要になり ます。選択は、そのデータ ヘッダにエンコードされているプロトコル タイプに基づいて行われます。組 み込み型 CAM は、可能な一連のプロトコルを検索することによって正しいプロトコルを 1 クロック サ イクルで検出します。設計者は、これらのすべてのプロトコルを CAM ブロックに格納する必要があり ます。また、このリストは、動的に変更できます。CAM 内にプロトコルが検出されると、対応するア ドレスによって以後の動作が選択されます。 4 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R 並列処理またはデータ認識にも、組み込み型 CAM ブロックを利用できます。一致するデータの検索は 1 クロック サイクルで行われるので、複数のデータが検出された場合でも、CAM ブロックによってこ れらのアプリケーションを高速化できます。 大きいデータ幅を使用するアプリケーションでも、多くの場合、一部のデータ ビット (小さいデータ幅) だけで十分 CAM ブロックを検索できます。データ全体は、ブロック RAM を接続して格納および検索 できます。Virtex デバイスの CAM ブロックは、サイズが拡張可能であり機能が柔軟なので、多くのソ リューションを設計者に提供します。1 クロック サイクルで同時にアクセスしてデータを検索すること によって、高速な結果が保証されます。 全般的な説明 Virtex のブロック RAM によるユニークなアプローチを使用して、CAM16X8 ブロックを作成します。 この手法は、Block SelectRAM+ メモリの True Dual-Port 機能に基づいています。ポート A と B は、 4096 ワード X 1 ビットから 256 ワード X 16 ビットの範囲で独立してコンフィギュレーションできま す。各ポートには、別々のクロック入力および制御信号があります。Block SelectRAM+ メモリの内部 アドレス マッピングは、True Dual-Port ブロック RAM で CAM をデザインするための主要な特徴で す。各ポートは、ポート幅に依存するアドレス指定方法を使用して、同じ 4096 のメモリ ロケーション にアクセスします。特定の幅について物理的な RAM ロケーションをアドレス指定する方法は、アプリ ケーション ノート XAPP130『Virtex Block SelectRAM+ の使い方』で詳しく説明されています。表 3 に、ポート幅が 1 ビットおよび 16 ビットの場合の低位アドレス マッピングを示します。 表 3: Block SelectRAM+ のポート アドレス マッピング ポート アドレス ポート幅 1 4095... 16 255... 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 00 このデザイン手法では、ポート A を 4096 ワード X 1 ビット幅、ポート B を 256 ワード X 16 ビット幅 としてコンフィギュレーションします。このコンフィギュレーションにおける Block SelectRAM+ プリ ミティブを、RAMB4_S1_S16 と呼びます。各ポートには、独立した制御信号が含まれています。ポー ト A は CAM の書き込みポート、ポート B は CAM の読み出しまたは比較ポートです。CAM の読み出 しポートと書き込みポートはどちらも完全な同期処理で、専用のクロックおよび制御信号があります。 ブロック RAM のデコードされた 8 ビット データ 8 ビットのデータでは、28 (256) 種類の値が可能です。従来の RAM の場合、8 ビット データは 8 ビッ トのロケーションに格納されます。しかし、8 ビット データは、256 ビット ワードとしても表現できま す。この場合、n 番目のロケーションだけが 1 で、他はすべて 0 になり、n はデコードされた 8 ビット データによって与えられる位置に対応します。たとえば、データが 0000....0111 (10 進数の 7) である場 合、デコードされた 256 ビット ワードは 0000....000010000000 になり、0 から数えて 7 番目のロケー ションが 1 になります。16 の 256 ビット ワードには、16 のデコードされた 8 ビット ワードを格納でき ます。図 4 に示すように、16 X 256 のアレイは 0 から 15 までの 16 種類のアドレスを表します。 XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 5 ブロック RAM を使用した高速読み出し/書き込み CAM R ADDR[3:0] 0 1 2 3 4 5 6 7 15 0 0 0 0 0 0 0 0 14 13 12 11 10 9 0 0 0 0 0 0 0 0 0 0 0 0 0 254 255 0 0 DATA[7:0] ワンホット デコードされた 8 ビット データ 8 0 7 0 6 0 5 0 4 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x204_04_092299 図 4: CAM16X8 のポート アドレス マッピング データの検索 ポート幅が 16 ビット (ポート B) の 4K ビット RAMB4_S1_S16 は、同時に 16 の値を生成します。図 5 で示されているように、検索される 8 ビット データ (DATA_MATCH) がポート B の 8 ビット アドレ ス (ADDRB) に接続されいる場合、16 ビットのポート B で同時に比較が実行されます。デコードされた 8 ビット データに特定のロケーションが対応するので、比較動作は特定の 8 ビット データを 16 のロ ケーションで同時に検索することと同じです。図 5 に、CAM のリード ポートとしてコンフィギュレー ションした RAMB4_S1_S16 のポート B を示します。 RAMB4_S1_S16 ライト ポート (A) (1 × 4096) リード ポート (B) (16 × 256) DATA_MATCH[7:0] CLK_MATCH ADDRB CLKB DOB MATCH [15:0] X204_05_091699 図 5: SelectRAM+ ブロックの CAM16X8 の読み出しポート CAM16X8 への読み出しの例 CAM16X8 のアドレス 0010 に 0000 0111 というデータが書き込まれている場合、ポート B のアドレス 入力 (ADDRB[7:0]) に 0000 0111 という 8 ビット データを設定してブロック RAM を読み出すと、比較 動作を行ったことになります。図 6 に示すように、ポート B の 16 ビット出力は「0000 0000 0000 0100」 になり、ロケーション 2 で一致が検出されたことを示します。ポート B の出力は、デコードされた CAM のアドレス バスです。一致が検出されない場合、出力は「0000 0000 0000 0000」になります。1 つまた は複数のデータが検出されると、対応する各ロケーションが「1」になります。この場合、複数の同じ 8 ビット データが異なるアドレスに格納されており、CAM16X8 の出力は複数の一致を表しています。 6 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM 0 1 2 3 4 5 6 7 15 0 0 0 0 0 0 0 0 254 255 0 DATA_IN[7:0] = "0000 0111" アドレス ポート 読み出し: 14 13 12 11 10 9 0 0 0 0 0 0 0 0 0 0 0 0 0 R 8 0 7 0 6 0 0 5 0 4 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 MATCH[15:0] = "0000 0000 0000 0100" DATA_IN がアドレス 2 で 検出される DATA_IN = "0000 0111" MATCH[15:0] = "0000 0000 0000 0100" (一致が検出される) x204_06_092299 図 6: CAM16X8 ブロックへの読み出しの例 CAM16X8 への書き込み CAM の書き込みポートへの入力には、8 ビット データ バス、16 のロケーションをアドレスする 4 ビッ ト アドレス バス、制御信号、およびクロックがあります。4 ビットのアドレス バスは、メモリのロケー ションを選択します。このロケーションに新しいデータを書き込むことは、8 ビット データを 256 ビッ トの ワン ホッ ト ワ ード にデ コー ドし て 256 ビ ット ワ ード を格 納す るこ とと 同じ です。し かし、 CAM16X8 マクロを 0 に初期化する場合、256 ビット ワード中の 1 ビットだけを 1 に切り替えなければ なりません。1 にするロケーションは、ワンホット デコードされた 8 ビット値によって決定されます。 Block SelectRAM+ プリミティブのアドレス ポートがアドレス バスをデコードすることを考慮すると、 上記の 2 つの動作を組み合わせてブロック RAM への単純な書き込みにすることができます。 4096 X 1 としてコンフィギュレーションしたポート A には、1 ビットのデータ入力と 12 ビットのアド レス入力があります。データ入力は 1 にアサートされ、8 ビットのデータおよび 4 ビットのアドレスは 1 個の 12 ビット アドレス入力になります。 8 ビット データを MSB 側、4 ビット アドレスを LSB 側に取った 12 ビット アドレス入力は、同時に 8 ビット データをデコードして 16 のメモリ ロケーションの 1 つを選択します。クロック エッジで、対応 するロケーションに「1」が格納されます。図 7 に、Block SelectRAM+ プリミティブによる CAM16X8 の書き込みポートを示します。 RAMB4_S1_S16 DATA_WRITE[7:0] ADDR[3:0] WRITE_ERASE 8 4 ライト ポート (A) (1 × 4096) DIA 12 ADDRA DOA N.C. CLK_WRITE リード ポート (B) (16 × 256) X204_07_091699 図 7: SelectRAM+ ブロックによる CAM16X8 の書き込みポート XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 7 ブロック RAM を使用した高速読み出し/書き込み CAM R データの消去 以前に格納したデータを消去するには、選択したロケーションを「0」に初期化しなければなりません (256 ビット ワード)。基本的な選択肢は、アドレス入力の上位 8 ビットを 0 から 255 までインクリメン トして 256 クロック サイクルで「0」を書き込むことです。アドレス入力の下位 4 ビットは固定されて おり、CAM ロケーションの選択に使用されます。 参照用のデザインで提供されるソリューションで必要なのは、1 クロック サイクルだけです。消去動作 は、 「1」の代わりに「0」を格納すること以外は、書き込み動作と同様です。この場合も、ポート A の アドレス入力は、消去する 8 ビット データと 4 ビットのアドレス バスの組み合わせです。正しく選択 するには、8 ビット データを独立した RAM ブロックに格納しなければなりません。参照用のデザイン には、8 個の SelectRAM+ ブロック (8 個の LUT で 16 X 1 RAM) を使用して 16 ワードを格納する手法 が示されています。 CAM のデータを削除する消去モードのオン/オフは、任意に選択できます。消去モードをオンにした場 合は、速度と Virtex のスライス使用率が引き換えになります。 CAM16X8 のパフォーマンス 1 クロック サイクル中には、16 ビットのデコードされたアドレスが生成されます。CAM16X8 ブロック の比較動作は、SelectRAM+ ブロックへの読み出し動作を行うだけで、パフォーマンスは読み出し動作 と同じです。書き込み動作では、SelectRAM+ の標準的な書き込みモードを使用します。SelectRAM+ のタイミング特性の詳細については、Virtex シリーズのデータシートを参照してください。図 8 に、 RAMB4_S1_S16 プリミティブで作成した CAM16X8 マクロの基本的なインプリメンテーションを示し ます。 CAM (16 × 8) RAMB4_S1_S16 DATA_WRITE[7:0] ADDR[3:0] ポート A (1× 4096) 8 4 12 ADDRA[11:0] ERASE_WRITE DINA[0] WEA ENA WRITE_ENABLE "0" CLK_WRITE RSTA CLKA DOA[0] N.C. ポート B (16 × 256) "0000 ... 0000" DATA_MATCH[7:0] "0" MATCH_ENABLE MATCH_RST CLK_MATCH DINB[15:0] ADDRB[7:0] WEB ENB RSTB CLKB DOB[15:0] MATCH [15:0] X204_08_091699 図 8: RAMB4_S1_S16 プリミティブで作成した CAM16X8 マクロ デザインの概要 このアプリケーション ノートで説明する参照用のデザインは、ワード幅を調節できます。基本となる CAM16X8 マクロの出力は、1 クロック サイクルで生成されるデコードされたアドレスです。出力ライ ンの数は、CAM のワード数です。これは 16 の倍数で、各 CAM16X8 マクロのワード数を表します。 この参照用のデザインは、エンコードされた出力アドレスを生成するモジュールの例を示しています。 VHDL コードの構造は階層的なので、設計者の要求に応じてさまざまなサイズの CAM にこのモジュー ルを容易に使用でき、LUT と TBUF のインプリメンテーションを選択できます。デコードされたアド レスをすべてワイド OR ゲートに接続すると、一致が検出されたときに 1 にアサートされる一致フラグ を生成できます。 8 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R 書き込み動作 この参照用のデザインは、消去と書き込みがそれぞれ 1 クロック サイクルで行われるソリューションを インプリメントします。CAM に格納されるデータは、RAM16X1 プリミティブにも格納され、CAM を 消去するためにリードバックされます。図 9 に、書き込みと消去のコンフィギュレーションを示します。 書き込み/消去 DATA_IN[7:0] 書き込み /消去 "1" 8 "0" RAM_ERASE 8 × RAM16x1s ADDR[3:0] 8 8 ADDR[3:0] CLK RAMB4_S1_S16 12 4 DIA[0] ライト ポート A (1 × 4096) ADDRA[11:0] CLK 4 リード ポート B (16 × 256) x204_09_091699 図 9: CAM16X8 の 1 クロック サイクルの消去と書き込み 読み出し動作 読み出しおよび比較動作は、ポート B で行われます。デコードされたアドレスは、LUT のフル ロジッ ク インプリメンテーションまたはトライステート バッファの TBUF インプリメンテーションのいずれ かでエンコードされます。 参照用のデザインの CAM16X8 マクロの出力では、一致信号を生成する方法と CAM のアドレス出力を エンコードする方法が示されています。図 10 に、一致フラグを生成するワイド OR ゲートを接続した CAM16X8 を示します。MATCH_SIGNAL は、1 つ以上のデータが検出されるとアサートされます。 16 ビットのデコードされたアドレス バス (MATCH) は、4 ビットのアドレス バス (MATCH_ADDR) にエンコードされます。これは、1 個の一致が検出された場合のみ有効なアドレスを表します。参照用 のデザインには、1 個の一致が検出された場合に「1」にアサートされる追加信号を生成する方法が示さ れています。 RAMB4_S1_S16 ライト ポート A (1 × 4096) リード ポート B (16 × 256) DOB[15:0] 8 DATA_IN[7:0] 16 16 ADDRB[7:0] D Q MATCH_SIGNAL CLK CLK 16 一致した場合は 2 進アドレス (MATCH[15:0]) ENCODE 4 MATCH_ADDR [3:0] x204_10_091699 図 10: 一致フラグとエンコードされた出力がある CAM16X8 XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 9 ブロック RAM を使用した高速読み出し/書き込み CAM R Virtex Block SelectRAM + プリミティブに よる CAM16X8 の デザイン このアプリケーション ノートと参照用のデザイン ファイル XAPP204.zip を使用すると、読み出しと書 き込みが高速な CAM モジュールをインプリメントできます。VHDL コードまたは Verilog コードに よって、この例を特定のアプリケーションに適用できる可能性が広がります。 特徴 • 高速な 1 クロック サイクルの比較 (読み出し) • 高速な 1 クロック サイクルの書き込みと消去 • CAM16X8 マクロの数を定義するジェネリックな nb_cam16X8s。CAM の深さは、16 の倍数で す。デザインに必要な Virtex デバイスの数は、Block SelectRAM+ メモリの数によって決まりま す (表 1 参照)。 • nb_cam16X8s に直接接続されているアドレス ラインの数を定義するジェネリックな addr_width。たとえば、32 ワードの CAM では 5 本のアドレス ラインが、64 ワードの CAM で は 6 本のアドレス ラインが必要になります。 基本的な構成要素 : CAM 基本的な構成要素である CAM16X8 は、全般的な説明で示したように Block SelectRAM+ プリミティ ブに基づいています。このデザインでは、書き込みポートと読み出しポート (DATA_IN[7:0]) の両方 で 1 個の 8 ビット データ バスだけが使用されており、どちらのポートも同じクロックを共有します。 Block SelectRAM+ プリミティブをインスタンシエートする VHDL コードまたは Verilog コードは Init_RAMB4_S1_S16 という名前で、初期化の例を提供します。デフォルトでは CAM は空で、0 に初 期化されます。 この 1 番目のモジュールに接続される 2 番目の基本的な構成要素は、Init_8_RAM16X1s です。このモ ジュールは標準的な RAM に 16 ワードを格納する 8 個の RAM16X1 プリミティブをインスタンシエー トし、参照用のデザインでは CAM16X8 のロケーションを 1 クロック サイクルで消去するために使用 されています。 Init_RAMB4_S1_S16 モジュールの場合と同じように、VHDL コードまたは Verilog コー ドは初期化を提供します (デフォルトですべて 0)。正しく動作させるには、両方のモジュールを同じデー タで初期化する必要があります。 CAM_RAMB4 モジュールは、上記の 2 個のモジュールをインスタンシエートして完全な構成要素を作 成します。CAM_RAMB4 は、1 クロック サイクルでデータを検索でき、2 クロック サイクルで消去と 書き込みを行うことができます。この VHDL モジュールまたは Verilog モジュールは、どの HDL デザ インでも構成要素として使用できます。 図 11 に、1 個の SelectRAM+ ブロックと 8 個の RAM16X1s から作成した CAM_RAMB4 モジュール を示します。このインプリメンテーションでは、書き込む DATA_IN と消去する DATA_WRITE の間 にマルチプレクサがあります(図 9 を参照してください)。初めのクロック サイクルは消去モードなので、 古いデータが Init_8_RAM16X1s の出力 DATA_WRITE から読み込まれます。これは、入力 ADDRA の上位 8 ビットのアドレスになります。新しいデータ (DATA_IN) は、Init_8_RAM16X1s に書き込ま れ、出力 DATA_WRITE に反映されます。2 番目のクロック サイクルは書き込みサイクルで、新しい データは上位 8 ビットのアドレスとして自動的に使用されます。図 12 を参照してください。入力 ADDR[3:0] は 2 クロック サイクルの間は変更されず、最下位 4 ビットのアドレスとして使用されます。 10 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R CAM_RAMB4 INIT_8_RAM16x1s WRITE_RAM WRITE_RAM ADDR ADDR[3:0] DATA_IN[7:0] DATA_IN CLK DATA_WRITE INIT_RAMB4_S1_S16 8 12 4 ADDRA ADDR_WRITE DIA ERASE_WRITE WRITE_ENABLE WEA ENA 8 MATCH_ENABLE ADDRB ENB RSTB MATCH_RST CLK DOB MATCH [15:0] CLK X204_11_092299 図 11: 1 個の Block SelectRAM+ メモリと 8 個の RAM16X1s による 16 ワード X 8 ビットの CAM (RAM16x1s に書き込む 新しいデータ) 新 DATA_IN[7:0] (RAMB4 に書き込み) ADDR[3:0] WRITE_ENABLE ERASE_WRITE WRITE_RAM (RAM16x1s に書き込み) CLK 内部バス ADDR_WRITE 消去 書き込み DATA_WRITE 旧 新 x204_12_092199 図 12: 消去と書き込みの波形 モジュール :CAM_generic_8s 必要なサイズの CAM を作成するには、複数の CAM_RAMB4 を図 13の CAM_generic_8s モジュール でインスタンシエートします。CAM の深さは nb_cam16X8s というジェネリックな値で、使用する CAM16X8s の数を定義します。CAM の深さは、16 の倍数です。1 個の CAM_RAMB4 につき、4 ビッ トの エンコードされたアドレス出力が 1 つずつ必要になります。ジェネリック値 addr_width は、CAM の幅に対応します。32 ワードの CAM では 5 本のアドレス ラインが、64 ワードの CAM では 6 本のア ドレス ラインが必要に なります。MATCH バス (CAM_RAMB4 の 出力) は、一致アドレス出力 MATCH_ADDR と MATCH_OK 信号 (一致が検出された場合に High) の両方を生成するためにエン XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 11 ブロック RAM を使用した高速読み出し/書き込み CAM R コードされます。このモジュールは、XAPP203 の参照用のデザイン (CAM_generic_word モジュール) に似ています。XAPP203 の参照用のデザインでは、基本となる構成要素が SelectRAM+ ブロックでは なく Virtex スライスに基づいています。どちらの場合も基本モジュールの CAM の深さは 16 ワードで、 エンコーダ モジュールと最上位デザインを共有しています。 CAM_generic_8s (読み出しモード) CAM_RAMB4 (ジェネリック: nb_cam_16x8s) ENCODE_4_LSB DATA_IN [7:0] 4 MATCH_OK ADDR BINARY_ADDR MATCH_ADDR R_MATCH_ADDR (ジェネリック: addr_width) D Q R_MATCH_OK 4 BINARY_ADDR MATCH_OK BINARY_ADDR MATCH_OK ADDR INST_2 MATCH 16 FF D Q ADDR_LSB_1 INST_1 MATCH 16 ENCODE_X_MSB ADDR_LSB_0 BINARY_ADDR _X _2 CAM_RAMB4_1 CAM_RAMB4_0 16 ADDR INST_0 MATCH 4 ADDR_LSB_2 BINARY_ADDR CLK MATCH_OK BINARY_ADDR MATCH_ENABLE x (nb_cam_16x8s) MATCH_RST x204_13_091699 図 13: CAM_generic_8s の読み出しパス モジュール :CAM_top このモジュールは、ジェネリックな CAM の最上位ラッパーです (図 14)。すべての入力および出力信号 を登録します。 CAM_Top CAM_generic_8s (ジェネリック: nb_cam_16x8s) FF I_DATA_IN [7:0] DATA_IN CLK FF I_ADDR (ジェネリック: addr_width) FF MATCH_ADDR ADDR CLK FF FF I_WRITE_ENABLE MATCH_OK WRITE_ENABLE CLK 0_MATCH_OK CLK FF I_MATCH_ENABLE FF ADDR_VALID MATCH_ENABLE CLK CLK I_MATCH_RST MATCH_RST I_CLK (オプション) DLL BUFGDLL GLOBAL_RST 0_MATCH_ADDR (ジェネリック: addr_width) CLK 0_ADDR_VALID (オプション) CLK グローバル非同期リセット x204_14_092299 図 14: CAM デザインの最上位レベル ブロック図 12 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R ピン配置 :(I_XXX 信号はすべて入力、O_XXX はすべて出力) • I_DATA_IN は、読み出し動作と書き込み動作の両方で使用する 8 ビットのデータ入力バスです。 • I_ADDR は、選択したロケーションに新しいデータを書き込むためにのみ使用するジェネリック な入力アドレス バスです。 • • • • • • I_WRITE_ENABLE は、2 クロック サイクルのアクティブ High 信号です (消去してから書き込み)。 I_MATCH_ENABLE は、読み出しアクセスをイネーブルにします (アクティブ High)。 I_CLK は、クロックです。オプションとして、DLL を通して配線できます。 O_MATCH_ADDR は、読み出しモードのみで有効なジェネリックな出力アドレスです。 O_MATCH_OK は、データが検出されると High になります (読み出し動作)。 O_ADDR_VALID は、複数のデータが検索された場合のオプションの信号です。1 つのデータが 検出された場合は、アクティブ High です。 この参照用のデザインを合成するときは、その後のフロアプランのために階層を維持し、スタティック タイミング解析を行うとよいでしょう。クロック周期は、制約ファイル (UCF) で定義します。パフォー マンスを最適化するには、各 Block SelectRAM+メモリのロケーションを 1 列に、8 個の RAM16X1s プ リミティブを隣接するスライス列に配置するよう、UCF ファイルで制約します。 この参照用のデザインは、幅が異なる CAM にも容易に適合できます。たとえば、4 つの CAM16X8 マ クロから 16 ワード X 32 ビット の CAM を作成できます。この CAM に 16 個の 4 入力 AND ゲートを 追加すると、16 LUT に収まるような全体的にデコードされたアドレスが生成されます。 おわりに Virtex Block SelectRAM+ のユニークな True Dual-Port 機能によって、高速な組み込み型 CAM をイ ンプリメントする革新的な手法が可能になります。複数のマクロをカスケードして深さや幅がより大き い CAM ブロックを作成した場合でも、CAM16X8 マクロは 1 クロック サイクルの ワンホット デコー ドされたアドレスを提供します。基本となる CAM16X8 マクロはサイズが小さいので (16 ワード X 8 ビット)、CAM のサイズを柔軟に選択できます。 参照用のデザインは、エンコードされたアドレス出力、一致フラグ、高速な読み出しアクセス、高速な 2 クロック サイクルの消去/書き込みアクセスが含まれる完全なソリューションを示しています。CAM の深さを拡張できるので、真の柔軟性が得られます。 CAM は、メモリ データの検索を高速にします。CAM ベースのアプリケーションにはさまざまな必要 条件があるので、ソリューションは柔軟でなければなりません。Block SelectRAM+ によるソリューショ ンの他にも、Virtex ファミリのスライスに基づくアプローチとして XAPP202『ATM アプリケーション CAM (Content Adderssable Memory)』と XAPP203『Virtex ファミリ FPGA による柔軟で高速な CAM のデザイン』があります。 XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 13 ブロック RAM を使用した高速読み出し/書き込み CAM R 付録 A : 合成可能な VHDL コードと Verilog コードの参照用のデザイン 付録 A では、ワード幅が 8 ビットでメモリの深さがパラメータ化された CAM を Virtex デバイスでイ ンプリメントする階層的で合成可能なデザインを示します。完全な VHDL コードと Verilog コードは、 参照用のデザインとして用意されています (ファイル : xapp204.zip または xapp204.tar.z)。 モジュール :CAM_top.vhd --- Module: CAM_Top / Top Level -- Design: CAM_Top -- VHDL code: -- Hierarchical wrapper Instantiate CAM_generic_8s (depth variable by 16X8bits word) --- Synthesis Synopsys FPGA Express ver.3.2 - Option = Preserve Hierarchy -- Use of "pragma synthesis_off/on" and attributes --- Description:Instantiate a CAM implementation -- Registered inputs and outputs (CAM internal timing analysis) --- Device: VIRTEX Families --- Created by:Jean-Louis BRELET / XILINX - VIRTEX Applications -- Date:July 29, 1999 -- Version: 1.0 --- History: -- 1. --- Disclaimer:THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY -- WHATSOEVER AND XILINX SPECIFICALLY DISCLAIMS ANY -- IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR -- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. --- Copyright (c) 1999 Xilinx, Inc. All rights reserved. --------------------------------------------------------------- モジュール :CAM_generic_word.vhd --- Module: CAM_generic_8s -- Design: CAM_Top -- VHDL code: Hierarchical RTL 14 -- Instantiate CAM_RAMB4 -- Instantiate INIT_RAMB4_S1_S16 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R -- Instantiate INIT_8_RAM16X1s -- Instantiate ENCODE_4_LSB -- Instantiate DECODE_X -- Instantiate ENCODE_X_MSB -- Choice the right ENCODE and DECODE modules according to the number of CAM16X8s -- If "nb_cam16X8s" = 2 then ENCODE_1_MSB and DECODE_1 must be used:1 bit to decode 2 CAM16X8s -- If "nb_cam16X8s" = 4 then ENCODE_2_MSB and DECODE_2 must be used:2 bits to decode 4 CAM16X8s -- If "nb_cam16X8s" = 8 then ENCODE_3_MSB and DECODE_3 must be used:3 bits to decode 8 CAM16X8s -- If "nb_cam16X8s" = 16 then ENCODE_4_MSB and DECODE_4 must be used:4 bits to decode 16 CAM16X8s -- Note:Configuration is not supported by synthesis tools --- Synthesis Synopsys FPGA Express ver.3.2 - Option = Preserve Hierarchy -- Use of "pragma synthesis_off/on" and attributes --- Description:Instantiate "nb_cam16X8s" CAM_RAMB4 (see generic) -- "nb_cam16X8s" X 16 words depth X 8 bits width -- 1 clock cycle Read (or Match), -- 2 clock cycles Write (Erase on the first clock then Store on the second) -- If only 1 clock cycle => Erase Only. -- MATCH_OK indicates one or more matches is/are found. -- MATCH_ADDR ouput the address of the match, if ONLY ONE is found -- ADDR_VALID indicates when MATCH_ADDR is a valid address (Optional) --- Device:VIRTEX Families -- modules CAM_RAMB4 fits in 1 BlockRAM column (+ CLB) -- If "nb_cam16X8s" = 4 then CAM64X8s (fits in 1 XCV50 BlockRam Column) -- If "nb_cam16X8s" = 8 then CAM128X8s (fits in 1 XCV300 BlockRam Column) -- If "nb_cam16X8s" = 16 then CAM256X8s (fits in 1 XCV1000 BlockRam Column) ... --------------------------------------------------------------- モジュール :CAM_RAMB4.vhd --- Module: CAM_RAMB4 -- Design: CAM_Top -- VHDL code: Hierarchical RTL -- Instantiate INIT_RAMB4_S1_S16 XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 15 ブロック RAM を使用した高速読み出し/書き込み CAM R -- Instantiate INIT_8_RAM16X1s --- Synthesis Synopsys FPGA Express ver. 3.2 -- Use of "pragma synthesis_off/on" and attributes --- Description:Basic building block of a CAM using Select BlockRAM -- 16 words depth X 8 bits width -- 1 clock Read (or Match), 2 clock Write (Erase on the first clock then Store on the second) -- If NO match is found the output MATCH<15:0> = "0000000000000000" -- MATCH bus gives on 16 signals a binary address. -- Initialized RAM16X1s and RAMB4 in low level module --- Device: VIRTEX Families ... --------------------------------------------------------------- モジュール :INIT_RAMB4_S1_S16.vhd --- Module: INIT_RAMB4_S1_S16 -- Design: CAM_Top -- VHDL code: VIRTEX primitives instantiation --- Synthesis Synopsys FPGA Express ver. 3.2 -- Use of "pragma synthesis_off/on" and attributes --- Description: Basic building block of a CAM using Select BlockRAM -- 16 words depth X 8 bits width -- Instantiation RAMB4_S1_S16 -- Initialization of RAMB4:attributes to constraint PAR and simulation --- Device: VIRTEX Families -- 1 RAMB4 ... --------------------------------------------------------------- モジュール :INIT_8_RAM16X1s.vhd --- Module: INIT_8_RAM16X1s -- Design: CAM_Top -- VHDL code: VIRTEX primitives instantiation 16 www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日 ブロック RAM を使用した高速読み出し/書き込み CAM R --- Synthesis Synopsys FPGA Express ver. 3.2 -- Use of "pragma synthesis_off/on" and attributes --- Description:Basic building block of a CAM using Select BlockRAM & SelectRAM -- Instantiate 8 RAM16X1s_1 for ERASE operation -- Initialization of RAM16X1s:attributes to constraint PAR and simulation --- Device: VIRTEX Families -- 8 X SelectRAM16X1s_1 ... --------------------------------------------------------------- モジュール :ENCODE_4_LSB.vhd --------------- Module: ENCODE_4_LSB Design: CAM_Top VHDL code: RTL / Combinatorial Synthesis Synopsys FPGA Express ver. 3.2 Use of "pragma synthesis_off/on" and attributes Description:Encode a 16 bits binary address into 4 bits and find if a match occurs if BINARY_ADDR = "0000000000100000" => MATCH_ADDR = "0101"/ MATCH_OK = 1 Optional ADDR_VALID = 1 when only one Match (If simultaneous matches can occur) However, the ADDR_VALID generation double the size of the combinatorial logic ! if no match found => MATCH_OK = 0 / ADDR_VALID = 0 (MATCH_ADDR is not a valid address) if 2 or more matches found => MATCH_OK = 1 / ADDR_VALID = 0 (MATCH_ADDR is not valid address) --- Device: Virtex Families -- ... --------------------------------------------------------------- モジュール :ENCODE_4_MSB.vhd このモジュールは、1 ビットの ENCODE_1_MSB (CAM 32 ワード)、2 ビットの ENCODE_2_MSB (CAM 64 ワード)、3 ビットの ENCODE_3_MSB (CAM 128 ワード)、4 ビットの ENCODE_4_MSB (CAM 256 ワード) で使用できます。このモデルに従えば、深さが異なる CAM についてのモジュール も容易に作成できます。 --- Module: ENCODE_4_MSB -- Design: CAM_Top -- VHDL code: RTL / Combinatorial --- Synthesis Synopsys FPGA Express ver. 3.2 -Use of "pragma synthesis_off/on" and attributes -- XAPP204 (v1.2) 2000 年 5 月 2 日 www.xilinx.co.jp 17 ブロック RAM を使用した高速読み出し/書き込み CAM R -- Description:Encode a 16 bits binary address into 4 bits, map with the LSB address and find if a match occurs -if BINARY_ADDR = "0000000000100000" => MATCH_ADDR = "0101"/ MATCH_OK = 1 -Optional ADDR_VALID = 1 when only one Match (If simultaneous matches can occur) -However, the ADDR_VALID generation double the size of the combinatorial logic ! -if no match found => MATCH_OK = 0 / ADDR_VALID = 0 (MATCH_ADDR is not a valid address) -if 2 or more matches found => MATCH_OK = 1 / ADDR_VALID = 0 (MATCH_ADDR is not valid address) --Choice between GATES ONLY implementation or BUFT implementation.(See comments) -Note:synthesis tools do not support Configuration --- Device: Virtex Families -- ... --------------------------------------------------------------- モジュール :DECODE_4.vhd このモジュールは、1 ビットの DECODE_1 (CAM 32 ワード)、2 ビットの DECODE_2 (CAM 64 ワー ド)、3 ビットの DECODE_3 (CAM 128 ワード)、4 ビットの DECODE_4 (CAM 256 ワード) で使用で きます。このモデルに従えば、深さが異なる CAM についてのモジュールも容易に作成できます。 --- Module: DECODE_4 -- Design: CAM_Top -- VHDL code: RTL / Combinatorial --- Synthesis Synopsys FPGA Express ver. 3.2 -Use of "pragma synthesis_off/on" and attributes --- Description:Decode 4 bits address into 16 binary bits -Generate an ENABLE bus --- Device: Virtex Families -- ... --------------------------------------------------------------同様のモジュール ENCODE_3_MSB、ENCODE_2_MSB、ENCODE_1_MSB、DECODE_4、 DECODE_3、DECODE_2、DECODE_1 が参照用のデザイン ファイルに含まれています。 付録 A の終わり 改訂履歴 次の表に、このドキュメントの改訂履歴を示します。 日付 18 バージョン 改訂内容 9/23/99 1.0 初期リリース 10/1/99 1.1 いくつかのテキストの修正 5/2/00 1.2 Virtex-E 拡張メモリ用にアップデート www.xilinx.co.jp XAPP204 (v1.2) 2000 年 5 月 2 日