4、Reveal Inserter基础:在Diamond中插入Reveal模块、配置触发条件、选择采样信号

各位工程师朋友,今天我们来聊聊Reveal Inserter。说实话,这个工具是我在Lattice开发中用的最多的调试手段。没有它,很多内部信号就像黑盒子一样,你根本不知道FPGA里面到底发生了什么。

Reveal Inserter,说白了就是Lattice Diamond里自带的逻辑分析仪IP核。你不需要外接昂贵的硬件分析仪,直接在工程里插入一个调试模块,就能抓取内部信号。我刚开始用的时候也觉得有点玄乎,但用顺手之后,真香。

核心要点:Reveal Inserter 是在综合之后、布局布线之前插入的。它不修改你的RTL代码,而是通过网表级操作来添加调试逻辑。

4.1 插入Reveal模块的两种方式

我个人习惯用第一种方式,因为更直观。但两种都可以,看你的喜好。

  • 方式一:通过Diamond工具栏 — 点击 Tools → Reveal Inserter,直接打开插入向导。
  • 方式二:通过Reveal标签页 — 在Diamond左侧的Process视图中,找到Reveal Inserter,双击即可启动。

打开之后,你会看到一个向导界面。嗯,这里要注意:必须先完成综合,否则Reveal Inserter是灰色的,点不了。我遇到过好几次这种情况,综合没跑完就急着点,结果啥反应没有。

4.2 配置触发条件

触发条件,说白了就是告诉Reveal什么时候开始抓数据。你想想看,FPGA内部信号那么多,总不能一直抓吧?那样存储深度根本不够。

Reveal支持多种触发方式,我常用的有这几种:

触发类型 说明 适用场景
Basic Trigger 简单电平或边沿触发 调试单个信号跳变
Advanced Trigger 多信号组合条件 复杂状态机调试
Sequence Trigger 多级时序触发 总线协议分析

配置触发条件时,我建议你先想清楚:我要抓什么事件? 比如你想看一个计数器溢出时的波形,那就把计数器的最高位作为触发信号,设置为上升沿触发。

小技巧:我曾经调试一个SPI接口,信号总是对不上。后来用了Sequence Trigger,先等CS拉低,再等SCK的第一个上升沿,最后等MISO的数据变化。三级触发一设,问题立马现形。

4.3 选择采样信号

这一步很关键。Reveal能采多少信号,取决于你分配的存储资源和时钟频率。说白了,采样深度和信号数量是互相制约的

在Reveal Inserter里,你会看到一个信号选择列表。左侧是工程里所有的内部信号,右侧是你选中的待采样信号。我一般这样选:

  • 优先选关键控制信号 — 比如状态机的state、使能信号、复位信号
  • 数据信号按需选 — 不要一股脑全选,否则存储深度不够
  • 时钟信号必须选 — 没有时钟,你看到的波形就是乱的

举个例子,我之前调试一个DDR控制器,信号有上百个。但我只选了地址、命令、数据有效、状态机状态这几个关键信号。结果一次抓取就定位到了问题——原来是状态机在某个条件下跳错了。

注意:Reveal会占用FPGA内部的Block RAM作为存储。你选的信号越多、采样深度越大,占用的BRAM就越多。如果BRAM不够,布局布线会报错。我建议你先看下芯片的BRAM资源,再决定采样深度。

4.4 时钟域与采样时钟

Reveal需要一个采样时钟。这个时钟可以是你的系统时钟,也可以是独立的调试时钟。我个人习惯用系统时钟,因为这样采到的信号和实际运行时序一致。

但有一个坑:跨时钟域的信号。如果你的设计里有多个时钟域,Reveal只能用一个时钟来采样。跨时钟域的信号可能会出现亚稳态,导致采样数据错误。我曾经在这个问题上栽过跟头,后来学乖了——跨时钟域信号先做同步处理,再送给Reveal。

4.5 生成并集成Reveal模块

配置完成后,点击Generate,Reveal会生成一个.v文件和一个.ldc约束文件。然后你需要:

  1. 在工程里添加这个.v文件
  2. 重新运行综合和布局布线
  3. 下载bitstream到FPGA

这里有个细节:Reveal生成的.v文件不要手动修改。我刚开始不懂,想改个信号名字,结果编译报了一堆错。后来才知道,Reveal的网表是自动生成的,改了也没用,下次重新生成又会覆盖。

4.6 知识体系总览

下面这张图是我自己总结的Reveal Inserter工作流程,你可以对照着看:

Reveal Inserter 工作流程 1. 完成综合 确保网表已生成 2. 打开Inserter Tools → Reveal Inserter 3. 配置触发条件 Basic / Advanced / Sequence 4. 选择采样信号 关键信号优先,注意BRAM 5. 设置采样时钟 建议用系统时钟 6. 生成并集成 添加.v文件,重新编译 7. 下载并调试 打开Reveal Analyzer查看波形 注意:步骤3-5可以反复调整,直到满足调试需求

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 信号名被优化掉了 — 有些内部信号在综合时会被优化,Reveal里找不到。解决办法是在RTL里加 /* synthesis keep */ 属性。
  • 采样深度不够 — 我建议先设一个较小的深度试抓一次,确认触发条件正确后,再加大深度。
  • 触发条件太复杂 — 有时候想一次抓到所有问题,结果触发条件设了一大堆,反而抓不到。我的经验是:一次只抓一个问题

好了,Reveal Inserter的基础操作就这些。说白了,它就是帮你把FPGA内部的黑盒子变成透明的。多练几次,你就能熟练掌握了。


公众号:蓝海资料掘金营,微信deep3321