3. Versal调试基础设施
Versal ACAP 的调试体系与上一代 Zynq/UltraScale 有本质区别:它不再只有 PL 侧的 ILA,而是把 PS、NoC、AI Engine、DDRMC、收发器等异构资源统一纳入一条可配置的调试访问链路。理解这条链路,是后续做时序性能验证和跨域联合调试的前提。本节先讲清“调试请求从主机到目标内部”的完整通路,再落到实际连接与工具操作。
一、Versal 调试访问的物理与逻辑通路
主机上的 Vivado Hardware Manager 并不直接“看到”芯片内部信号,它通过一条分层链路抵达目标:
- 主机侧:Vivado Hardware Manager(或 Vitis 调试器)作为客户端,通过 hw_server 与目标通信。
- 物理连接:JTAG 电缆(如 Xilinx Platform Cable USB II、Digilent HS2/HS3)接到板卡 JTAG 排针,或通过 USB-JTAG 桥接芯片接入。
- 片内 TAP:JTAG 信号进入 Versal 的 TAP 控制器,经 Debug Bridge 转换为片内调试总线访问。
- Debug Bridge:这是 Versal 调试基础设施的核心枢纽,把 JTAG 的串行访问翻译成对 PL、PS、NoC、AI Engine 等域内调试资源的并行访问。
- 调试资源:ChipScope ILA/VIO、PS 的 CoreSight 组件、AI Engine 调试接口、NoC 性能监视器等,最终被访问。
关键点在于:Debug Bridge 是“必经之路”。无论你调试的是 PL 逻辑还是 AI Engine,请求都要经过它。因此 Debug Bridge 的配置(时钟、复位、访问权限)直接决定调试能否建立。
二、Debug Bridge 的配置要点
Debug Bridge 在硬件设计中由 IP 形式例化,通常随 Debug Hub 一起出现。它需要两个关键输入:调试时钟和调试复位。如果这两个信号没有正确连接或频率不匹配,Hardware Manager 会报“无法检测到调试集线器”或“Debug Bridge 未就绪”。
实际工程中常见的做法是:调试时钟使用与 JTAG 无关的独立时钟(如 100 MHz 板级时钟),复位保持有效直到时钟稳定。在 Versal 中,Debug Bridge 还涉及访问权限配置——默认情况下,PS 和 PL 的调试访问可能被安全策略限制,需要在 CIPS 或 PMC 配置中开放对应通道。
三、JTAG 连接与 Vivado Hardware Manager 操作
连接流程可以概括为“打开硬件管理器 → 连接电缆 → 识别器件 → 加载调试探针”。具体操作如下:
- 在 Vivado 中打开 Open Hardware Manager,点击 Open Target → Auto Connect。若自动连接失败,选择 Open New Target 手动指定电缆。
- 连接成功后,Hardware Manager 会显示器件链。Versal 通常显示为
xcvc1902等具体型号,并列出可用的调试核。 - 若设计中包含 ILA,需在 Hardware 窗口中右键器件,选择 Refresh Device,让工具重新扫描调试核。
- 对于 AI Engine 调试,需要额外通过 Vitis 的 AI Engine Debug 视图连接,底层仍走同一条 JTAG/Debug Bridge 通路。
JTAG 链上如果挂有多个器件(如 Versal + 外部 FPGA),需要正确设置 IR 长度和链顺序,否则 Hardware Manager 只能识别到第一个器件。链顺序可在 Hardware Manager → JTAG Settings 中手动指定。
四、ChipScope 在 Versal 中的使用方式
ChipScope 在 Versal 中主要以 ILA(Integrated Logic Analyzer)和 VIO(Virtual Input/Output)核的形式存在。与旧器件不同的是,Versal 的 ILA 核通过 Debug Bridge 统一管理,不再需要单独的 BSCAN 原语。
一个典型的 ILA 配置示例:
create_debug_core u_ila_0 ila
set_property C_DATA_DEPTH 4096 [get_debug_cores u_ila_0]
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
set_property C_NUM_OF_PROBES 3 [get_debug_cores u_ila_0]
set_property C_PROBE0_WIDTH 32 [get_debug_cores u_ila_0]
set_property C_PROBE1_WIDTH 16 [get_debug_cores u_ila_0]
set_property C_PROBE2_WIDTH 8 [get_debug_cores u_ila_0]
connect_debug_port u_ila_0/clk [get_nets clk_100m]
connect_debug_port u_ila_0/probe0 [get_nets {data_valid data_payload}]
这段约束把 ILA 的采样深度设为 4096,探针 0 为 32 位,探针 1 为 16 位,探针 2 为 8 位,采样时钟为 100 MHz。触发条件在 Hardware Manager 中设置,例如“probe0 的 bit[5] 为 1 且 probe1 大于 0x00FF”。
需要特别注意:ILA 的采样时钟必须与 Debug Bridge 的调试时钟同源或保持确定相位关系,否则跨时钟域采样会出现不确定的触发偏移。在 Versal 中,推荐把 ILA 时钟和 Debug Bridge 时钟都接到同一个 MMCM 输出的不同分频端口。
五、调试连接状态与常见问题判断
调试连接是否健康,可以通过几个明确的状态来判断:
| 现象 | 可能原因 | 检查方向 |
|---|---|---|
| Hardware Manager 无法识别器件 | JTAG 链顺序错误、电缆未供电、IR 长度不匹配 | 检查 JTAG Settings 中的链配置和电缆指示灯 |
| 识别到器件但无调试核 | Debug Bridge 时钟未稳定、复位未释放 | 用示波器测调试时钟,确认复位极性 |
| ILA 触发不上 | 采样时钟与调试时钟不同源、触发条件过严 | 先放宽触发条件,再检查时钟关系 |
| AI Engine 调试无法连接 | AIE 调试通道未在 PMC 中开放 | 检查 CIPS 配置中的调试访问权限 |
把上述链路和状态判断串起来,就能形成一条可操作的调试连接检查路径:先确认物理 JTAG 连通,再确认 Debug Bridge 就绪,然后确认调试核被正确枚举,最后才进入触发与采样分析。这条路径的每一步都有明确的观察点和判断依据,而不是靠反复重试。