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还不够,得验证它是不是对的。我一般会做三件事:

  1. UPF语法检查:用工具跑一下,看看有没有语法错误或逻辑矛盾。
  2. 电源域连通性检查:确认每个标准单元的电源引脚都连到了正确的供电网络上。这个检查特别重要,因为有时候综合工具会莫名其妙地把单元连到错误的电源上。
  3. 跨域路径检查:遍历所有跨域路径,确认每个路径都插了正确的电平转换器和隔离单元。

我记得有一次,工具报告说某个跨域路径没有隔离单元。我查了半天,发现是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 域 VDD_ALWAYS_ON (1.8V) 唤醒控制器 RTC Always-On 寄存器组 关断域 (PD_CPU) VDD_CPU (0.9V) - 可关断 CPU Core L1 Cache CPU 寄存器组 (含Retention FF) 电源开关 隔离单元 LS LS sleep 控制信号 电平转换器 隔离单元 电源开关 跨域信号 控制信号

这张图里,Always-On域和关断域之间通过电平转换器和隔离单元进行信号交互。关断域内部有电源开关控制它的通断,而Always-On域则一直保持供电。嗯,这种结构在低功耗芯片里非常常见。

2.8 总结一下

电源域划分检查,说白了就是确保每个模块都能在正确的时间得到正确的电压。我个人觉得,这步做得越细,后面PDN分析就越省心。你想想看,如果电源域都没划对,那PDN分析出来的结果还有什么意义?

我建议大家在项目初期就花时间把UPF写好、验证好,不要等到后端实现阶段才发现问题。那时候改起来,成本可就大了去了。

核心要点回顾:

  • Always-On域永远不掉电,关断域可以断电
  • 跨域信号必须经过电平转换和隔离
  • UPF要写清楚每个域的供电网络和电源状态
  • 验证阶段要检查域边界、连通性和跨域路径
  • 电源开关分布要均匀,避免IR Drop

可可精品资料库