« Ultra96(UltraZed)実践勉強会に参加しました | トップページ | EXPARTAN-6Tの最終出荷 »

2018.11.04

VivadoとUltraScale+との間の通信を解析(2)

昨日の続きをやっております。

開発中の新しいバージョンのMITOUJTAGを使って、VivadoからUltraScale+へのJTAGアクセスを解析できたのはいいのですが、それを目で追っていると大変なので、SVFフォーマットで出力できるようにしました。

Svf_capture

それを見ると、かなりプライベート命令を使っているな・・という感想です。

アクセスの最初の部分を見ると、

SIR 16 TDI (902F) TDO (0411); // USER1
SDR 33 TDI (000000000) TDO (000000000);
STATE RESET;
SIR 16 TDI (7E4F) TDO (0411); // ???
SDR 33 TDI (000000000) TDO (060018202);
STATE RESET;
SIR 16 TDI (902F) TDO (0411); // USER1
SDR 18 TDI (1E000) TDO (38000);
SDR 77 TDI (00000000000000000152) TDO (00000000000000000548);
STATE RESET;
SIR 16 TDI (922F) TDO (0411); // USER3
SDR 18 TDI (1E000) TDO (38000);
SDR 77 TDI (00000000000000000152) TDO (00000000000000000548);
SIR 16 TDI (FFFF) TDO (0411);
SIR 16 TDI (903F) TDO (0411); // USER2
SDR 33 TDI (000000000) TDO (000000000);
SIR 16 TDI (FFFF) TDO (0411);
SIR 16 TDI (903F) TDO (0411); // USER2
SDR 43 TDI (000000000D2) TDO (00000000348);
SIR 16 TDI (FFFF) TDO (0411);
SIR 16 TDI (903F) TDO (0411); // USER2
SDR 7 TDI (18) TDO (60);
SDR 43 TDI (000000000D2) TDO (00000000348);
SIR 16 TDI (A32F) TDO (0411); // ????
SDR 97 TDI (0000000000000000000000000) TDO (0000000000000000000000000);
SIR 16 TDI (FFFF) TDO (0411);
SIR 16 TDI (0E4F) TDO (0411); // ????
SDR 33 TDI (000000000) TDO (000000000);
SIR 16 TDI (FFFF) TDO (0411);
・・・
SIR 16 TDI (824F) TDO (0751);
SDR 33 TDI (000000006) TDO (000000000);
・・・

となっています。USER1,2,3はILAなどの内蔵ロジアナを見るためのものだと思いますが、0x7E4F 0xA32F 0x0E4Fという秘密のプライベート命令なので何をやっているかわかりません。

ユーザガイドug1085にもug570にも記述はありません。また、BSDLファイルを解読しても、該当する命令はありません。自力で解析するしかなさそうです。

sun

UltraScale+のJTAGコマンドは上位12bitがPS-PL系へのアクセスで、下位4bitがARM DAPへのコマンドなのですが、上記の解析結果からわかることは、

  • 0x7E4は何かの32bitのステータスレジスタ読み出しで、VivadoがJTAGでアクセスをするとそのステータスは変わる。
  • 0xA32は96bitのレジスタがつながる
  • 0x0E4は32bitのレジスタがつながる
  • 0x824は32bitのレジスタがつながる

ということです。

sun

UltraScale+のリセット後にDummy DAPからARM DAPに切り替えるJTAG_CTRL命令は見つかりませんでしたが、PS TAPとPL TAPを分離して考えると、上記のプライベート命令というのは既知の命令の組み合わせの表現なのかもしれません。

そう考えると、0x7E4というのは011111 & 100100なので、JTAG_STATUSコマンドとPLに対する24というコマンドの組み合わせです。JTAG_STATUSコマンドでPS TAP Controllerのステータスレジスタが見えるはずです。下位6bit(PL)に対する0x24のコマンドは公開されていませんが、データレジスタ長を0にする命令かもしれません。

0x7E4の後で32bitのDRをスキャンして0x060018202という結果を得ていますが、

Pstap_status

と照らし合わせて、ビンゴじゃないかなと思います。

0xA32は101000 & 110010なのですが、これに該当する命令はありません。ですが、下位6bitの110010はFUSE_DNAコマンドの下位6bitと一致するので、FUSE_DNAを読み出しているのだろうと推測されます。一回しか試せなさそうですが、FUSE_DNAを書き込んで試してみたいところです。上位6bit(PS)に対する0x28もレジスタ長を0にするものかもしれません。

0x0E4は、000011 & 100100と読めるので、PSに対するPMU_MDM命令と解釈できそうです。

0x824は、100000 & 100100と読めるので、PSに対するJTAG_CTRLコマンドで、直後のSDRに6を与えているので、PS TAPとPL TAPとARM DAPを接続するようです。

まとめると

  • 0x7E4はPSのステータス読み出し
  • 0xA32はDNAの読み出し
  • 0x0E4はPMUのMicroblaze Debug Moduleへのアクセス
  • 0x824と続く0x00000006はJTAGチェーンの正常化

なのかと推測されます。

それ以外の902や903、922はUSER1,2,3コマンドで、ILAやVIOの有無を調べているのだと思われるので、重要ではなさそうです。

その他にもプライベート命令はFUSE関係でたくさん出てきましたが、すべて解読できました。

sun

さて、Vivadoが起動した後は、ARMのDAPに対するコマンドが発行されるのが確認できました。

STATE RESET;
SIR 16 TDI (FFF8) TDO (0751);
SDR 36 TDI (000000008) TDO (000000000);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (08000019A) TDO (000000002);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (000000003) TDO (18000000A);
SDR 36 TDI (000000007) TDO (18000000A);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (000000784) TDO (000000002);
SIR 16 TDI (FFFB) TDO (0751);
SDR 36 TDI (000000007) TDO (000000782);
SDR 36 TDI (000000003) TDO (1A3B80022);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (008000784) TDO (000000012);
SIR 16 TDI (FFFB) TDO (0751);
SDR 36 TDI (000000007) TDO (008000782);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (010000784) TDO (223B80012);
SIR 16 TDI (FFFB) TDO (0751);
SDR 36 TDI (000000007) TDO (010000782);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (000000003) TDO (123B00082);
SDR 36 TDI (000000007) TDO (18000000A);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (008000004) TDO (000000002);
SIR 16 TDI (FFFB) TDO (0751);
SDR 36 TDI (400000010) TDO (008000002);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (000000004) TDO (123B00082);
SIR 16 TDI (FFFB) TDO (0751);
SDR 36 TDI (000000001) TDO (000000002);
SIR 16 TDI (FFFA) TDO (0751);
SDR 36 TDI (008000004) TDO (184030212);
SIR 16 TDI (FFFB) TDO (0751);
SDR 36 TDI (000000001) TDO (008000002);

というものですが、SIRの行にあるFFF8、FFFA、FFFBというのがコマンド、続く36bitのがデータです。

この解釈はARM Debug Interface Architecture Specification(https://static.docs.arm.com/ihi0031/c/IHI0031C_debug_interface_as.pdf)ににあります。

ARMのデバッグシステムは以下のような構造になっていて、

Arm_debug

FFF8が発行されるとABORT、FFFAはDPACC、FFFBはAPACCへの読み書きが行われます。

これが何を意味しているかの解読は別の機会にするとしましょう。

|

« Ultra96(UltraZed)実践勉強会に参加しました | トップページ | EXPARTAN-6Tの最終出荷 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Ultra96(UltraZed)実践勉強会に参加しました | トップページ | EXPARTAN-6Tの最終出荷 »