JTAG総合情報サイト>JTAGアドベントカレンダー>12月6日 BSDLファイル

12月6日 BSDLファイル

JTAGで送受信するデータは'1'、'0'の羅列にすぎません。

JTAGの命令コードや、各種レジスタの長さやビットの意味などは、すべてICの設計者が自由に決めることができるからです。そこで、各ビットの意味を定義づけるファイルが必要となります。

それが、BSDL(Boundary Scan Description Language)とよばれるファイルで、原則としてICを作ったメーカーが用意します。このファイルはVHDLのサブセットであり、VHDLと似た文法を用います。

BSDLファイルで定義される情報

BSDLファイルで定義されるデバイスの情報には次の表に示すようなものがあります。

表1 BSDLファイルで定義される情報

  • 部品名
  • ICのパッケージの名称 TQFP100、BGA256など)
  • I/O信号名
  • I/O信号の名称とピン番号の対応付け
  • TCK クロック周波数の上限
  • IRレジスタの長さと初期値
  • 各命令のビット配列 ? IDCODEレジスタの値
  • 各命令を実行した場合に選択されるデータレジスタの種別
  • バウンダリ・スキャン・レジスタ長
  • バウンダリ・スキャン・レジスタの各ビットの機能
  • デバイス・プログラミングのアルゴリズム (IEEE1532で追加された項目)
  • その他

 

BSDLファイルの構造

BSDLファイルの構造はおおむね次の図のようになっています。

まず、前半でパッケージの名前とI/Oの定義。

中盤で信号名とピン番号、コマンドのビット定義、DRの長さなどが書かれます。

最後の後半の部分でバウンダリスキャンレジスタの機能が定義されます。

 

 

BSDLの記載項目

① generic (PHYSICAL_PIN_MAP : string := "~~~" );

BSDLファイルの最初に現れるこの項目は、パッケージの形状を示します。~~~には、たとえばBGA256やFF1517などが入ります。この項目にパッケージ形状が正しく指定されていないBSDLファイルも数多くあります。

