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 | curl -O https://www.ftdichip.com/Drivers/D2XX/Linux/libftd2xx-arm-v7-hf-1.4.24.gz |
UrJTAGをビルドしてインストールします.
1 | cd ~/ |
これで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 | cd urjtag-git/urjtag/ |
これでHS2も使えるUrJTAGになりました .
UrJTAGを使う
UrJTAGは対話式のツールとなっているのでjtagコマンドを叩きます.
1 | sudo jtag |
ケーブルの検出と選択
1 | jtag> cable probe |
FPGAの検出
1 | jtag> detect |
接続しているFPGAはArtix7 XC7A35T-FTG256なのですがこのFPGAについての情報が登録されていないのでエラーが出てしまいました.
FPGAの登録
IC内部の情報がまとめられているBSDLファイルというものがあります.
これはメーカーが提供するもので必要なファイルをダウンロードしてきます.
Xilinx Artix7のBSDLファイル
Raspberry Piに転送して解凍します.
1 | unzip bsdl_artix7_3.zip |
今回の対象ファイルは”xc7a35t_ftg256.bsd”です.
UrJTAGが読める形式に変換する必要があり変換ツールとしてbsdl2jtagがあります.
1 | $ bsdl2jtag xc7a35t_ftg256.bsd xc7a35t_ftg256 |
しかし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 | sudo mkdir /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 | jtag> detect |
ちゃんと検出されました.
IDCODEを出力
1 | jtag> instruction IDCODE |
ポートの状態を取得
1 | jtag> instruction SAMPLE/PRELOAD |
よくわかりませんが値が得られました!
詳細はbsdlファイル内の”attribute BOUNDARY_REGISTER of XC7A35T_FTG256”エンティティに書いてあるようです.
パーサーなどを作らないと手動じゃ無理そうですね…
まとめ
デバイスの登録を行い,UrJTAGで検出し実際にバウンダリスキャンを行うことができました.
またまだわからないことだらけなのでぼちぼち試していこうと思います.