Spartan-6のBitStreamは、たまーに、少しだけサイズが大きくなることがあります。その原因がついにわかりました。
その原因を語るには、まずBitStreamの内容を理解する必要があります。BitStreamというのは、要するに、FFFFFFFFAA99556630A1・・・というアレです。
このビット列は、実は、FPGAの中にあるコンフィギュレーションマシンの命令コードなのです。FPGAのコンフィギュレーションというのは、FPGA内部にあるコンフィギュレーションマシンに様々なコマンドを与えて、データフレームを流しこむことで行われます。

コンフィギュレーションメモリにデータフレームを書き込むと、FPGAのLUTやIOBに望みの動作をするように設定されます。データフレームを書き込んだあと、CRCを設定して開始コマンドを送ることでFPGA全体がスタートするのです。
さて、Spartan-6のBitStreamは、他のXILINXのFPGAとは違い、1つの命令が16bit単位になっています。(まぁこの事自体がとてもマイナーなトリビアです。普通に使っている分には気にする必要はありません・・)
そんなBitStreamを手作業で解読しているととても大変なので、ツールを作りました。
こんなツールです。
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にどういう影響を及ぼすかがわかります。
例えば、圧縮BitStreamをONにすると、こんな感じの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解析ツールをダウンロード
無償でダウンロードできるようにしたので、どうぞ遊んでみてください。
最近のコメント