« トランジスタ技術2018年11月号に掲載されました | トップページ | UltraScale+のPLにJTAGで書き込み成功 »

2018.10.11

ZYNQ UltraScale+ MPSoCのJTAGのしくみ

ZYNQ UltraScale+ MPSoC(以下、ZU)の仕組みを完全に理解しました

ZUの中にあるJTAGの構造をかみ砕いて描くと、こうなります。

Zujtag_3_2

ZUの内部には、PS TAP、PL TAP、ARM DAPという3つのJTAGコンポーネントが入っています。

  • PS TAPはPSの制御に使われるもので、JTAGステータスを見たりPMU(実体はMicroblaze)のデバッグポート(MDM)に接続されています。
  • PL TAPはPLのバウンダリスキャンやFPGA部分のコンフィグに使われます。
  • ARM DAPはCortex CPUのデバッグに使われます。

PL TAPとARM DAPは、デフォルトではDummyのほうを選択されていて、本体は無効になっています。また、PMU MDMとPL TAPとARM DAPにはセキュリティゲートというのがあって、勝手にデバッグをさせないようになっています。

セキュリティゲートは電源ON時やセキュアブートの時、eFUSEが切られているときには有効になっていて、JTAGが突破できません。

しかし、非セキュアブート(つまり普通のブート)するときには、CSUのROMのコードにってセキュリティゲートは無効になり、JTAGアクセスできるようになります。したがって、普通に起動した場合にはJTAGは使えるので、セキュリティゲートを気にする必要はありません。

sun

ZYNQ UltraScale+ MPSoCのJTAG命令レジスタの構造は次の図のようになっています。

Zujtag_6

ただし、PSとPLのIRは合わせて12bitという扱いなので、個別にコマンドを与えることはありません。PLのDRの長さは0bitになることもあります。

あまりPSとPL TAPを分離して考える必要はありませんが、ZUのJTAGのコマンドを解読していくときに、6bitごとに切って考えると理解しやすいところがあります。

ただし、PL TAPも一人前にIDCODEを持っていて、XCZU3EGのPSのIDCODEが0x14710093なのに対して、PLのIDCODEは0x14A42093でした。

このPL IDCODEは特別な命令IDCODE_PL(0x925)やIDCODE_PSPL(0x265)を発行すると読めます。

sun

JTAGのTDIから入ってきた信号はPS TAPを通った後、PL TAPかDummy TAPを通ります。その後、ARM DAPかDummy DAPを通ります。どちらを通るかというのは、PS TAPに対して発行するJTAG_CTRLコマンドで指定します。

具体的には、JTAG_CTRLコマンド(0x83F)をPS-PLに発行して、そのあと、0x00000003をDRに書き込みます。

SVF形式で書くなら、

STATE RESET;
TDR 0;
HDR 1 TDO (1); // ARMのDAPを無視するため
SIR 16  TDI (83FF) ; // JTAG_CTRL
SDR 32 TDI (00000003) ; // ARM DAPとPL TAPを有効化
RUNTEST RESET 16 TCK; // 切り替えた後は、Test-Logic-Resetステートで5回以上 TCKをトグルする

となります。

こうすることで、PL TAPとARM DAPが有効になって、MITOUJTAGの自動認識でも2個のデバイスが見つかるようになりました。

Zujtag_4

そして、ARMのDAPも認識されるようになり、正常にバウンダリスキャンができるようになります。

Zujtag_5

まとめると

  • ZYNQ UltraScale+ MPSoCのIRの長さは常に16bit
  • 非セキュアブートではセキュリティゲートは無効になっていて、突破できる
  • リセット後は、PL TAPとARM DAPはDummyが選択されているので、バウンダリスキャンやコンフィギュレーションをするなら、JTAG_CTRLコマンドで有効にしなければならない
  • PMUがJTAGでデバッグできそうだ

となります。

|

« トランジスタ技術2018年11月号に掲載されました | トップページ | UltraScale+のPLにJTAGで書き込み成功 »

コメント

コメントを書く



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




« トランジスタ技術2018年11月号に掲載されました | トップページ | UltraScale+のPLにJTAGで書き込み成功 »