作者:Terry Ni,AMD工程师;文章来源:AMD开发者社区
背景介绍
在 AMD Versal Adaptive SoC 的开发过程中,PDI(可编程设备镜像)的加载是系统启动的核心环节。PDI 可以通过多种接口加载,包括 PMC、DPC和 SMAP(SelectMap)等方式。当 PDI 加载失败时,快速定位问题根因是关键。
SBI(Slave Boot Interface,从启动接口)是 Versal 中负责协调这些外部配置接口数据传输的硬件模块,位于 PMC 子系统内。SBI 支持 JTAG、SelectMAP、AXI Slave 以及 HSDP Slave 四种数据传输接口,通过一组 PMC_SBI_CSR 寄存器对其进行控制和监控。
本文总结了在实际工程调试中,利用 JTAG 读取 SBI 寄存器定位 PDI 加载问题的实战技巧。
SBI 基础架构
硬件结构框图如下:

SBI 模块基地址为 0xF1220000(PMC_SBI_CSR),主要寄存器如下:
在实际应用情况下,SBI需要调试的情况通常是在使用SMAP或者通过PMC AXI总线加载PDI。排查和定位可以通过以下几个方式进行。
调试方法一:直接通过JTAG方式加载PDI
通过这个方式,可以先将问题分割成PDI镜像本身的问题还是硬件加载问题。
如果JTAG能加载PDI成功,那么可以尝试用下面的方法进一步来调试。如果JTAG也加载失败,可以先用jtag status error_status和jtag status jtag_status看看是否是JTAG或者设备设置方面的原因导致的,如果也排除了的话,后续需要回到你vivado工程中确认来进一步查找问题。
Step1 读取 error_status,获取错误码
# 查看 PMC状态寄存器
jtag status error_status
在返回的信息中查看 ERROR_STATUS 字段。
也可以直接读取 PMC 错误状态寄存器(PMC_ERR1_STATUS):
# PMC_ERR1_STATUS,记录 PMC 内部错误
mrd 0xF0110004
# PMC_ERR2_STATUS,记录 PMC 扩展错误
mrd 0xF0110008
Step 2:读取 jtag_status,查看 JTAG 状态
# 查看 JTAG 状态寄存器
jtag status jtag_status
关注以下字段:
- DONE:PDI 加载完成标志
- INIT_B:初始化状态
- DONE_INTERNAL:内部 DONE 信号
Step 3:读取 PMC Global Status 寄存器
# PMC_GLOBAL_PMC_FW_ERR 寄存器,记录固件错误
mrd 0xF03002C4
# PMC_GLOBAL_PERS_GEN_STORAGE1,记录启动状态
mrd 0xF0300024
调试方法二:通过 JTAG 读取 SBI 寄存器定位错误
当通过方法一确认不是PDI镜像问题,那么接下来就和SBI相关性很大。
操作步骤
Step 1:读取 SBI_STATUS,确认 FIFO 和缓冲区状态
# 读取 SBI_STATUS 寄存器(绝对地址 0xF122000C)
mrd 0xF122000C
- 正常复位值为 0x88881000,表示各 FIFO 均为满(全空闲)
- 如果某个 FIFO 空间异常减小,说明数据滞留在 FIFO 中未被消费,可能存在接口挂死或时序问题
Step 2:读取 SBI_IRQ_STATUS,查看中断错误标志
# 读取 SBI 中断状态寄存器(绝对地址 0xF1220300)
mrd 0xF1220300
对照字段逐一排查:
- bit[4]=1(hsdp_slverr):HSDP AXI 接口传输尺寸或 burst 类型不匹配
- bit[3]=1(axi_slverr):PMC AXI 接口传输尺寸或 burst 类型不匹配
- bit[2]=1(data_rdy):数据已就绪但未被 MicroBlaze 及时处理(可能 PLM 挂死)
- bit[1]=1(smap_abort):SelectMAP 操作过程中检测到 Abort 信号
- bit[0]=1(inv_apb):访问了未实现的 APB 地址
Step 3:读取 SBI_CTRL,确认接口配置
# 读取 SBI_CTRL(绝对地址 0xF1220004)
mrd 0xF1220004
确认 interface[4:2] 字段与实际使用的启动接口一致,enable[0] 为 1(已使能)。
Step 4:读取 SBI_MODE,确认 JTAG 模式设置
# 读取 SBI_MODE(绝对地址 0xF1220000)
mrd 0xF1220000
- jtag[1]=1:JTAG 经由 SBI 加载 PDI(PDI 加载方式)
- jtag[1]=0:JTAG 不经由 SBI(ELF 加载方式)
调试方法三:逐步开启中断,精准捕获 SBI 错误
默认情况下 SBI 所有中断均被屏蔽,无法主动上报错误。调试时可以通过逐个开启中断的方式,在 PDI 加载过程中实时捕获特定错误。
操作步骤
Step 1:查看当前中断屏蔽状态
# 读取 SBI_IRQ_MASK(绝对地址 0xF122030C)
mrd 0xF122030C
mask 位为 1 表示对应中断被屏蔽,为 0 表示已使能。
Step 2:逐个开启中断(写 1 到 SBI_IRQ_ENABLE)
# 开启 smap_abort 中断(bit[1])
mwr 0xF1220308 0x2
# 开启 axi_slverr 中断(bit[3])
mwr 0xF1220308 0x8
# 开启所有 SBI 中断(bits[4:0])
mwr 0xF1220308 0x1F
📌 注意:SBI_IRQ_ENABLE 是写 1 使能(write-only,自清型寄存器),不需要 read-modify-write。
Step 3:触发加载动作,再读取 SBI_IRQ_STATUS
触发 PDI 加载后立即读取中断状态寄存器,观察哪些 bit 被置位:
mrd 0xF1220300
Step 4:清除中断状态(写 1 清)
# 清除所有已置位的 SBI 中断状态
mwr 0xF1220300 0x1F
调试案例:SMAP 加载失败排查流程
以下是一个典型的 SMAP 接口加载 PDI 失败时的完整排查流程:
1. 板子上电 → SMAP 接口加载 PDI → 加载失败(DONE 未拉高)
2. 通过 JTAG 连接芯片:
mrd 0xF1220300 → 读取 SBI_IRQ_STATUS
结果:0x00000002(bit[1] smap_abort 被置位)
→ 说明 SMAP 接口在加载过程中检测到 Abort 信号
→ 排查 SMAP_RDWR_B 和 SMAP_CS_B 的时序,确认信号完整性
3. 同时检查 SBI_STATUS:
mrd 0xF122000C → 结果:0x88811000
→ smap_din_fifo_space[19:13] 异常(期望 0x40,实际 0x08)
→ 说明 SMAP 输入 FIFO 中仍残留数据,传输未完成
常用 JTAG 调试命令速查表
小结
当 Versal 芯片通过 PMC / DPC / SMAP 加载 PDI 失败时,建议按如下顺序排查:
- 直接 JTAG 加载 PDI:验证 PDI 文件本身是否正常,排除文件问题
- 读取 error_status 和 jtag_status:从芯片顶层确认加载阶段和错误码
- 读取 SBI 寄存器:通过 mrd 0xF1220300(SBI_IRQ_STATUS)和 mrd 0xF122000C(SBI_STATUS)快速定位接口层面的错误
- 逐步开启中断:通过写 SBI_IRQ_ENABLE,在加载过程中捕获实时错误信号