Synopsys Design Compiler中面积与时序的平衡约束策略
扫描二维码
随时随地手机看文章
在数字IC综合流程中,面积(Area)与时序(Timing)是一对永恒的“跷跷板”。Synopsys Design Compiler(DC)作为业界标准的逻辑综合工具,其优化质量直接取决于约束策略。本文将避开繁琐的理论,直击DC约束文件中“面积与时序”的实战平衡技巧。
一、约束优先级:时序第一,面积第二
在DC的优化算法中,时序收敛是面积优化的前提。如果建立时间(Setup Time)存在严重违例,工具会疯狂插入缓冲器(Buffer)和增大驱动(Upsize),导致面积爆炸。因此,约束策略必须遵循“先时序,后面积”的黄金法则。
1. 初始综合:不设面积限制
在项目初期,不要过早使用set_max_area,以免工具为了满足不切实际的面积极限而牺牲时序。
# 阶段1:仅约束时序,放开面积
create_clock -period 10 -name clk [get_ports clk]
set_max_area 0 # 0表示无面积限制
compile_ultra
set ref_area [get_attribute [current_design] area]
首次编译后,使用get_attribute获取当前设计的面积参考值ref_area。这个值将作为后续设置合理面积目标的基准。
2. 渐进式面积约束
不要一次性将面积目标设为ref_area的70%。建议采用渐进式收紧策略,每次迭代收紧5%-10%。
# 阶段2:渐进式面积优化(假设目标为初始面积的90%)
set target_area [expr $ref_area * 0.9]
set_max_area $target_area
compile_ultra -inc
如果此阶段时序违例(WNS为负),说明面积目标过于激进,需要回调。DC的set_max_area是一个“软约束”,工具会尽力逼近,但不会为了面积而让时序完全崩盘。
二、精细化路径管理:group_path与critical_range
默认情况下,DC会优先优化最差的那条关键路径(WNS最差)。但这可能导致其他“次关键路径”被忽略,或者非关键路径被过度优化而浪费面积。使用group_path和critical_range可以实现精细化平衡。
1. 路径分组(group_path)
将不同时钟域或功能模块的路径分组,可以避免工具为了优化一条全局路径而牺牲其他模块的性能。
# 将DDR接口路径单独分组,赋予更高权重
group_path -name DDR_PATHS -from [get_ports ddr_*] -weight 2.0
-weight参数告诉DC,该组路径的优化优先级是默认路径的2倍。这样,工具会优先保证DDR接口的时序,即使这意味着要稍微牺牲一点其他低速路径的面积。
2. 关键范围(critical_range)
critical_range定义了“需要被优化”的路径范围。它防止DC只盯着最差的一条路,而是优化所有接近违例的路径。
# 设置关键范围为0.5ns
set_critical_range 0.5 [current_design]
这意味着,所有时序裕量(Slack)小于0.5ns的路径都会被DC视为“关键路径”并进行优化。这能有效防止“头痛医头,脚痛医脚”的局部优化现象,避免在一条路径上过度插入Buffer而忽略全局面积。
三、编译策略:从Timing High Effort到Area High Effort
DC的compile_ultra命令提供了不同的优化脚本,这是平衡PPA(Performance, Power, Area)最直接的手段。
1. 时序优先模式
当时序违例较大时(WNS < -0.5ns),使用高努力时序优化脚本。
# 激进时序优化,暂不考虑面积
compile_ultra -timing_high_effort_script -no_autoungroup
此模式会启用逻辑复制(Logic Duplication)、寄存器重定时(Retiming)等技术,可能会增加面积,但能有效改善时序。
2. 面积回收模式
当时序基本收敛(WNS > -0.1ns)后,切换到面积优化模式。
# 在满足时序的前提下,回收面积
compile_ultra -area_high_effort_script -no_autoungroup
此模式会尝试使用更小的驱动单元、合并冗余逻辑、启用资源共享(Resource Sharing),在保持时序的前提下“挤水分”。
四、RTL级与物理级协同策略
1. RTL级:资源共享(Resource Sharing)
在RTL设计中,显式地编写资源共享代码(如使用if-else而不是多个assign),DC在综合时更容易识别并生成面积友好的结构。
// 面积友好型写法:资源共享
always @(*) begin
if (sel)
out = a + b;
else
out = c + d;
end
// 而不是两个独立的加法器
DC的set_resource_allocation area_only命令可以强制工具在架构探索阶段优先考虑面积。
2. 物理感知:线载模型(Wire Load Model)
在非物理综合(Non-Physical)流程中,线载模型的选择直接影响面积预估。过于悲观的模型会导致DC过度插入Buffer。
# 根据设计规模选择匹配的线载模型
set_wire_load_model -name "tsmc18_wl10" # 适用于中小规模设计
如果设计后期在布局布线(P&R)阶段发现面积膨胀,很可能是综合时的线载模型与实际布线后的RC参数偏差过大。此时应考虑切换到拓扑模式(Topographical Mode)进行物理感知综合。
五、实战TCL脚本:迭代优化流程
以下是一个完整的迭代优化脚本框架,用于在时序与面积之间寻找平衡点。
# 步骤1:初始编译(无面积约束)
reset_design
read_verilog top.v
create_clock -period 10 clk
compile_ultra
set ref_area [get_attribute [current_design] area]
# 步骤2:时序收敛检查
set wns [get_attribute [get_timing_paths] slack]
if {$wns < 0} {
# 时序违例,优先修时序
compile_ultra -timing_high_effort_script
}
# 步骤3:面积优化(目标为初始的85%)
set_max_area [expr $ref_area * 0.85]
compile_ultra -area_high_effort_script -inc
# 步骤4:最终检查
report_timing -max_paths 10 > timing.rpt
report_area -hierarchy > area.rpt
该流程确保了“先保时序,再抠面积”的稳健策略。
六、结语
在Design Compiler中,面积是“省”出来的,而不是“压”出来的。强行设置过小的set_max_area只会导致时序无法收敛。最有效的策略是:利用group_path和critical_range引导优化方向,通过-timing_high_effort_script实现时序收敛,最后使用-area_high_effort_script进行面积回收。记住,约束文件的本质是告诉DC“哪里重要,哪里可以妥协”,一个好的约束策略是PPA平衡的艺术。





