UrJTAGでバウンダリスキャン

FPGAボードのデバッグをするにあたりバウンダリスキャンが使えそうという話を聞いたので試してみました.
今回はRaspberry Pi上に環境を構築します.

JTAGとバウンダリスキャン

JTAGはICや基板のテスト用に定められた規格であり,今日のFPGAでは書き込みやデバッグ等に便利なものとなっています.
テストを行うためにICの内部状態を読み出すことをバウンダリスキャンテストと呼ばれるようで,これを活用することでICのピンの状態を読み出すことが出来ます.

インストール

Raspberry Pi 3でUrJTAGを使うJTAGでバウンダリスキャンしてみようを参考にしました.(2021/06/16)

Raspberry Pi 2にRaspbianをインストールした状態でスタートします.
最低限必要なものをインストール

1
sudo apt install autoconf autopoint libtool libreadline-dev python-dev libusb-dev libusb-1.0-0-dev flex libftdi-dev bison git -y

次にJTAGデバイスを触るためにFTDIのドライバを入れます.

1
2
3
4
5
6
7
8
9
curl -O https://www.ftdichip.com/Drivers/D2XX/Linux/libftd2xx-arm-v7-hf-1.4.24.gz
tar xvf libftd2xx-arm-v7-hf-1.4.24.gz
cd release/build
sudo cp libftd2xx.* /usr/local/lib
sudo chmod 0755 /usr/local/lib/libftd2xx.so.1.4.24
sudo ln -sf /usr/local/lib/libftd2xx.so.1.4.24 /usr/local/lib/libftd2xx.so
cd ../examples
sudo cp ftd2xx.h /usr/include/
sudo cp WinTypes.h /usr/include/

UrJTAGをビルドしてインストールします.

1
2
3
4
5
6
7
cd ~/
sudo apt install python3-distutils python3-dev -y
git clone git://git.code.sf.net/p/urjtag/git urjtag-git
cd urjtag-git/urjtag/
./autogen.sh
make
sudo make install

これでjtagコマンドが使えるようになりました.

Digilent HS2を使う

今回使用するJTAGデバイスはDigilent社のHS2なのですが,初期状態ではHS1にしか対応していないことが判明しました.
そこで先人の知恵をお借りしてパッチを適用してHS2を使えるようにします.
xc7a200t & Digilent HS2 & urjtag & Vivado 2020.1
Universal JTAG library, server and tools / Re: [UrJTAG-dev] Digilent FT2232 based boards revisited
パッチの内容を適用し以下のファイルにHS2の処理を追加しました.

  • src/tap/cable/ft2232.c
  • src/tap/cable/generic_usbconn_list.h
  • src/tap/cable_list.h

再度ビルドしてインストール

1
2
3
4
cd urjtag-git/urjtag/
make
sudo make install
sudo ldconfig

これでHS2も使えるUrJTAGになりました .

UrJTAGを使う

UrJTAGは対話式のツールとなっているのでjtagコマンドを叩きます.

1
sudo jtag

ケーブルの検出と選択

1
2
3
4
jtag> cable probe
Found USB cable: DigilentHS2
Connected to libftd2xx driver.
jtag>

FPGAの検出

1
2
3
4
5
6
7
8
9
jtag> detect
IR length: 6
Chain length: 1
Device Id: 00000011011000101101000010010011 (0x0362D093)
Manufacturer: Xilinx (0x093)
Part(0): xc7a35t (0x362D)
error: Unable to open file '/usr/local/share/urjtag/xilinx/xc7a35t/STEPPINGS'
Unknown stepping! (0000) (/usr/local/share/urjtag/xilinx/xc7a35t/STEPPINGS)
jtag>

接続しているFPGAはArtix7 XC7A35T-FTG256なのですがこのFPGAについての情報が登録されていないのでエラーが出てしまいました.

FPGAの登録

