ソリューション
シリコンの動作
1.0 シリコン
- 電源投入時には、JTAG およびデバッグ システムはディスエーブルになっており、BootROM 実行が完了するとイネーブルになります。
- ソフト リセットでは、JTAG およびデバッグ システムはイネーブルのままです。
2.0 シリコン
- 電源投入時には、JTAG およびデバッグ システムはディスエーブルになっており、BootROM 実行が完了するとイネーブルになります。
- ソフト リセットでは、JTAG およびデバッグ システムはイディスエーブルになります。
プロダクション シリコン
- 電源投入時には、JTAG およびデバッグ システムはディスエーブルになっており、BootROM 実行が完了するとイネーブルになります。
- ソフト リセットでは、JTAG およびデバッグ システムはイディスエーブルになります。
シリコンの動作の影響
1.0
- BootROM が実行されるメモリ領域 (0x0 ~ 0x40000) にベクター キャッチまたはブレークポイントが設定されている場合、リセット後デバッグ システムはイネーブルのままなので、プロセッサはブレークポイントで停止します。
- BootROM 実行が完了する前にプロセッサが停止した場合、メモリ マップは BootROM 後のようになりません。
- BootROM の実行が完了するまでプロセッサが継続される必要があります。JTAG およびデバッグ システムがイネーブルなので、これは可能です。
2.0
- BootROM が実行されるメモリ領域 (0x0 ~ 0x40000) にベクター キャッチまたはブレークポイントが設定されている場合、リセット後デバッグ システムはイネーブルのままなので、プロセッサはブレークポイントで停止します。
- JTAG はディスエーブルなので、ブレークポイントに達した後プロセッサを再開するのは不可能です。
プロダクション シリコン
- BootROM が実行されるメモリ領域 (0x0 ~ 0x40000) から BootROM が実行するメモリ領域内でベクター キャッチおよびブレークポイントが BootROM 実行中にディスエーブルになります。
- 次に終了時にブート ROM は JTAG とともにデバッグ システムを再度イネーブルにします。これにより、ソフト リセットの前に設定されていたブレークポイント/ベクター キャッチが再度アクティベートされ、ユーザー アプリケーションまたは FSBL に適用されます。
ソフトウェアの動作
リセット動作の違いを回避するため、XMD (Xilinx Microprocessor Debugger) でリセット動作を一定にするソフトウェア回避策がインプリメントされます (1.0 および 2.0 シリコンの場合)。
リセットの前に、Zynq-7000 SoC に次の操作を実行するコードが読み込まれます。
- デバッグ システムおよび JTAG をディスエーブル
- BootROM からの終了を検出するためのブレークポイントを設定
- プロセッサをリセット
イメージが非セキュア イメージの場合、ブート モードの設定にかかわらず、BootROM の終了時にデバッグ システムと JTAG がイネーブルになります。
これにより、デバッグ システムがディスエーブルなので BootROM は実行され、ユーザー コードが実行される前にプロセッサが停止します。
注記: この回避策はプロダクション シリコンには不要です。
1.0 および 2.0 シリコンでのソフトウェアの影響
デバイス リセットの前にソフトウェアで上記のコードを実行する必要があるので、次のようになります。
- プロセッサが停止した場合、リセットでプロセッサを回復することはできません。
- たとえば、ブート モードが QSPI に設定されていて、プロセッサが停止するようなイメージがプログラムされた場合、QSPI にプログラムされたユーザー コードが実行される前にプロセッサを停止することはできないので、XMD は回復できません。