ASIC逻辑综合流程
前言
一个芯片从立项到Tape Out是包含了大量的环节,本文只分享使用DC(Design Compiler)工具将RTL代码转换为综合网表的输出过程,DFT网表、PR网表和GDSII相关流程暂不涉及。
逻辑综合(Locig Synthesis)是ASIC设计流程中将RTL代码(寄存器传输级描述)转换为特定工艺库下的门级网表的核心步骤。其主要流程可以概括为以下几个关键阶段:
一、 准备阶段
- RTL 设计文件
使用硬件描述语言编写的设计代码(Verilog, VHDL, SystemVerilog)。代码必须是可综合的。不可综合的代码可能有:
- 除法器(可能需要使用DesignWare单独综合出除法器网表再替代原来的除法器逻辑)
- 循环分支不全导致的latch等
其他不可综合代码可参考:https://www.runoob.com/w3cnote/verilog2-integrated-design.html
- 工艺库:
- Synoysps基本库:dw_foundation.sldb(包含Synopsys封装好的加减乘除法逻辑,以及需要授权的性能更好的算术逻辑)、gtech.db(用于映射gtech 网表)
- 目标标准单元库: 包含目标工艺下的基本逻辑门(AND, OR, NOT, Flip-Flop等)、复杂单元(加法器、选择器、缓冲器等)的物理、时序、功耗、面积信息(.lib, .db 文件)。同时根据design不同,可以选择不同VT、不同Track、不同Channel的标准单元库,专门优化功耗、面积或性能等指标。
- 目标IP库: 可用的硬宏,如RAM, ROM, PLL, SerDes、DDR_PHY、PCIE_PHY等(.lib,.db文件)。
- 其他库: I/O库、特殊单元库(LevelShift电平转换器、Isolation隔离单元、去毛刺单元等)。同样为.lib,.db文件。
- dont_use设置:
在ASIC设计过程中,需要根据使用的工艺库中相关cell的物理性能(面积、功耗、延迟)选择使用或不使用部分cell参与综合或PR流程。将不使用的cell放入dont_use脚本中,被DC工具识别。常用的评估工艺库的工具有:华大九天的Qualib,其他各大主流EDA厂商都有类似的工具。
- 时序约束:
定义设计的时序要求。 通常使用SDC格式。
时钟定义(
create_clock
):时钟源、周期、占空比、不确定性(set_clock_uncertainty
)。输入/输出延迟(
set_input_delay
,set_output_delay
):定义信号相对于时钟在端口处的到达/输出时间要求。时序例外(
set_false_path
,set_multicycle_path
):标识不需要满足正常时序要求的路径(如复位路径、跨时钟域路径)或需要多个时钟周期的路径。最大/最小延迟(
set_max_delay
,set_min_delay
):对特定路径施加绝对延迟约束。最大转换时间(
set_max_transition
):限制信号跳变的快慢(影响驱动能力和负载)。最大电容(
set_max_capacitance
):限制单元的负载电容。设计规则约束: 通常由工艺库隐含定义,但有时需要显式指定(如最大扇出
set_max_fanout
)。环境约束: 设置综合过约比例、工作条件(温度、电压 -
set_operating_conditions
)、线负载模型(set_wire_load_model
,set_wire_load_mode
,在现代流程中逐渐被物理综合取代,针对40nm以下的工艺节点常用物理综合流程更好的减小与后端布局布线工具的gap)。面积约束: 设定面积目标(
set_max_area
)。功耗约束: 设定功耗目标(
set_max_dynamic_power
,set_max_leakage_power
),通常需要结合电源网络信息(CPF/UPF)。
- 综合策略:
- Multibit策略:将2个或多个寄存器合并为一个多bit寄存器,用于节省面积和降低功耗的目的,但是实际使用情况根据模块本身特性使用;
- SAIF策略:带入saif文件进行综合,可以更好的优化功耗;
- DCG_NXT:代入def的物理综合,在综合过程中可以考虑硬核的floorplan位置,减小与后端优化的gap。
- 低功耗综合:插入ICG;带UPF综合等;
- VT优化:限制部分逻辑使用不同VT cell的比例,通过调整cell优化Design的功耗。
- 权重设置:通过给不同的路径或逻辑设置权重可以让工具针对的优化timing。
- 其他包含工具命令序列的脚本文件,指导整个综合过程(如启动命令、读入文件、设置参数、执行优化、输出结果)。
二、 综合执行与优化阶段
- 输入件:
- analyze + elaborate 读取并解析RTL设计文件,并进行语法检查和基本语义检查(如模块实例化、端口连接);
- 设置link library和target library确保需要的std cell、ip、io、memory等db文件均符合预期。
- link:
- 解析设计中的所有模块引用,确保所有子模块的定义都被找到(在RTL或库中)。
- 读入约束:
读取并应用时序约束。
设置综合策略。
- compile:
综合的核心步骤,主要包括map和optimize两个步骤。
map: 将link后的gtech网表映射到目标工艺库中的具体物理单元。
optimize:
结构优化: 高层次优化,如资源共享(共享加法器、复用器)、常量传播、死代码消除、有限状态机优化(状态编码、状态最小化)。
时序驱动优化:
路径分析: 工具基于约束、库时序模型和线负载模型(或初步的物理信息)估算路径延迟。
关键路径识别: 关注不同时钟组下的所有时序路径,找出违反时序约束(综合阶段主要关注setup time)的路径并按照violation大小逐步优化。
优化动作:
- 尺寸调整: 增大驱动单元的尺寸(驱动能力更强,减少延迟),或减小非关键路径单元的尺寸(节省面积功耗)。
- 缓冲器插入: 在长连线上或高扇出网络上插入缓冲器,减少转换时间、改善信号完整性、修复保持时间违例。
- 逻辑重组: 改变逻辑结构(如调整与/或树的平衡、复制高扇出逻辑)以减少关键路径上的逻辑级数或负载。
- 门控时钟转换: 如果RTL中使用使能信号控制寄存器,工具可能将其转换为库中特定的时钟门控单元以节省动态功耗。
面积优化: 在满足时序约束的前提下,尝试合并逻辑、移除冗余逻辑、使用面积更小的单元。
功耗优化: 在满足时序约束的前提下,采用低功耗单元、优化时钟树(门控时钟)、优化信号活动性、降低电压(如果支持多电压域)。
compile阶段工具会不断分析时序、面积、功耗报告,调整优化策略,重新映射和优化,直到达到约束目标或无法进一步优化。
三、 综合后分析与输出阶段
- 检查log
务必先检查综合log中的所有Error,这些Error往往导致综合中断或结果异常;
检查Warning,将所有Warning分类,不求消除所有Waring,但在signoff前要保证所有Waring均可解释,可waive。
- 生成报告:
- 时序报告: 详细列出所有路径的时序(建立时间、保持时间)、裕量、关键路径、违例路径(
report_timing
)。 - 面积报告: 报告设计的总面积、各模块/层次所占面积、不同单元类型的面积分布(
report_area
)。 - 功耗报告: 估算动态功耗和静态功耗(通常基于开关活动因子SAIF/VCD文件或默认/统计活动率)(
report_power
)。 - 约束报告: 检查约束是否被正确理解和应用,尤其关注是否存在unconstraint的逻辑,如果有需要检查时钟定义或相关约束(
check_timing
)。 - 设计规则检查报告: 检查最大转换时间、最大电容、最大扇出等约束是否满足(
check_design
)。
- 分析结果:
- 仔细审查所有报告,特别是时序报告(setup违例在综合阶段由于设置过约,往往不要求全部fix,但要符合预期,明显异常需反馈前端迭代。hold不修,交给PD处理)、面积报告和check_design报告。
- 如果存在违例或不满足目标,需要:
- 检查约束是否合理、完整、正确,不求所有时钟全部定义,但要让C工具尽可能的优化到位。
- 检查RTL代码是否存在可优化之处(如低效结构、高扇出寄存器)。
- 调整综合策略和参数(如增加优化权重、放松非关键路径约束)。
- 物理综合阶段反复迭代floorplan。
- 输出件交付:
- 门级网表: 综合后的最终输出,通常是Verilog或VHDL格式,描述设计由哪些具体工艺库单元(实例)及其连接关系构成,需交付给DFT和PD同事。
- 交付dont_touch list,不需要PD同事优化的cell要通过dont_touch list传递给PD同事。
- 交付 Func SDC,该SDC一般通过PT输出,初期PT输出的SDC与DC输出的SDC相差不大,但PT不包含时钟的过约,该SDC交给PD同事用于进一步优化综合网表。
- 相关报告: 综合过程中的所有报告。
四、 后续步骤(严格来说不属于综合本身,但紧密相关)
- 形式验证:
使用形式验证工具(如Conformal LEC, Formality)将综合后的门级网表与原始RTL设计进行等价性检查,确保综合过程没有引入功能错误。
- 静态时序分析:
使用专门的STA工具(如PrimeTime)对综合后的网表和SDF进行更精确、更全面的时序分析,独立验证综合结果是否满足时序约束。STA通常比综合工具内部的时序引擎更强大、更准确(尤其是在处理复杂时序场景和串扰时)。
关键注意事项
- 约束的质量决定综合结果的质量: “垃圾进,垃圾出”。不准确或不完整的约束会导致综合结果无法满足实际需求或过度设计。
- RTL代码风格影响综合结果: 可综合的、结构清晰的、避免异步逻辑的RTL代码更容易获得好的综合结果。
- 迭代过程: 综合很少一次成功,通常需要根据报告结果调整约束、RTL或综合策略,进行多次迭代。
- 物理意识: 现代先进工艺下,线延迟占比很大。纯粹的“逻辑综合”逐渐被“物理综合”取代,后者在综合阶段就考虑初步的布局信息(如使用物理指导信息),以获得更精确的时序估算和更好的优化结果。
- 功耗意识: 低功耗设计技术(如多电压域、电源门控)需要在综合阶段甚至RTL阶段就开始考虑,并体现在约束中。
综合的过程通常是迭代的。初期的约束和综合策略往往不清晰,不同类型的模块都有不同的优化方向和约束要求,也往往和floorplan的形状密切相关,所以不存在通用的优化方案,经过反复迭代才能得到PPA最好的结果。
理解并掌握逻辑综合的流程和关键点,对于设计出满足性能、面积和功耗目标的ASIC至关重要。对于BES工程师而言,逻辑综合只是第一步,但是综合网表的作为物理设计的输入件,其质量(PPA)的好坏直接影响了物理实现的难度,好的设计往往需要对前后端各个环节都熟悉,也需要前后端同事积极配合。
希望这个逻辑综合流程说明对您有帮助!