3、ILA的探针连接:将ILA探针连接到待测信号、多探针的使用场景、探针信号的命名规范
探针连接这件事,说简单也简单,说复杂也复杂。我见过不少工程师,花了大把时间调代码,最后发现ILA根本没抓到想要的波形——原因就是探针没连对。嗯,咱们今天就把这块掰开揉碎了讲清楚。
3.1 将ILA探针连接到待测信号
ILA的核心功能就是“看信号”。但你要看哪个信号,得先告诉工具。在Vivado里,这个过程叫“探针连接”。
我个人习惯在综合后的网表里添加探针。为什么?因为综合前的RTL代码里,很多信号会被优化掉。你明明写了个中间变量,综合完发现它没了。这时候你再连探针,连个寂寞。
(* keep = "true" *) 或 (* dont_touch = "true" *) 属性保护该信号。
具体操作步骤其实不复杂:
- 打开综合后的设计(Synthesized Design)
- 在Netlist窗口找到你要观察的信号
- 右键选择
Mark Debug - 在Debug窗口里配置ILA核的深度和采样条件
我曾经在一个项目中,需要观察一个跨时钟域的信号。那个信号在RTL里叫 data_cdc,但综合后名字变成了 data_cdc_reg。我一开始没注意,直接连了RTL里的名字,结果ILA一直显示高阻。后来才发现,探针必须连到网表里的实际寄存器输出端。
3.2 多探针的使用场景
一个ILA核可以挂多个探针。每个探针可以独立设置位宽。你想想看,这在实际调试中太有用了。
我总结了几种典型的多探针使用场景:
| 场景 | 探针配置 | 说明 |
|---|---|---|
| 状态机调试 | 探针0:当前状态(4位) 探针1:状态跳转条件(8位) 探针2:输出信号(16位) |
同时观察状态机的状态变化、跳转条件和输出 |
| 总线协议分析 | 探针0:数据总线(32位) 探针1:地址总线(16位) 探针2:控制信号(4位) |
一次性捕获总线上的所有关键信号 |
| FIFO调试 | 探针0:写指针(8位) 探针1:读指针(8位) 探针2:空/满标志(2位) |
分析FIFO的读写时序是否正常 |
说白了,多探针就是让你能“一网打尽”相关信号。不用来回改配置、重新综合,省时间。
我记得有一次调试一个高速串行接口,需要同时观察发送端和接收端的32位数据、8位控制信号、还有4个状态标志。如果只用单探针,我得来回切换好几次。用多探针,一次抓完,对比波形一目了然。
3.3 探针信号的命名规范
这个问题,说实话,很多新手不重视。但我在项目中吃过亏,所以特别想强调一下。
你想想看,一个FPGA工程里可能有几十个ILA探针。如果命名乱七八糟,比如 probe0、probe1、sig1、sig2……等过两周你再回来看波形,根本分不清哪个是哪个。
我建议的命名规范如下:
- 模块名_信号名:例如
uart_tx_data、fifo_wr_en - 信号方向_功能:例如
in_data_valid、out_ready - 避免缩写歧义:比如
cnt到底是计数器还是控制信号?写成counter_value更清晰 - 统一前缀/后缀:同一模块的信号用相同前缀,比如
spi_、i2c_
/* synthesis keep */ 属性,同时用有意义的命名。这样综合后网表里的信号名也是清晰的,连探针时直接搜名字就行。
我曾经接手过一个项目,前任工程师给探针起的名字是 a、b、c……我花了整整一天才搞清楚每个探针对应什么信号。从那以后,我给自己定了个规矩:探针命名必须能“望文生义”。
wr_en 连到了 rd_en 上。所以命名规范不仅是为了别人,更是为了自己不出错。
3.4 知识体系图
下面这张图总结了本章的核心逻辑,帮你快速理清思路:
这张图把探针连接的三个核心环节串起来了。从怎么连、连几个、到怎么命名,每一步都有讲究。你按这个思路走,基本不会出大问题。
公众号:蓝海资料掘金营,微信deep3321