第四章:综合(Synthesis)原理
综合,说白了就是把你的RTL代码翻译成门级网表。很多新手觉得这步就是点一下按钮的事,其实坑多着呢。我做了十几年FPGA,见过太多综合出问题导致项目延期的案例。今天咱们就好好聊聊综合的那些事儿。
4.1 综合流程
综合的流程,我习惯把它分成三步走:
- 翻译(Translation):把RTL代码读进来,转成中间格式
- 逻辑优化(Logic Optimization):化简冗余逻辑,去掉没用的电路
- 映射(Mapping):把优化后的逻辑映射到目标器件的LUT、FF、DSP等资源上
你想想看,这三步其实跟写文章有点像:先打草稿,再修改润色,最后排版定稿。每一步都有讲究。
核心要点:综合不是简单的"翻译",它包含了大量的优化工作。同样的RTL代码,不同的综合策略可能产生完全不同的结果。
我在项目中遇到过一件事:同一个模块,用Vivado默认设置综合出来用了5000个LUT,我调整了几个综合选项后,直接降到了3200个。差距就是这么大。
4.2 RTL综合选项
综合工具提供了很多选项,但真正常用的也就那么几个。我给大家列一下:
| 选项 | 说明 | 我的建议 |
|---|---|---|
| -keep_hierarchy | 保持层次结构 | 调试时打开,最终关闭 |
| -flatten_hierarchy | 打平层次 | 能优化面积,但不利于调试 |
| -resource_sharing | 资源共享 | 默认打开,省面积 |
| -fsm_extraction | 状态机提取 | 建议用one-hot编码 |
| -retiming | 寄存器重定时 | 时序紧张时打开 |
小技巧:我个人习惯在综合时先打开keep_hierarchy,等功能验证通过后,再关掉它做最终综合。这样既能保证调试方便,又能获得更好的优化效果。
嗯,这里要注意一个坑:资源共享选项虽然能省面积,但有时候会引入额外的MUX延迟。我曾经在一个高速设计中,就是因为开了资源共享,导致关键路径多了一级MUX,时序怎么都过不了。后来关掉这个选项,问题就解决了。
4.3 资源利用率分析
综合完成后,第一件事就是看资源利用率报告。我一般关注这几个指标:
- LUT使用率:别超过80%,留点余量给后期优化
- FF使用率:通常比LUT低,但也要注意
- BRAM使用率:这个很宝贵,省着用
- DSP使用率:乘法器多的设计要特别关注
为什么会这样?因为综合工具在布局布线阶段还会做一些调整,如果资源用得太满,布局布线就很难做,时序也容易出问题。
我记得有一次做视频处理项目,综合报告显示LUT用了78%,我觉得还行。结果布局布线时,工具报错说资源不够。后来一查,原来是某个模块的LUT利用率特别高,导致局部拥塞。从那以后,我不仅看整体利用率,还会看每个模块的利用率分布。
警告:不要只看百分比!一个设计整体LUT用了50%,但某个区域用了95%,照样会出问题。一定要看资源分布的热力图。
4.4 综合后仿真
综合后仿真,很多人觉得没必要。我刚开始做设计时也这么想,直到有一次...嗯,综合后仿真救了我一命。
那次是一个简单的计数器,RTL仿真完全正确。但综合后仿真发现,计数器的输出在时钟沿附近出现了毛刺。查了半天,原来是综合工具把代码中的某个组合逻辑优化掉了,导致时序不匹配。
综合后仿真主要检查这几类问题:
- 门级延迟:RTL仿真不考虑门延迟,综合后会引入
- 竞争冒险:组合逻辑可能产生毛刺
- 复位问题:异步复位的同步化处理是否正确
- 时钟域:跨时钟域同步是否被综合工具正确处理
做综合后仿真时,我一般会这样做:
// 综合后网表仿真脚本示例
// 1. 编译综合后的网表文件
vlog -work work post_synth.v
// 2. 编译器件库文件
vlog -work work simprims_ver.a
// 3. 加载SDF反标文件
vsim -sdftyp /testbench/u_dut=post_synth.sdf work.testbench
// 4. 运行仿真
run -all
经验之谈:综合后仿真跑一遍的时间可能比RTL仿真长10倍以上。我建议只跑关键用例,不用全量回归。另外,SDF反标一定要做,不然仿真结果没有意义。
说到SDF反标,这里有个坑:不同工具生成的SDF格式可能略有差异。我曾经在换工具版本时,SDF反标失败,仿真结果全是X态。排查了半天,才发现是SDF文件中的路径分隔符不一致。
知识体系总览
下面这张图是我自己画的,把综合的核心知识点串起来了:
这张图把综合的三大块——综合选项、资源分析、综合后仿真——都串起来了。你可以看到,它们不是孤立的,而是相互关联的。比如你调整了综合选项,资源利用率就会变;资源利用率变了,综合后仿真的结果也可能不同。
好了,关于综合的原理就聊到这儿。记住一句话:综合不是黑盒子,你得理解它做了什么,才能用好它。下次遇到综合问题,别急着改代码,先看看综合报告,说不定问题就出在选项设置上。
最后提醒:综合报告里的警告信息一定要看!我见过太多人直接忽略警告,结果后面布局布线时才发现问题。综合阶段的每个警告,都可能是后期的一个坑。
可可精品资料库