Spartan-6のBitStreamが太る理由
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解析ツールをダウンロード
無償でダウンロードできるようにしたので、どうぞ遊んでみてください。
| 固定リンク






コメント