« あけましておめでとうございます | トップページ | STM32F207のバウンダリスキャン »

2013.01.06

Spartan-6のBitStreamが太る理由

Spartan-6のBitStreamは、たまーに、少しだけサイズが大きくなることがあります。その原因がついにわかりました。

その原因を語るには、まずBitStreamの内容を理解する必要があります。BitStreamというのは、要するに、FFFFFFFFAA99556630A1・・・というアレです。

このビット列は、実は、FPGAの中にあるコンフィギュレーションマシンの命令コードなのです。FPGAのコンフィギュレーションというのは、FPGA内部にあるコンフィギュレーションマシンに様々なコマンドを与えて、データフレームを流しこむことで行われます。

Bskaiseki

コンフィギュレーションメモリにデータフレームを書き込むと、FPGAのLUTやIOBに望みの動作をするように設定されます。データフレームを書き込んだあと、CRCを設定して開始コマンドを送ることでFPGA全体がスタートするのです。

さて、Spartan-6のBitStreamは、他のXILINXのFPGAとは違い、1つの命令が16bit単位になっています。(まぁこの事自体がとてもマイナーなトリビアです。普通に使っている分には気にする必要はありません・・) 

そんなBitStreamを手作業で解読しているととても大変なので、ツールを作りました。

Sp6bsdec

こんなツールです。

BitStreamは、最初にRCRCというコマンドを発行してCRCをリセットし、次にフレーム長レジスタ(IOBのフレーム長-1)を設定し、・・という手順を実行していきます。そして、WCFGコマンドを発行してアドレス0(コンフィグメモリの最初)からデータフレーム(全FPGAのコンフィグデータ)を送り込みます。

さて、本題に入ります。

ISE13を使って単純なロジックと、BlockRAM(9kB)を使うデザインを作りました。

その出来上がったBitStreamをダンプしてみたところ、BlockRAMを使うデザインでは、データフレームを送り込んだあと、さらに追加で82ワードのデータを送り込んでいるシーケンスが追加されていました。

071558:Write(0x1) FAR_MAJ [0104 0017]
  フレーム アドレス レジスタ ブロックおよびメジャー  ブロック0 , 行 1 , メジャー 4 
  フレーム アドレス レジスタ マイナー  ブロックRAM0 , マイナー 23 
07155E:Write(0x5) CMD <WCFG> コンフィギュレーション データを書き込みます。
071564:Write(0x3) FDRI データフレームの転送 82 word

このように、追加のデータを流し込まなければならないので、ビットストリームが太るのです。

また、もう一つのBitStreamが太る要因としては、SPI ROMをx2モードでコンフィギュレーションしようとした場合にも起こります。

2bit幅のSPI ROMをコンフィグROMとして使うようなBitStreamを作った場合、BitStreamの先頭に以下のようなコマンド列が付け加えられました。

>00006E:Write(0xf) CWDT [FFFF]
000072:Write(0x13) GENERAL1 [0044]
  マルチブート アドレスの下位半分 0044
000076:Write(0x14) GENERAL2 [6B00]
  SPI オペコード 6b
  ブート アドレスの上位半分 00
00007A:Write(0x15) GENERAL3 [0044]
  ゴールデン ビットストリームの下位半分 0044
00007E:Write(0x16) GENERAL4 [6B00]
  SPI オペコード 6b
  ゴールデンブート アドレスの上位半分 00
000082:Write(0x17) GENERAL5 [0000]
  ユーザー定義のスクラッチパッド レジスタ 0000
000086:Write(0x5) CMD <NULL> NULL コマンド
00008A:Write(0x18) MODE_REG [3100]
  ビットストリームモード。 bit[10:0] を使用。マルチブートおよびフォールバックに必須
  リブート用のバス幅 4 bit
  BOOTMODE 1
  リブート用の vsel 設定 0x00
00008E:Write(0x10) HC_OPT_REG [005F]
000092:Write(0x5) CMD <IPROG> リコンフィギュレーションするため reboot_rst を生成します。

詳しくはわかりませんが、SPIx2やSPIx4を使う場合は、BitStreamが2つ入っていて、IPROGというコマンドを発行してリコンフィギュレーションを発行しているようでした。

「最初に読み込んだコンフィギュレーションはここで終了して、以後、再コンフィギュレーションをするときにはGeneralレジスタに設定されたSPIコマンドを使って読み出しなさいよ」という意味です。

このツールは意外と便利で、ISEのBitGenにある様々なオプションの効果を見ることができます。つまり、下のようなダイアログのチェックボックスがBitStreamにどういう影響を及ぼすかがわかります。

Bitgen_option

例えば、圧縮BitStreamをONにすると、こんな感じのBitStreamになります。

Compress_bitstream

普通のBitStreamはアドレス0から2Mbitくらい(XC6SLX16の場合)のデータをまとめて送るのですが、圧縮BitStreamはアドレスを細かく指定しながら4バイトとか数十バイトとかの単位で送っています。BitStreamはほとんどが00だから、必要なところだけ送れば圧縮にもなるでしょうね。

こんな感じで、XILINX FPGAがさらに面白くなりました。

BitStreamの標準サイズは、

 ・XC6SLX16では3,713,568bit
 ・XC6SLX45では11,875,232bit

となっています。これはどこからどこまでの長さを表しているかということですが、どうやら先頭のFFFFFFFFAA995566・・・の部分から、最後のDESYNCコマンドを書いた後の14発のNOOPの最後の部分までの長さのようです。正味のデータフレームだけではなく、RCRCコマンドやCOR1への書き込みなど、一連の命令を含んだ長さです。

結論としては、BlockRAMを使うデザインや、SPIx2やSPIx4を使う場合にはBitStreamに余計なコードが追加されるため太るというわけでした。

このBitStream解析ツールは、ソースコード付きでJTAGひろばにアップロードしました。

 ● Spartan-6 BitStream解析ツールをダウンロード

無償でダウンロードできるようにしたので、どうぞ遊んでみてください。

|

« あけましておめでとうございます | トップページ | STM32F207のバウンダリスキャン »

コメント

コメントを書く



(ウェブ上には掲載しません)




« あけましておめでとうございます | トップページ | STM32F207のバウンダリスキャン »