调试相关¶
ILA 集成逻辑分析仪¶
Xilinx 的 FPGA,支持在 FPGA 内部进行“调试”:实际上,就是在 FPGA 内部内嵌一个逻辑分析仪,不断地对内部信号进行采样,保存下来,传输到电脑上进行展示。这个功能,在 Vivado 中叫做 ILA(Integrated Logic Analyzer)。
为了让 Vivado 插入集成逻辑分析仪,需要进行如下步骤:
- (可选)修改代码,在想要调试的信号上添加 (* mark_debug = "true" *) 标记
- 点击 Run Synthesis 进行综合
- 综合完成后然后点击 Open Synthesized Design
- 点击 Setup Debug,Vivado 会显示你已经配置了 ILA 调试或者标记了 mark_debug 的信号
- 从中选择要观察的信号,如果没有 mark_debug,也可以手动搜索并添加信号,注意信号综合后,名称可能和源码不完全一致
- 给每个要观察的信号,设置采样的时钟域,建议选择该信号所在时钟域的时钟
- 按照提示完成配置,完成配置后,点击保存(非常重要,不要忘记)
- 如果是第一次配置 ILA,Vivado 会提示保存的文件名,建议选择保存到新文件 debug.xdc,防止污染 io.xdc 的内容
- 观察 debug.xdc 的内容,确认出现了自己配置 ILA 的相关信号的名称
- 重新生成 Bitstream
- Program Device 后,即可在打开的 Hardware Manager 中找到 ILA 界面,观察信号的状态
对于 ILA 界面的使用方式,建议阅读 Vivado Design Suite User Guide 第 11 章。
注意时钟
因为逻辑分析仪的原理是用指定的时钟不断地采样 FPGA 内部信号,所以在使用 ILA 采样信号时,被采样的信号与所使用的时钟要对应,因此通常情况下不同的时钟域会使用不同的时钟,也就可能需要创建多个集成逻辑分析仪实例。
在 ILA 中,可以从多个来源选择要采样的信号。通常,Pre-Synthesis
中的结构保留最为完整,而 Post-Fit
中已经是优化后的网表,可能丢失部分信号(或者名称被修改)。
如果 ILA 始终无法找到/采样某些信号,可以考虑将对应信号标记为 dont_touch
以防止 EDA 工具优化。不同语言中用法如下:
(* dont_touch = "true" *) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
signal sig1 : std_logic
attribute dont_touch : string;
attribute dont_touch of sig1 : signal is "true";
....
....
sig1 <= in1 and in2;
out1 <= sig1 and in3;
import chisel3.dontTouch
class MyModule extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val wire = dontTouch(Wire(UInt(8.W)))
wire := io.in
io.out := wire
}
不要滥用
dont_touch
会导致综合器放弃大量优化。如非必要,不要轻易使用。
最后更新:
2024年5月14日
作者: