2. 电源域划分检查:确认芯片中所有电源域被正确划分
电源域划分,说白了就是给芯片的各个功能模块分配不同的“电源开关”。我做了这么多年后端,见过太多因为电源域没划好导致芯片翻车的案例。嗯,这步要是出问题,后面PDN分析做得再漂亮也是白搭。
2.1 什么是电源域?为什么要划分?
现代SoC芯片里,不是所有模块都需要一直通电。比如手机待机时,CPU可以关掉,但闹钟模块得一直开着。这就引出了电源域的概念——一组共享同一电源轨的逻辑单元。
我个人习惯把电源域分成三类:
- Always-On域:永远不掉电,哪怕芯片进入深度睡眠。比如RTC、唤醒控制器、一部分寄存器。
- 关断域(Power-Gated Domain):可以完全断电以节省功耗。比如CPU核、GPU、DSP。
- 保留域(Retention Domain):断电但保留状态。比如一些关键寄存器,断电后恢复时能快速回到之前状态。
你想想看,如果Always-On域里混进了不该有的逻辑,那芯片永远没法真正休眠,功耗直接炸掉。我在项目中遇到过,有个同事把调试接口的时钟模块放进了Always-On域,结果芯片待机电流比预期高了3倍……查了整整两周才找到原因。
2.2 电源域划分的核心检查项
检查电源域划分,我一般会盯着下面几个点:
| 检查项 | 说明 | 常见问题 |
|---|---|---|
| 域边界完整性 | 每个电源域的边界是否闭合,有没有漏掉的逻辑 | 边界上出现“孤儿”单元,既不属于A域也不属于B域 |
| 电平转换器 | 跨域信号是否插入了正确的电平转换器(Level Shifter) | 漏插或插错方向,导致信号无法正确传递 |
| 隔离单元 | 关断域输出到Always-On域的信号是否做了隔离 | 关断域断电后,输出浮空,导致Always-On域误触发 |
| 状态保留单元 | 需要保留状态的寄存器是否使用了Retention Flip-Flop | 用了普通寄存器,断电后状态丢失 |
| 电源开关 | 关断域的电源开关(Power Switch)是否合理分布 | 开关太少导致IR Drop过大,开关太多浪费面积 |
2.3 跨域信号处理——最容易踩坑的地方
跨域信号处理,是我觉得电源域划分里最需要小心的地方。为什么?因为一个信号从关断域传到Always-On域,中间要经过电平转换、隔离、同步三个步骤,少一个都不行。
我曾经在一个项目中,发现某个跨域信号的电平转换器插反了方向。结果关断域断电后,Always-On域收到了一个不确定的电平,直接导致系统复位。嗯,从那以后我每次都要手动检查每个跨域路径。
核心原则:
- 从高电压域到低电压域:需要电平转换器
- 从低电压域到高电压域:也需要电平转换器
- 从关断域到Always-On域:需要隔离单元 + 电平转换器
- 跨异步时钟域:还需要同步器
2.4 电源域划分的UPF实现
在实际项目中,电源域划分是通过UPF(Unified Power Format)来描述的。我习惯在项目初期就把UPF写好,然后随着设计迭代不断更新。
下面是一个典型的UPF示例,定义了一个Always-On域和一个关断域:
# 创建电源域
create_power_domain PD_ALWAYS_ON -include_scope {top}
create_power_domain PD_CPU -include_scope {top/cpu}
# 指定电源和地
create_supply_net VDD_ALWAYS_ON -domain PD_ALWAYS_ON
create_supply_net VDD_CPU -domain PD_CPU
create_supply_net VSS -domain PD_ALWAYS_ON
# 定义电源开关
create_power_switch SW_CPU \
-domain PD_CPU \
-input_supply_port {in VDD_ALWAYS_ON} \
-output_supply_port {out VDD_CPU} \
-control_port {sleep top/cpu_ctrl/sleep} \
-on_state {on_state in {!sleep}} \
-off_state {off_state {sleep}}
# 定义隔离策略
set_isolation ISO_CPU \
-domain PD_CPU \
-isolation_supply VDD_ALWAYS_ON \
-clamp_value 0 \
-applies_to outputs
这段UPF里,我定义了PD_CPU这个关断域,它通过SW_CPU这个电源开关来控制通断。当sleep信号为高时,CPU域断电,同时所有输出被钳位到0。
我的小技巧:写UPF时,一定要把每个域的供电网络(Supply Net)和电源状态(Power State)定义清楚。我习惯用表格把每个域在不同工作模式下的电压值列出来,这样后面做静态时序分析时不会搞混。
2.5 电源域划分的验证方法
光写完UPF还不够,得验证它是不是对的。我一般会做三件事:
- UPF语法检查:用工具跑一下,看看有没有语法错误或逻辑矛盾。
- 电源域连通性检查:确认每个标准单元的电源引脚都连到了正确的供电网络上。这个检查特别重要,因为有时候综合工具会莫名其妙地把单元连到错误的电源上。
- 跨域路径检查:遍历所有跨域路径,确认每个路径都插了正确的电平转换器和隔离单元。
我记得有一次,工具报告说某个跨域路径没有隔离单元。我查了半天,发现是UPF里把那个路径的隔离策略写漏了。说白了,工具不会帮你自动补全,你得自己把每个细节都定义清楚。
2.6 常见问题与避坑指南
⚠️ 我曾经踩过的坑:
- Always-On域里混入了关断域的逻辑:导致芯片永远无法进入低功耗模式。解决办法是严格检查每个域的scope定义,确保没有重叠或遗漏。
- 电平转换器插反方向:信号从1.8V域到0.9V域,结果插了个从0.9V到1.8V的转换器。嗯,这种错误工具不一定能报出来,得靠人工审查。
- 隔离单元钳位值选错:应该钳位到0,结果钳位到1,导致Always-On域误以为有关断域的信号来了。这个在仿真阶段就能发现,但很多人会忽略。
- 电源开关分布不均匀:导致关断域内部IR Drop过大。我建议在floorplan阶段就把电源开关的密度规划好,一般每100um放一个开关比较合理。
2.7 电源域划分的SVG结构图
下面这张图展示了典型的电源域划分结构,包括Always-On域、关断域以及它们之间的信号交互:
这张图里,Always-On域和关断域之间通过电平转换器和隔离单元进行信号交互。关断域内部有电源开关控制它的通断,而Always-On域则一直保持供电。嗯,这种结构在低功耗芯片里非常常见。
2.8 总结一下
电源域划分检查,说白了就是确保每个模块都能在正确的时间得到正确的电压。我个人觉得,这步做得越细,后面PDN分析就越省心。你想想看,如果电源域都没划对,那PDN分析出来的结果还有什么意义?
我建议大家在项目初期就花时间把UPF写好、验证好,不要等到后端实现阶段才发现问题。那时候改起来,成本可就大了去了。
核心要点回顾:
- Always-On域永远不掉电,关断域可以断电
- 跨域信号必须经过电平转换和隔离
- UPF要写清楚每个域的供电网络和电源状态
- 验证阶段要检查域边界、连通性和跨域路径
- 电源开关分布要均匀,避免IR Drop
可可精品资料库