JTAGについて (その2)

 JTAGのインストラクションレジスタ(IR)について記述する。

 TAPコントローラでインストラクションレジスタに命令を書き込むことで、その後データレジスタ(DR)を使いながらさまざまなテストが出来る。基本的な命令セットは、以下の表のようになっている。

TAP命令の種類 コマンド名 機能
必須命令 EXTEST バイスの物理的接続をテストする。
必須命令 BYPASS バイス内のスキャンパスをバイパスする。
必須命令 SAMPLE/PRELOAD 指定した時点でのデータの取り込みと、指定パターンの設定。
オプション INTEST バイス内部のロジックをテストする。
オプション RUNBIST ビルトインされたテストの実行する。
オプション INCODE バイス識別コードを確認する。
オプション USERCODE 書き換え可能な識別コードを確認する。
オプション CLAMP バウンダリスキャンセルドライブしたままバイパスを実行する。
オプション HIGHZ 出力セルをハイインピーダンスにする。

この他にプライベート命令があるが、後でJTAGをICEとして使う場合を例に記載予定。 

  1. EXTESTは、ピンの外側からバウンダリスキャンセルまでの接続を確認するために使う。Capture-DRで入力ピンの情報を入手する => Shift_DRでTDIから出力ピン側にあるセルにデータを送りつつ、TDOから入力ピンから入手したデータを読み出す => Update-DRで前ステップで入力したデータを出力ピンから出す。という3ステップを含む。
  1. BYPASSは、データレジスタ(DR)の中からバイパスレジスタを選択し、1ビットのバイパスレジスタ経由でTDIからのデータをTDOから出力する。ボード上に存在し、JTAGに対応しているがテストしないデバイスをTDI => TDOのパス上でスキップするために使う。
  1. SAMPLEは、デバイス内部ロジックおよび外部回路に影響を与えることなく、デバイスが入出力データをバウンダリスキャンで取り込む。Capture-DRで入出力ピンの情報を入手する => Shift_DRでTDIから新しいデータを送りつつ、TDOから前ステップで入手したデータを読み出す
  1. PRELOADは、同様にデバイス内部ロジックおよび外部回路に影響を与えることなく、デバイスが入出力データをバウンダリスキャンにセットする。 Update-DRでバウンダリスキャンレジスタの内容をバウンダリスキャンレジスタ内部にラッチする。
  1. INTESTは、対象デバイスをテストデータでシングルステップ動作させて評価する。この命令を実行するためにはテスト対象デバイスをシングルステップ動作させる必要があるため、TAPコントローラがRUN-TEST/Ideleの時にはTDIは未使用状態であるため、TDI端子をシングルステップようのシステムクロックを入力するピンとして利用する(もちろん別途外部入力用のクロックピンを用意してもよい)。なお、テストデータをあらかじめバウンダリスキャンレジスタにセットするためにPRELOAD命令を用いる。
  1. 他は割愛。

 JTAGのテストを行うためには、「テストベクタ」と呼ばれるテスト用データファイルを用意する必要がある。このテストベクタはネットリストファイル(EDIF,BNET: 回路を構成するデバイス間の結線関係を定義したファイル)、および、コンポーネントデータファイル(BSDL, EBST: テスト対象となっているJTAG対応デバイスのピン割り当て、命令コードの定義およびバウンダリスキャンレジスタのビット定義などを行っているファイル) から自動テストパターンジェネレータ(ATPG)と呼ばれるツールソフトを用いることで自動生成が可能である(主な提供先:JTAG Technologies社、Goepel社、Corelis社など)。

 クラシカルなJTAGの使用方法に関しては、さらに以下のページのドキュメントが分かりやすかったので乗せておきます。
 
http://tmubdell.phys.metro-u.ac.jp/toshima/to-shi-shiryo/jtag/BS_Tutorial_j.pdf

 
 次に、JTAGテストの以下の重要な応用とそのプライベート命令について述べる。

