4. PPA目标定义与约束建模
PPA协同优化的第一步不是打开工具跑流程,而是把“目标”翻译成工具能读懂的约束语言。先进节点下,同一个RTL会因工作模式、电压域、工艺角不同而呈现完全不同的时序与功耗画像,因此约束建模的核心任务是:用SDC描述时序意图,用UPF描述电源意图,用MMMC把两者按模式与角组合成可独立签核的分析视图,再叠加面积与功耗目标,最后用优先级规则解决约束冲突。
SDC:把时序目标写成可检查的断言
SDC不是“补几条create_clock”,而是对设计时序行为的完整声明。一个可签核的SDC至少覆盖四类信息:时钟定义、I/O时序、时序例外、设计规则。以一颗运行在800MHz的SoC为例,主时钟周期1.25ns,若时钟树目标偏斜为周期的5%,则set_clock_uncertainty 0.0625 [get_clocks clk_core];同时用set_clock_latency -source 0.3描述PLL到时钟根节点的源延迟。I/O侧必须显式给出set_input_delay/set_output_delay及其相对时钟,否则综合工具会按理想情况优化,导致后端接口路径无法收敛。
时序例外是约束建模中最容易出错的部分。false path用于声明功能上不可能同时激活的路径,例如扫描链在功能模式下的跨时钟域路径;multicycle path用于声明需要多个周期才能完成的路径,例如除法器或慢速外设接口。关键原则是:例外必须“窄而准”,用-from/-to/-through精确限定对象,禁止用set_false_path -from [all_clocks]这类全局豁免,否则会把真实违例一起掩盖。建议在SDC中为每条例外添加注释,说明其功能依据和验证来源。
UPF:电源意图决定优化边界
UPF描述的是“电从哪来、什么时候开、关的时候信号怎么办”。先进节点普遍采用多电压域设计,UPF需要定义电源域、电源开关、隔离单元、电平转换器和保持寄存器。以一颗含CPU域(0.8V)和Always-On域(1.0V)的芯片为例,CPU域可关断,则跨域信号在关断时必须被隔离,否则浮空信号会穿透到常开域造成漏电甚至功能错误。UPF中需用set_isolation指定隔离策略(如钳位到0或1)、隔离位置(源域或目的域)以及隔离使能信号;用set_level_shifter处理0.8V与1.0V之间的电平不匹配;用set_retention声明需要保持状态的寄存器。
UPF与SDC必须协同:关断域内的路径在关断模式下不应被时序分析,但隔离单元和电平转换器本身又必须满足时序。因此UPF中的电源状态需要映射到MMMC的场景中,否则会出现“功能模式下时序收敛、关断模式下隔离单元建立时间违例”的漏检。
MMMC:把模式与角组合成分析视图
MMMC由三要素构成:模式(mode)、角(corner)和视图(view)。模式描述功能场景,如功能模式、扫描测试模式、低功耗关断模式;角描述工艺、电压、温度的组合,如SS/0.72V/125C用于建立时间签核,FF/0.88V/-40C用于保持时间签核。一个视图就是“某模式×某角”的组合,工具在每个视图下独立读入对应的SDC和UPF约束。
实际项目中视图数量会迅速膨胀。假设有4种模式、6个角,理论上有24个视图,但并非所有组合都有意义:扫描模式通常只在特定角下分析,关断模式不需要在FF角下检查保持。合理的做法是建立视图矩阵,明确每个视图的签核目的,并控制活跃视图数量在可管理范围内。视图过多会显著增加综合与STA运行时间,视图过少则会漏掉真实场景。
面积与功耗目标:从“尽量小”到可量化指标
面积目标不能只写“越小越好”,而应分解为可检查的指标:标准单元面积、宏单元面积、布线资源占用率。例如某中端SoC在28nm节点下,目标总面积12mm²,其中CPU子系统4.5mm²、GPU 3.2mm²、互连与存储2.8mm²、其余1.5mm²。综合阶段可用report_area对比目标,若超出则优先检查组合逻辑冗余和寄存器复制策略。
功耗目标需区分动态功耗与漏电功耗。动态功耗与翻转率、负载电容、电压平方成正比,可用report_power查看各模块占比。若CPU域动态功耗超标,优先检查时钟门控覆盖率;若漏电超标,则检查多阈值单元比例和电源关断策略是否生效。目标设定应留出10%~15%余量,因为后端寄生参数提取后功耗通常会上升。
约束优先级:冲突时的仲裁规则
约束之间经常冲突:为了满足时序可能需要增大驱动或插入缓冲,这会增加面积和功耗;为了降低功耗可能关断某域,但这会影响该域内路径的时序分析。因此必须建立明确的优先级:功能正确性与隔离完整性最高,任何情况下不可妥协;其次是时序签核指标(WNS、TNS、DRV);再次是功耗目标;最后是面积优化。当低优先级目标与高优先级冲突时,应记录冲突原因并评估是否可通过架构调整解决,而不是简单放宽高优先级约束。
约束建模完成后,应通过check_timing、check_mmmc和UPF静态检查确认无遗漏、无冲突、无冗余。只有约束本身可信,后续的PPA优化才有意义。