FPGA 调试(06):调试技巧——ILA、VIO、ChipScope、逻辑分析仪
更新时间:2026-09-02。本文是
fpga/FPGA 领域第 06 篇,接 高速接口。FPGA 设计写完后,必须调试。最大的问题是:信号全在芯片内部,不能直接看。所以要用 ILA 片上逻辑分析仪抓信号,VIO 在线改参数,然后对比波形定位问题。
本文要回答的问题
- ILA 是什么?怎么用 ILA 抓内部信号?
- VIO 是什么?怎么在线修改寄存器?
- ILA 抓不到信号是什么原因?波形不对?
- 板级信号怎么用外部逻辑分析仪抓?
- 常见问题怎么定位?
一、ILA——片上逻辑分析仪
ILA(Integrated Logic Analyzer)是 Xilinx FPGA 内置的片上调试工具
原理:
1. 实例化 ILA IP 核
2. 把要抓的信号接到 ILA 输入
3. 综合布线后,ILA 会占用 BRAM 存储波形
4. JTAG 把波形传到 Vivado 软件显示
特点:
- 不需要改动 I/O 引脚
- 抓取内部任意信号
- 支持多触发条件
- 深度可以配置(1K-64K)
- 占用 FPGA 资源(LUT+BRAM)ILA 实例化模板:
verilog
// 实例化 ILA
ila_0 my_ila (
.clk (sys_clk), // 时钟
.probe0 (state), // 抓状态机状态
.probe1 (data_wr), // 写数据
.probe2 (fifo_full), // FIFO 满信号
.probe3 (fifo_empty) // FIFO 空信号
);触发条件配置:
触发方式:
- 边沿触发:信号上升沿触发
- 电平触发:信号高电平触发
- 比较触发:信号等于某个值触发
- 组合触发:多个条件 AND/OR
触发位置:
- 触发在波形中间:前后都抓
- 触发在波形末尾:只抓触发前
- 触发在波形开头:只抓触发后二、VIO——在线修改信号和参数
VIO(Virtual Input/Output)可以在 JTAG 下读写信号
用途:
- 在线修改控制寄存器(复位、开始、参数)
- 在线观察状态寄存器
- 不需要修改 I/O 引脚就能调试
特点:
- 不占 BRAM,只占 LUT+FF
- 实时读写,不需要重新 bitstream
- 调试完可以删掉 VIOVIO 使用示例:
verilog
// VIO 实例化
vio_0 my_vio (
.clk (sys_clk),
.probe_in0 (state), // VIO 读 FPGA 状态
.probe_in1 (done),
.probe_out0 (rst_n), // VIO 输出复位到 FPGA
.probe_out1 (start) // VIO 输出启动信号
);
// 连接到设计
assign rst_n = my_rst_n & vio_rst_n;
assign start = vio_start;三、ILA/VIO 常见问题
问题 1:ILA 抓不到信号,波形全是 X
原因:
- 时钟接错了,ILA 时钟没连对
- 时钟频率太高,JTAG 读取慢
- 信号名被工具优化掉了
解决:
- 检查 ILA 时钟是不是实际信号时钟
- 信号保持不变:加
(* keep = "true" *)告诉综合工具不要优化 keep="true"示例:verilog(* keep = "true" *) reg [3:0] state;
问题 2:触发位置不对,想抓触发前的波形
解决:
- 设置触发位置在波形中间
- 设置深度大一点(比如 8K 或 16K)
- 触发条件不要太难命中
问题 3:ILA 深度不够,抓不到完整波形
解决:
- 选更大深度(64K 是最大,占用 BRAM 更多)
- 减少探测信号数量,只抓需要的
- 用更苛刻的触发条件,只抓相关部分
四、ChipScope 原理
Xilinx 老一代调试工具叫 ChipScope,新工具是 ILA
ChipScope vs ILA:
ChipScope:ISE 时代,基于 ChipScope Pro
ILA:Vivado 时代,集成到 Vivado,更方便
原理相同:
都是用片上 BRAM 存波形,JTAG 读出来
都是占 FPGA 资源,不影响时序太多五、外部逻辑分析仪——抓板级信号
对于板级信号(FPGA 引脚出来的信号),可以用外部逻辑分析仪抓
适用场景:
- IO 电平问题
- 时序问题(setup/hold)
- 差分信号质量
- 板级接口调试(DDR、PCIe)
优缺点:
+ 不用占 FPGA 资源
+ 可以抓多个板卡信号
- 只能抓引脚,不能抓内部信号
- 需要专用硬件(价格几千到几万)
常见品牌:Agilent、Tektronix、Saleae经验: Saleae 逻辑分析仪性价比高,适合嵌入式调试,采样率 100-500 MHz,价格几百到几千元。
六、常见问题定位方法
问题 1:设计不工作,全是 X
排查步骤:
- 用 ILA 看复位是否正确释放
- 看时钟是否存在(ILA 时钟端口能测频率)
- 看 PLL 是否锁定(
pll_locked信号) - 看状态机在哪卡住
问题 2:FIFO 数据不对
排查:
- ILA 抓
wr_en/din/full,看写入是否正确 - ILA 抓
rd_en/dout/empty,看出读是否正确 - 看读写指针格雷码是否正确
- 跨时钟域检查是否处理正确
问题 3:时序不收敛,setup 违例
排查:
- 看时序报告哪条路径违例
- 看逻辑深度是不是太深(> 10 LUT 级)
- 加流水线寄存器
- 看利用率是不是太高(> 80%),降利用率
问题 4:DDR 读写失败
排查:
- 看 MIG IP 核是否例化正确
- 看
init_calib_complete是否拉高(初始化完成) - 简单读写测试,看数据是否正确回读
- 检查引脚约束和 PCB 走线等长
七、调试总结:定位优先级
先查时钟复位:
→ 时钟有没有?PLL 锁了吗?
→ 复位释放了吗?电平对吗?
再查状态机:
→ 状态机走到哪了?卡住了吗?
再查 FIFO/握手:
→ 数据能进去吗?能出来吗?
→ 信号握手对吗?
最后查时序:
→ 时序约束对吗?时序收敛吗?相关与延伸
下一篇:工程实践——代码规范、跨时钟域、复位策略、功耗优化;高速接口,见 高速接口——LVDS、DDR、PCIe、Ethernet。
一句话总结
FPGA 调试:ILA 片上逻辑分析仪,占用 BRAM 抓内部信号,需要 (* keep = "true" *) 防止优化;VIO 在线读写寄存器,可以在线改复位、启动参数,不需要重新下载 bitstream;ILA 抓不到信号先检查时钟和 keep 属性;板级信号用外部逻辑分析仪抓,只能抓引脚,内部信号还是 ILA;定位优先级:先查时钟复位 → 再查状态机 → 再查 FIFO 握手 → 最后查时序。