1) 高速・高機能マイクロプロセッサ用ICE(In-Circuit Emulator_*1 )
2) CPLDFPGAなどへのオンボード書き込み用インターフェース

 例えば、TI社のチップに対するソフトウェアをJTAG経由でデバッグする場合を考える。ソフトの開発環境をIAR Embedded Workbench(アセンブラC/C++を使用して、組込みアプリケーションを構築しデバッグするための開発ツールセット)を用いているとすると、以下のページからJTAG制御用のコマンドを(Download associated code files (ZIP) をクリックして)ダウンロードする。

http://www.ti.com/lit/ug/slau265j/slau265j.pdf

 後は、ボードを買ってハード的な接続を確保し、プログラムをツールに従ってパコパコ記入すればいい。例えばこんな感じ。

http://www.roinos.com/system/guide/msp430/
http://toragi.cqpub.co.jp/Portals/0/backnumber/2007/01/p128-129.pdf  (トラ技2007年1月号)

ここまで来ると中のハードがどうこうとかあまり気にしなくなる。あまり必要ではないかもしれないけど、上記に示したslac265j.pdfにJTAG命令コードの詳しい記述があったのでせっかくなので記載しておく。まずレジスタの内容をチェックする。レジスタは、

1) インストラクションレジスタ(IR)
2) アドレスバス・スキャンレジスタ(ADR)
3) データバス・スキャンレジスタ(DBR)
4) 内部信号制御用のレジスタ(SCR)

である。なお2〜4をあわせてデータレジスタ(DR)と呼ぶ。2(ADR)、3(DBR)はアドレスバス、データバス上のデータを入手したり、または、セットしたりするレジスタである。また4(SCR)は、CPUとそれを含むシステムを監視、制御するために最低限必要な信号を入手/セットするためのレジスタである。4(SCR)のビット割付は以下のようになっている。

 RWなどの信号は、簡単なMUXを入れるだけで利用できると想像できる。興味深いのは、WAIT, CPUSUSP, TCE0やTCE1の信号でおそらくクロックの入れるタイミングを上手く制御するための端子である。内部動作させている状態と、テストモードでシングルステップ動作させる状態とでシステムの状態を切り替えると、どうしてもマルチサイクルやパイプラインなどのアーキテクチャを有するCPU内部では、完結していない処理ステップが残ってしまう。これらを全部終わらせてから(どうやっているかは詳しく分からんが)テストモードに移行出来るように、上記の端子が上手くロジックを形成して配置されていると推測される。

インストラクションレジスタに入力する命令コードは、下のようになっている。


 
大枠で見ると、アドレス、データバス、内部信号用レジスタの制御用、および、その他に分けられる。いくつか特徴的なものを述べて置くと、(1) IR_DATA_TO_ADDRは、データバスのデータをアドレスレジスタに入れる命令、(2)IR_DATA_QUICKは、アドレスバスのデータに自動的に2を加えることで、いちいちデータ入力前のアドレス入力しなくて良くなるため、あるまとまったセクターのメモリを早く書き込める命令、などである。システムをJTAGでテストするための流れは、単なる内部モニターであれば、IR_ADDR_CAPUREもしくはIR_DATA_TO_ADDRを実行すればよく、シングルステップでテストデータを評価したい場合は、インストラクションレジスタ(IR)の書き込み => 信号制御用のレジスタ(SCR) => ADR, DBRへのデータ入力 => TAPコントローラの状態をRun-Test/IDLEにしてシングルクロックを外部、もしくは、TDIポートから入れる、 となる。

レジスタのデータパスを見やすくするためにポンチ絵を書いてみた。

MABとMDBはそれぞれアドレスバス、データバスからの入出力値を示す。

  • 以上、JTAGについて長々と書いた。 最後に一番お世話になった本を紹介。有難うございました。

*1:CPUのソケットに接続用コネクタを挿入し、マイクロプロセッサの機能をホストコンピュータからエミュレートしてソフトウェアのデバッグとハードウェアの動作確認をする