IC内部の情報がまとめられているBSDLファイルというものがあります.
これはメーカーが提供するもので必要なファイルをダウンロードしてきます.
Xilinx Artix7のBSDLファイル

Raspberry Piに転送して解凍します.

1
2
unzip bsdl_artix7_3.zip
cd artix7/public/bsdl/

今回の対象ファイルは”xc7a35t_ftg256.bsd”です.

UrJTAGが読める形式に変換する必要があり変換ツールとしてbsdl2jtagがあります.

1
2
3
4
$ bsdl2jtag xc7a35t_ftg256.bsd xc7a35t_ftg256
error: -E- error: In Package STD_1149_6_2003, Line 2, Error in User-Defined Package declarations.
error: -E- error: BSDL file 'xc7a35t_ftg256.bsd' contains errors in VHDL stage, stopping
error: vhdl subsystem: Parser error, see log for details

しかしSTD_1149_6_2003パッケージが登録されていないというエラーが出てしまいます.
エラー出る部分を削ってしまえという回答があったので従います.
(Universal JTAG library, server and tools / Discussion / Using UrJTAG: How to convert bsd file to jtag file for xc7k325t_fbg676)[https://sourceforge.net/p/urjtag/discussion/682993/thread/d7eaecd13a/]

今回は以下の2箇所を削りました.

  • L322: use STD_1149_6_2003.all;
  • L1485-1492: attribute AIO_COMPONENT_CONFORMANCE of XC7A35T_FTG256 : entity is

問題なく変換され”xc7a35t_ftg256”ファイルが生成されました.
このファイルを登録していきます.
ライブラリは/usr/local/share/urjtag以下に存在します.
xc7a35tのディレクトリがなかったので作成しコピーします.

1
2
sudo mkdir /usr/local/share/urjtag/xilinx/xc7a35t
sudo mv xc7a35t_ftg256 /usr/local/share/urjtag/xilinx/xc7a35t

このままでは認識されないのでxc7a35tの中でもftg256はここだよという登録を行います.
“/usr/local/share/urjtag/xilinx/xc7a35t/STEPPINGS”というファイルを生成します.
先程detectした結果得られた”Unknown stepping! (0000)”の0000(これはバージョンらしい)を使用します.
以下の書式に従い作成します
<バージョン> <表示名> <バージョンの表示名>

1
0000 xc7a35t_ftg256 0

ここまで行えば登録は完了です.

1
2
3
4
5
6
7
8
9
jtag> detect
IR length: 6
Chain length: 1
Device Id: 00000011011000101101000010010011 (0x0362D093)
Manufacturer: Xilinx (0x093)
Part(0): xc7a35t (0x362D)
Stepping: 0
Filename: /usr/local/share/urjtag/xilinx/xc7a35t/xc7a35t_ftg256
jtag>

ちゃんと検出されました.

IDCODEを出力

1
2
3
4
5
6
jtag> instruction IDCODE
jtag> shift ir
jtag> shift dr
jtag> dr
00000011011000101101000010010011 (0x0362D093)
jtag>

ポートの状態を取得

1
2
3
4
5
6
jtag> instruction SAMPLE/PRELOAD
jtag> shift ir
jtag> shift dr
jtag> dr
01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110111110111110111110111111110110110110111110111111110111111110110110111111111111111110111111111111111111111111111110111111111110110110110110110110110111111111111111111111111111111110111110111111111110110111111110111111111111110000000000001111111111111111111111111111111111111111111111111111111111111111111111111111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100010111001110 (0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFC5CE)
jtag>

よくわかりませんが値が得られました!
詳細はbsdlファイル内の”attribute BOUNDARY_REGISTER of XC7A35T_FTG256”エンティティに書いてあるようです.

パーサーなどを作らないと手動じゃ無理そうですね…

まとめ

デバイスの登録を行い,UrJTAGで検出し実際にバウンダリスキャンを行うことができました.
またまだわからないことだらけなのでぼちぼち試していこうと思います.

関連記事