JTAG総合情報サイト>JTAGアドベントカレンダー>12月5日 データレジスタの切り替えと、プライベート命令

12月5日 データレジスタの切り替えと、プライベート命令

さて、このあたりからJTAGの本題に入ってきます。

TAPステートマシンを操作することで、DRとIRのどちらかを選択して、任意のビット列を流し込むことができるわけですが、一般的にはDRには複数のレジスタがあります。

例えば、

  • バウンダリ・スキャン・レジスタ(1bit)
  • IDCODEレジスタ(32bit)

それをどうやって選択しているのでしょうか。

テスト用ロジックの構造

次の図は、JTAGテスト用ロジックの全体像です。

 

データ系レジスタにはバウンダリスキャン・レジスタ、バイパスレジスタ、IDCODEレジスタなどの標準的なレジスタが配置されています。

また、個々のICのメーカーが独自に実装したオプション(プライベート)レジスタが入ることもあります。

バイパスレジスタ

バイパスレジスタは1bitのレジスタで、何も機能を持っていません。入力値を1クロック分保持して出力するというだけのレジスタです。

IDCODEレジスタ

デバイスのIDCODEを示します。上位4bitはICのリビジョン番号で、最下位1bitは必ず'1'。bit11~bit1がベンダコードです。XILINXの場合は下3桁を16進で書くと093となります。

図2 IDCODEレジスタの構造

バウンダリスキャンレジスタ

ICの端子を操作したり、見たりするための長いレジスタです。

その他のオプションレジスタ

デバイスに書き込んだり、CPUの実行を止めたり、温度を測ったり・・そのような魅力的な付加機能が追加されています。

 

レジスタの切り替え

これらのデータ系のレジスタは、インストラクションレジスタに設定された命令コードによって切り替わります

どのように切り替わるかというのは、次の章で詳しく説明するBSDLファイルというものに書かれているのですが、一例を紹介します。

XILINXのArtix-7 FPGAの場合、

attribute REGISTER_ACCESS of XC7A35T_CPG236 : entity is
-- "[] (USER1)," &
-- "[] (USER2)," &
-- "[] (USER3)," &
-- "[] (USER4)," &
        "DATAREG[57] (XSC_DNA)," &
        "BYPASS (HIGHZ,BYPASS)," &
"DEVICE_ID (USERCODE,IDCODE)," &
"BOUNDARY (SAMPLE,PRELOAD,EXTEST,EXTEST_PULSE,EXTEST_TRAIN)";

という記述があります。

これは、XDC_DNAという命令が実行された場合は57bitのレジスタが、HIGHZとBYPASS命令のときにはBYPASSレジスタが、USERCODEとIDCODEの場合はDEVICE_IDレジスタが、SAMPELE~EXTEST_TRAINのときにはBOUNDARYレジスタが選択されることを示しています。

また、USER1~USER4命令の場合がコメントアウトされていますが、これはFPGAに自分で実装するレジスタなので、設計者次第でいろいろなレジスタがつながるということを意味しています。

 

しかし、実際にはもっとたくさんのレジスタがあります。BSDLファイルに書かれていない秘密のレジスタはたくさんあります。

例えば、XILINXの7シリーズにはXADCという内蔵ADコンバータの機能がありますが、XADC_DRP命令が実行されるとXADCをコントロールするための32bitのレジスタが接続されます。

 

JTAG操作の本質

以上で説明してきた内容からわかると思いますが、JTAGの操作の本質は、

  1. 命令レジスタ(IR)に、そのデバイス特有の命令をセットする
  2. セットされた命令コードに応じてデータレジスタ(DR)が切り替わる
  3. データレジスタ(DR)に、何らかの値をセットし、同時に読み出す
  4. IRとDRにセットした内容によって、様々なデバッグ機能が実現される

なお、IRへの命令をセットするには、TMSを1100 [0000....1] 10と動かします。

DRへデータをセットするには、 TMSを100 [0000.....1] 10と動かします。

命令レジスタの長さや、どんな命令があるか、どのデータレジスタが選択されるか、などはICの設計者が自由に決めることができ、それぞれのICでみな異なります。

例 コンフィギュレーションROMへの書き込み一般的手順

  1. IRに「コンフィグレーションモードへの移行」コマンドを代入
  2. IRにアドレスコマンドを代入
  3. DRにアドレスを代入
  4. IRにデータコマンドを代入
  5. DRにデータを代入
  6. DRにデータを代入
  7. DRにデータを代入
    ・・・
  8. IRに「コンフィギュレーションモードの解除」コマンドを代入

すべての操作は、このような繰り返しで行われます。