FPGA中如何使用内嵌逻辑分析仪

在 FPGA 调试中,很多问题无法通过仿真复现,例如时序相关 Bug、跨时钟域问题、上板后异常行为等。这时,内嵌逻辑分析仪(ILA, Integrated Logic Analyzer)是最有效的调试手段之一。

本文简要介绍 FPGA 中 ILA 的使用方法和工程要点。FPGA的开发流程采用Synplify+Vivado流程实现。

什么是 ILA?

ILA 是集成在 FPGA 内部的逻辑分析仪,能够:

  • 真实运行环境下采样内部信号
  • 通过 JTAG 将采样数据回传到 PC

ILA 的基本组成

一个典型 ILA 包含:

  • 采样时钟(clk)— 时钟信号应尽量采用芯片内部持续存在的时钟,这样可以确保 ILA能够正确的运行,否则可能出现时钟过慢点错误提示
  • Probe 信号(probe0…probeN)— 每一组Probe信号可以单独配置采样和触发逻辑,支持总线方式的显示,这个可以根据实际情况来配置。
  • 触发逻辑 — 一般来讲简单的触发就可以满足大部分的调试场景。
  • 片内 BRAM 存储波形数据 — 这个主要取决于配置中要配置的采样长度,ILA其实也支持灵活的多段采集,这个可以根据实际应用需要进行配置。

ILA IP选择

ILA IP配置

ILA Probe配置

ILA生成文件

对于我的开发工作流来讲,对于ILA生成的文件主要有如下一些内容:

ILA IP 重要输出文件

ILA集成到RTL中进行信号观测

生成好ILA IP之后我们就可以在我们的设计中加入生成好的IP,告诉工具采集哪些信号,这个过程可以直接在RTL中对生成好的IP进行例化,一个简单的例子如下:

(* syn_noprune = 1 *)
(* syn_preserve = 1 *)
ila_touch ila_dbg(
        .clk(fpga_root_clk),
        .probe0(reset),
        .probe1(gobal_reset),
        .probe2(select),
        .probe3(sclk),
        .probe4(swdi),
        .probe5(swdo),
        .probe6(module_reset),
        .probe7(per_clk),
        .probe8(per_clk_en),
        .probe9(chip_data_out),
        .probe10(debugA),
        .probe11(debugB)
);

上面就是一个典型的例化例子,我们只需要将对应的时钟和需要观测的信号连接到这个IP就可以了,另外例化开头的(* syn_noprune = 1 *)(* syn_preserve = 1 *)是必须的,这样可以避免ILA的IP被Synplify工具优化掉。

综合的工程源文件应该加入对应的Stub.v

add_file -verilog "$PRJ_ROOT/rtl/ila_touch_stub.v"

Vivado PR工程加入DCP

在PR阶段,我们通过Stub.v告诉综合工具对应的ILA 是一个黑盒,但是到了Vivado的PR阶段,我们必须要将对应的ILA IP加入工程来让Vivado知道如何链接对应的IP,这个可以通过在Vivado脚本中增加如下的内容来实现:

#### read dcp files #############
add_files -norecurse "ila_touch.dcp"

注意dcp会有版本问题,高版本vivado生成的dcp文件在低版本是无法直接使用的,应该尽量保持版本一致。

开启调试文件生成

write_debug_probe -force ${DesignName}.ltx

调试文件是用来在vivado lab中调试使用的,可以显示用户友好的信号名(PR后的信号名),虽然会包含一定的后缀,但是基本是可读的。

Vivado Lab配置注意事项

生成好对应的bit和ltx文件后,在Vivado Lab中也可以看到ILA,但是触发之后发现无法正常采样,这个可能是JTAG速率配置的问题,这个地方我卡了很久才发现这个坑。

手动连接Target并选择JTAG的速度, 重要‼️

ILA的使用

经过如上的配置 ILA应该就可以正常使用了。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论