4、逻辑综合与STA入门:DC/Genus综合流程、综合策略、面积与速度权衡、综合后STA检查

好,咱们进入第四讲。逻辑综合,说白了就是把咱们写的RTL代码,翻译成门级网表。这一步是衔接前端设计和后端物理实现的桥梁。我个人习惯把综合叫做“从理想走进现实的第一步”——你写的always块、assign语句,到了这一步,全都要变成具体的标准单元。

4.1 DC与Genus综合流程

目前主流的两大综合工具,就是Synopsys的Design Compiler(DC)和Cadence的Genus。我用DC比较多,但Genus这几年也追得很紧。流程上其实大同小异,核心就三步:读入、约束、编译。

先说说DC的典型流程:

# 设置库路径
set target_library “typical.db”
set link_library “* typical.db”
set symbol_library “generic.sdb”

# 读入RTL
analyze -format verilog {top.v sub.v}
elaborate top

# 施加约束
create_clock -period 10 [get_ports clk]
set_input_delay 2 -clock clk [get_ports data_in]
set_output_delay 3 -clock clk [get_ports data_out]

# 编译
compile_ultra -gate_clock -no_autoungroup

Genus的流程也类似,只是命令换成了read_hdl、elaborate、syn_generic、syn_map、syn_opt这些。嗯,这里要注意,Genus把综合分得更细,你可以分阶段看面积和时序的变化。

我在项目中遇到过一个问题:用DC综合时,如果RTL里写了复杂的for循环,综合器可能会展开成巨大的组合逻辑。有一次一个32位的循环展开,直接让面积爆了3倍。后来我改成用generate for,才把面积压下来。所以,写RTL的时候就要想着综合器会怎么理解你的代码。

4.2 综合策略:面积与速度的权衡

综合策略,说白了就是你在面积和速度之间怎么选。没有免费的午餐,你要跑得快,就得付出面积的代价。

常见的策略有几种:

  • 时序优先(Timing First):先满足setup/hold,再考虑面积。适合高频设计。
  • 面积优先(Area First):尽量用最小的面积实现功能。适合成本敏感的低速设计。
  • 平衡策略(Balanced):在时序和面积之间取折中。这是大多数项目的默认选项。

我个人习惯在综合初期先用balanced策略跑一版,看看时序余量。如果setup slack是负的,再切到timing first,同时加上compile_ultra的retime选项。你想想看,retime其实就是把组合逻辑在寄存器之间重新分配,有时候能救回不少时序。

这里有个表格,是我总结的不同策略下的典型结果:

策略 面积(um²) 最大频率(MHz) 功耗(mW)
面积优先 12000 200 15
平衡策略 15000 250 20
时序优先 18000 300 28

你看,从面积优先到时序优先,面积涨了50%,但频率也涨了50%。怎么选?看你的项目需求。如果是手机芯片,功耗和面积都敏感,那就得仔细权衡了。

小技巧:在DC里可以用set_max_area 0来让工具在满足时序的前提下尽量优化面积。但别指望它能给你最优解,有时候需要手动调整代码结构。

4.3 综合后STA检查

综合做完,网表出来了,但能不能用?得做STA(静态时序分析)检查。这一步很多人会跳过,觉得综合工具已经报过时序了。其实不然,综合工具用的模型和STA工具(比如PrimeTime)是有差异的。

综合后STA检查的核心就是:用PrimeTime或Tempus重新读入网表,加上同样的约束,看看setup和hold是否满足。

为什么要做?我曾经吃过一次亏。综合时DC报setup slack是正的,结果到了PrimeTime里一跑,发现有一条路径slack是负的。查了半天,原来是DC里用的wire load model太乐观了,实际布线后的RC延迟比模型预估的大。从那以后,我每次综合完都会用PrimeTime再跑一遍STA,哪怕只是粗略检查。

STA检查的典型命令:

read_verilog top_syn.v
read_parasitics top_spef.gz
read_sdc top.sdc
update_timing
report_timing -nworst 10 -max_paths 100
report_constraint -all_violators

重点关注几个指标:

  • setup slack:必须为正,最好留10%的余量。
  • hold slack:必须为正,hold violation在综合阶段很少见,但也要检查。
  • transition time:不能超过库规定的上限,否则信号质量差。
  • capacitance:负载电容不能超标,否则驱动能力不够。

避坑指南:我曾经遇到过一个案例,综合后STA检查全部通过,但到了后端布局布线后,setup却崩了。原因是综合时用的时钟树模型是理想的,没有考虑时钟偏斜。所以,综合后的STA只能作为“初步检查”,不能替代后仿和后端STA。

最后说一句,综合后的STA报告,我建议你养成存档的习惯。每次综合完,把timing report、area report、power report都保存下来,标注好版本和日期。这样出了问题,可以快速回溯是哪一版综合引入的。

好了,这一讲就到这里。逻辑综合是门手艺活,多跑几次,多看看报告,慢慢就有感觉了。下一讲咱们聊聊时钟树综合,那可是后端设计的重头戏。