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约束文件。然后你需要:
- 在工程里添加这个.v文件
- 重新运行综合和布局布线
- 下载bitstream到FPGA
这里有个细节:Reveal生成的.v文件不要手动修改。我刚开始不懂,想改个信号名字,结果编译报了一堆错。后来才知道,Reveal的网表是自动生成的,改了也没用,下次重新生成又会覆盖。
4.6 知识体系总览
下面这张图是我自己总结的Reveal Inserter工作流程,你可以对照着看:
4.7 避坑指南
最后,分享几个我踩过的坑:
- 信号名被优化掉了 — 有些内部信号在综合时会被优化,Reveal里找不到。解决办法是在RTL里加
/* synthesis keep */属性。 - 采样深度不够 — 我建议先设一个较小的深度试抓一次,确认触发条件正确后,再加大深度。
- 触发条件太复杂 — 有时候想一次抓到所有问题,结果触发条件设了一大堆,反而抓不到。我的经验是:一次只抓一个问题。
好了,Reveal Inserter的基础操作就这些。说白了,它就是帮你把FPGA内部的黑盒子变成透明的。多练几次,你就能熟练掌握了。
公众号:蓝海资料掘金营,微信deep3321