第 4 章 汎用 CAM による SpMT 機構シミュレータの高速化 30
4.3 FPGA と CAM 間のインタフェース
市販のCAMは厳密なタイミング制御が必要であり,一般的なプロセッサ上で 動作するソフトウェアシミュレータから利用するためには,FPGAを仲介した タイミング保証機構が必要である.すなわち,ソフトウェアシミュレータから 観測できるのは,CAMそのものではなく,FPGA上に実現されるインタフェー スとなる.
GP600M上のFPGAには,CAMにアクセスするための制御レジスタが用意
されている.CAM0制御レジスタを図19に示す.CAM0制御レジスタの詳細 は以下の通りである.CAM1についても,幅が144bitである以外は同様である.
E0CL STE0(STart Externalcam0)ビットに1を書き込むと,CAM0がE0SI および E0SDにより指定した動作を開始する.
BSY0 INS0
TCE0 STE0
FF0 MF0 E0CL
E0ST E0SI
E0SD
E0RD
E0RM
0 0 1
31 1
31 31 31
31
31
0 0
0
0 1 2
2 3 4 19
20
23 24
MM0 0 MA0
0
0
0
0
E0ID0 E0ID8 E0OD0 E0ODH
544 575
256 287
図19: CAM0制御レジスタ
E0ST TCE0(Termination Code of Externalcam0)ビットが1の場合,STE0 ビットへの1書き込み時に指定したE0SIが未定義命令であったことを示す.BSY0
(cam0 BuSY)ビットが1の場合,CAM0が動作中であることを示す.
E0SI INS0(INStruction for externalcam0)にCAM0の動作を指定する.主 な命令の詳細については後述する.
E0SD E0ID0-8(Externalcam0 Input Data 0-8)にCAM0に書き込むデータ を指定する.
E0RD E0OD0-H(Externalcam0 Output Data 0-H)にCAM0から読み出し た値が表示される.
E0RM 後述するSSGLおよびSFRE命令の実行結果が表示される.MA0(Match Address of externalcam0)にCAM0が出力する一致アド レ スが表示され る.
MM0(Multi Match flag of external cam0)ビットが0の場合は複数一致を検出 したことを示す.MF0(Match Flag of external cam0)ビットが0の場合は一 致を検出したことを示す.FF0(Full Flag of external cam0)ビットが0の場合 はFullを検出したことを示す.
制御レジスタへは,mmapシステムコールによりメモリにマッピングされた アドレ スに直接アクセスする.すなわち,
ureg = (unsigned char*) mmap((caddr_t)0, 0x200,
PROT_READ|PROT_WRITE, MAP_SHARED, fd, (off_t)0));
としてuregにマッピングすることにより,例えばアドレ ス0x148の制御レジス タE0CLに対してureg[0x148] = 1;のようにアクセスできる.
GP600M上のCAMはFPGAから命令を送信することにより動作する.GP600M
におけるCAMマクロ命令には,主に以下の命令がある.
RESET(RESET) DC18288に定義されているpowerup sequenceおよび gen-eralresetを実行し,CAMのConfigurationを行う.
CLEAR(CLEAR) CAMの全てのエントリにおいて Emptyビットを1に セットすることにより,全てのエントリを削除する.
WGMR(Write Global Mask Register) E0SDに格納されたマスクデー タをグローバルマスクレジスタ(GMR)に書き込む.
RGMR(Write Global Mask Register) 指定したGMRからマスクデー タをE0RDに転送し,E0RDからデータを読み込む.
WADR(Write ADdress Register) E0SDに格納されたアドレス値をアド レ スレジスタ(ADR)に書き込む.
RADR(Read ADdress Register) ADRからアド レ ス値をE0RDに転送 し,R0RDから値を読み込む.
WMEM(Write MEMory) WADRにより指定したアドレスのエントリに,
E0SDに格納されたデータを書き込む.
RMEM(Read MEMory) WADRにより指定したアドレスのエントリから データをE0RDに転送し,E0RDからデータを読み込む.
WSTB(Write STatus Bits) WADRにより指定したアド レ スのエント リ におけるステータスビットを変更する.
RSTB(Read STatus Bits) WADRにより指定したアドレ スのエントリか らステータスビットをE0RDに転送し,E0RDから値を読み込む.
SSGL(Search SinGLe) WGMRにより指定したマスクデータと E0SDに 格納されたデータを用いてメモリ内を検索する.結果はE0RMに格納され,ヒッ トしたアドレ スを返す.どのエントリにもヒットしない場合,−1を返す.
SDEL(Search and DELete) SSGLと同様に検索を行い,該当した全エン トリのステータスビットにおけるEmptyビットを1にセットする.
SFRE(Search for next FREe address) 空きエントリ(Emptyビットが 1でないエントリ)のうちアドレスが最も小さいものを検索する.結果はE0RM
0
CAM0 tsid rfid
key
tsid rfid
rt valm
tsid rfid
CAM1ᓟඨ RB
RA W1 CAM1೨ඨ
ࡑࠬࠢઃ߈val
adr
31
255
287
0 63
0 31
127
128 143
128 143
127
32 63
256
32 63
val[0]
val[1]
val[2]
val[3]
ec
図20: CAMへのデータの割り当て
に格納され,ヒットしたアドレ スを返す.空きエントリが存在しない場合,−1 を返す.