② port (

 次に現れるこの項目は、デバイスの全ピンの名称が示されます。例えば、

HSWAP_EN_E34: in bit;

VCCO7: linkage bit_vector (1 to 17);

IO_A6: inout bit; --  PAD197

IO_A7: inout bit; --  PAD198

 

のように、ICの外に出る信号名と、その方向が示されます。

ここで、inoutやinもしくはoutと書かれていない信号はJTAGでアクセスできません。そのような信号は、linkageと書かれます。信号電源やNCの端子が該当します。

③ constant パッケージ名:PIN_MAP_STRING :=

この項目は、各ピンの名称とピン番号の対応付けを行います。

"CCLK_AT5:AT5," &

"DONE_AP7:AP7," &

"DXN_G32:G32," &

"DXP_F33:F33," &

"GND:(A2,A3,A20,A37,A38,B1,B2,B3,B11,B29," &

・・・

"IO_A6:A6," &

"IO_A7:A7," &

"IO_A10:A10," &

"IO_A11:A11," &

この記述のフォーマットは、”内部信号名:端子番号”です。信号名は内部信号名で表されるので、データシートに記載された信号名のとおりにはなっていないこともあります(IO_A6:A6番端子につながったIOの意味)。

バスの場合は括弧で囲ってカンマでつないで書きます。ビットの並びが昇順か降順かは、②の項目の中でbit_vector(1 to 17)と書くか、bit_vector(17 downto 1)と書くかによって決まります。

 

④ attribute TAP_SCAN_CLOCK of TCK

この項目は、TCK(クロック)速度の上限を表し、次のように記述します。

attribute TAP_SCAN_CLOCK of TCK : signal is (33.0e6, BOTH);

この例では、TCKは33MHzまで追従できることを意味します。

 

⑤ attribute INSTRUCTION_LENGTH

この項目は、命令レジスタの長さを示し、例えば次のように記述します。

attribute INSTRUCTION_LENGTH of デバイス名 : entity is 6;

 

⑥ attribute INSTRUCTION_OPCODE

この項目は、命令コードの一覧を表します。

attribute INSTRUCTION_OPCODE of XC2V4000_FF1517 : entity is

        "EXTEST    (000000)," &

        "SAMPLE    (000001)," &

        "INTEST    (000111)," &

        "USERCODE  (001000)," &

    ・・・

 

⑦ attribute INSTRUCTION_CAPTURE

この項目は、ステータスレジスタのビットの規定値を表します。ステータスレジスタは命令レジスタをキャプチャしたときに読み出されます。

attribute INSTRUCTION_CAPTURE of XC2V4000_FF1517 : entity is

-- Bit 5 is 1 when DONE is released (part of startup sequence)

-- Bit 4 is 1 if house-cleaning is complete

-- Bit 3 is ISC_Enabled

-- Bit 2 is ISC_Done

        "XXXX01";

 

 

上の例では、ステータスレジスタは6ビットで、上位4ビットはDon’t Careで、下位2ビットは”01”です。下位2ビットが”01”以外の値になっている場合は、インフラストラクチャ・テストでのエラーとなります。

このデバイスでは、ステータスレジスタの上位4ビットには、DONE信号(コンフィギュレーションの完了を表す信号)の状態や、ISC(In System Configuration:書き込みのこと)のモードや完了フラグが示されています。このようなビットの意味づけは、BSDLファイル中にコメントとして記述されていることもありますが、記述されていないこともあります。

⑧ attribute INSTRUCTION_PRIVATE

この項目は、プライベート命令の一覧を示します。基本的に、FPGAやCPLDベンダは、プライベート命令を公開したがらないため、この項目自体が存在しないこともあります。

-- If the device is configured, and a USER instruction is implemented
-- and not private to the FPGA designer, then it should be removed
-- from INSTRUCTION_PRIVATE, and the target register should be defined

-- in REGISTER_ACCESS.

        "USER1," &

        "USER2," &

        "CFG_OUT," &

        "CFG_IN," &

        "JPROGRAM," &

        "JSTART," &

・・・

 

XILINX FPGAでは、USER1、USER2命令を使うことで、FPGAの内部回路をJTAGポートに接続することができます。また、CFG_IN、CFG_OUT命令を使うことで、コンフィギュレーションの状態を読み出すこともできます。

⑨ attribute IDCODE_REGISTER

この項目は、デバイスのIDCODEを示します。”XXXX”と書かれた上位4ビットは、当該LSIのバージョン番号(ステッピング番号、製造工場の違いによる改版、ES品か量産品かなど)を示します。パッケージ(QFP/BGAなど)の違いに対処するため上位4ビット以外の場所がXとなる場合もあります。また、複数のIDCODEが登録されているデバイスもあります。(CoolRunnerなど)

attribute IDCODE_REGISTER of XC2V4000_FF1517 : entity is

         "XXXX" & -- version

         "0001000" &        -- family

         "001010000" &      -- array size

         "00001001001" &    -- manufacturer

         "1";               -- required by 1149.1

 

⑩ attribute USERCODE_REGISTER

この項目は、USERCODEの定義を示します。USERCODEは、FPGAや、CPLD、コンフィグROMなどに書き込むことができる32ビットの値で、コンフィギュレーション時に書き込まれます。

attribute USERCODE_REGISTER of XC2V4000_FF1517 : entity is

        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

 

⑪ attribute REGISTER_ACCESS

この項目は、様々なJTAG命令を実行したときに、DR系レジスタにどのレジスタが接続されるかを示します。

attribute REGISTER_ACCESS of XC2V4000_FF1517 : entity is

--       "[] (USER1)," &

--       "[] (USER2)," &

        "BYPASS (HIGHZ,BYPASS)," &

         "DEVICE_ID (USERCODE,IDCODE)," &

         "BOUNDARY (SAMPLE,INTEST,EXTEST)";

 

上の例では、SAMPLE、INTEST、EXTESTなどの基本的なJTAG命令を実行した場合にはバウンダリ・スキャン・レジスタ(2748ビット)が、USERCODE、IDCODE命令を実行した場合にはDEVICE_IDレジスタ(32ビット)が、HIGHZ、BYPASS命令を実行した場合にはBYPASSレジスタ(1ビット)が接続されることを表しています。

USER1命令とUSER2命令は、ユーザがFPGAの中に機能を作りこむ命令なので、定義されていません。

その他のプライベート命令(JPROGRAMや、ISC_ENABLEなど、ISC関係の命令)を実行した場合の挙動については、BSDLファイル中には示されず、秘密にされています。

⑫ attribute BOUNDARY_LENGTH

この項目は、バウンダリ・スキャン・レジスタの長さを示します。

attribute BOUNDARY_LENGTH of XC2V4000_FF1517 : entity is 2748;

 

⑬ attribute BOUNDARY_REGISTER

この項目は、バウンダリ・スキャン・レジスタの各ビットの定義を示します。

attribute BOUNDARY_REGISTER of XC2V4000_FF1517 : entity is

-- cellnum (type, port, function, safe[, ccell, disval, disrslt])

         "   0 (BC_2, *, controlr, 1)," &

         "   1 (BC_2, IO_B4, output3, X, 0, 1, PULL0)," & --  PAD216

         "   2 (BC_2, IO_B4, input, X)," & --  PAD216

         "   3 (BC_2, *, controlr, 1)," &

         "   4 (BC_2, IO_C4, output3, X, 3, 1, PULL0)," & --  PAD215

         "   5 (BC_2, IO_C4, input, X)," & --  PAD215

・・・

         "2746 (BC_2, IO_E3, output3, X, 2745, 1, PULL0)," & --  PAD217

         "2747 (BC_2, IO_E3, input, X)"; --  PAD217

 

各項目は、cellnum (type, port, function, safe[, ccell, disval, disrslt]の順に並んでいます。

cellnumは、その行が定義するバウンダリ・スキャン・セル(レジスタ)の番号を表します。typeはセルのタイプを表し、BC_2は、EXTESTもINTESTもできる完全なセルであることを意味します。portは、内部信号名(constant PIN_MAP_STRINGで定義された文字列)です。

functionは、そのセルの機能を表します。output3なら入出力可能の端子の出力値、output2は出力専用、inputは入力専用、controlrは方向制御用です。

safeは、その端子を安全な状態(想定外の出力を出して危険な状態にしないよう)にするための値、ccellはそのセルをコントロールするセルの番号、disvalはその端子を出力禁止にするための値です。disrsltは、出力禁止状態のときに読み出される値です。