4. 综合与交付准备
RTL代码通过仿真验证之后,下一步就是把它“翻译”成由标准单元和宏单元构成的门级网表,并给出对应的时序约束与初步的时序、面积评估。这一步通常称为逻辑综合(Synthesis),在Cadence流程中对应的主力工具是Genus。综合是RTL到物理实现之间的桥梁:它决定了后续布局布线(P&R)拿到的输入质量,也直接影响最终芯片能否收敛到目标频率和面积。本节围绕Genus综合的实际操作展开,讲清楚输入准备、约束编写、综合执行以及交付物检查这几个关键环节。
综合在交付流程中的位置
综合的输入是RTL源码、工艺库(.lib)、以及描述设计意图的约束文件;输出是门级网表(.v)、标准延时格式约束(.sdc)和若干报告。这些输出会作为物理实现的起点。需要特别注意的是,综合阶段使用的工艺库通常是“无物理信息的时序库”,而P&R阶段会换成带物理信息的库,因此综合得到的面积和时序只是初步估计,不能当作最终签核结果。理解这一点,才能正确看待综合报告中的数字。
输入准备:RTL、库与约束
在启动Genus之前,需要确认三类输入齐备。第一是RTL源码,要求已经通过lint检查、无未连接端口、无锁存器意外推断。第二是工艺库,通常由代工厂提供,包含标准单元、IO、存储器等不同类别的.lib文件,需要根据目标工艺角(如tt、ss、ff)选择。第三是约束文件,这是综合质量的关键,也是最容易出问题的地方。
约束文件的核心是时钟定义。以一个示例设计为例,假设系统时钟为200MHz,即周期5ns,时钟端口为clk,占空比50%,则SDC中应写:
create_clock -name clk -period 5.0 -waveform {0 2.5} [get_ports clk]
set_clock_uncertainty 0.15 [get_clocks clk]
set_clock_transition 0.10 [get_clocks clk]
set_input_delay -clock clk 1.2 [remove_from_collection [all_inputs] [get_ports clk]]
set_output_delay -clock clk 1.5 [all_outputs]
set_load 0.05 [all_outputs]
这里set_clock_uncertainty用于预留时钟抖动和偏斜余量,set_input_delay和set_output_delay描述外部逻辑对输入输出的时序要求,set_load给出输出端负载。这些数值需要与系统架构师确认,不能随意填写。如果输入延迟设得过松,综合会认为路径容易满足,实际流片时却可能失败;设得过紧,则会浪费面积和功耗。
Genus综合执行流程
Genus的典型执行方式是通过Tcl脚本驱动。一个最小可用的综合脚本大致如下:
set_db init_lib_search_path ./libs
set_db library {slow.lib fast.lib}
set_db hdl_search_path ./rtl
read_hdl -sv {top.v sub.v}
elaborate top
read_sdc ./constraints/top.sdc
syn_generic
syn_map
syn_opt
write_hdl > ./output/top_netlist.v
write_sdc > ./output/top.sdc
report_area > ./output/area.rpt
report_timing -max_paths 10 > ./output/timing.rpt
report_power > ./output/power.rpt
其中elaborate完成RTL的语法解析和初步展开,syn_generic做与工艺无关的逻辑优化,syn_map将逻辑映射到具体标准单元,syn_opt在映射后继续做时序和面积优化。每一步都会产生中间结果,如果某一步报错,需要根据日志定位是RTL问题、约束问题还是库问题。
结果检查与交付判断
综合完成后,不能只看“没有报错”就认为通过。需要重点检查三类报告。面积报告给出单元总面积、组合逻辑面积、时序逻辑面积以及各类单元的数量,可以与架构预估做对比,偏差过大说明RTL结构或约束可能有问题。时序报告关注WNS(最差负裕量)和TNS(总负裕量),如果WNS为负,说明存在不满足的路径,需要回到RTL或约束调整。功耗报告给出动态功耗和漏电功耗的初步估计,用于判断是否在预算范围内。
交付给物理实现的网表需要满足几个条件:网表可读、无未解析的模块、SDC约束完整且与网表端口一致、面积和时序在可接受范围内。如果综合阶段就出现较大的负裕量,P&R阶段很难凭空修复,因此综合报告是判断设计是否具备进入物理实现条件的第一道关口。
总结来说,Genus综合的核心任务是把RTL、库和约束三者结合,产出一份可供物理实现使用的门级网表和配套约束,同时给出面积、时序、功耗的初步评估。输入准备的完整性、约束编写的合理性、以及结果检查的严格程度,共同决定了这份交付输入的质量。