4. 电压域物理实现:从理论到实战

各位同学,今天我们来聊聊多电压域设计里最核心的实操环节。说实话,这块内容我第一次接触时也头大,但后来发现,只要把几个关键动作搞明白,剩下的就是细心和耐心了。

4.1 电压域(Voltage Area)创建

电压域,说白了就是芯片上的一块区域,这块区域里的标准单元、宏单元都工作在同一个电压下。我习惯叫它「VA」,英文全称是 Voltage Area。

创建 VA 时,我们通常用工具的命令来画一个矩形区域。比如在华大九天的工具里,可以这样操作:

# 创建一个名为 VA_CORE 的电压域,电压 0.8V
create_voltage_area -name VA_CORE -voltage 0.8 \
    -boundary {100 100 500 500}

这里要注意几个点:

  • 边界要留余量:我建议 VA 边界比实际逻辑区域大 5-10 微米,防止后续布线时出现 DRC 违例
  • 命名要规范:用 VA_ 前缀,后面跟功能名,比如 VA_IO、VA_MEM
  • 电压值要统一:同一个 VA 内所有单元必须用同一电压,别混用

核心要点:电压域的本质是「物理隔离 + 电压统一」。你想想看,如果两个不同电压的单元挨在一起,那电流倒灌问题就来了。

4.2 电源域(Power Domain)分配

电源域和电压域有啥区别?嗯,这个问题我经常被问到。简单说:电压域是物理概念,电源域是逻辑概念

一个电源域可以包含多个电压域,也可以只包含一个。比如你的芯片有 1.2V 和 0.8V 两个电压,那至少有两个电源域。但如果 0.8V 区域里又分了两个 VA,那这两个 VA 就属于同一个电源域。

分配电源域时,我一般遵循这个流程:

  1. 先确定芯片需要几种电压
  2. 每种电压对应一个电源域
  3. 在同一个电源域内,再根据功能划分电压域

举个例子,我之前做过一个 AI 加速芯片:

电源域 电压 包含的电压域 功能
PD_CORE 0.8V VA_COMPUTE, VA_MEM 核心计算
PD_IO 1.8V VA_IO_IN, VA_IO_OUT 输入输出
PD_ALWAYS 1.2V VA_ALWAYS 常开区域

个人经验:电源域分配时,尽量把相同电压的模块放在一起。这样电源网络好走,IR Drop 也容易控制。我曾经为了省面积,把两个不同电压的模块交叉放置,结果电源网络绕来绕去,最后 IR Drop 超标,不得不重做。

4.3 Always-On 区域处理

Always-On 区域,就是芯片里永远不能断电的那部分。比如唤醒逻辑、关键状态寄存器、RTC 时钟等。

处理 Always-On 区域时,有几个坑要注意:

  • 电源必须独立:Always-On 区域要用单独的电源网络,不能被电源开关控制
  • 隔离要到位:Always-On 区域和其他区域之间必须加电平转换器(Level Shifter)
  • 面积别太大:我见过有人把半个芯片都设成 Always-On,那功耗控制就白做了

避坑指南:我曾经在一个项目中,把 Always-On 区域的电源网络和普通区域连在了一起。结果电源关断时,Always-On 区域也跟着掉了电,整个芯片的唤醒逻辑失效。那次教训让我记住了:Always-On 的电源网络必须从顶层单独拉下来,不能偷懒。

在华大九天的工具里,标记 Always-On 区域的方法很简单:

# 将 VA_ALWAYS 标记为常开区域
set_voltage_area -name VA_ALWAYS -always_on true

4.4 电源开关(Power Switch)插入

电源开关,就是用来控制某个电压域是否供电的器件。它本质上是一个大尺寸的 PMOS 管,串联在电源网络和电压域之间。

插入电源开关时,我一般按这个步骤来:

  1. 确定开关类型:粗粒度开关还是细粒度开关?粗粒度一个开关管一大片,细粒度每个标准单元都配开关
  2. 计算开关数量:根据电压域的电流需求,算出需要多少个开关并联
  3. 摆放开关:均匀分布在电压域边界,保证供电均匀
  4. 连接控制信号:把开关的使能信号连到 Always-On 区域

举个例子,一个需要 1A 电流的电压域,如果每个开关能提供 10mA,那就需要 100 个开关。我习惯多留 20% 的余量,放 120 个。

# 插入电源开关的示例命令
insert_power_switch -name SW_CORE \
    -voltage_area VA_CORE \
    -switch_cell "HEADER_10MA" \
    -number 120 \
    -control_signal "sw_en"

关键提醒:电源开关的插入密度直接影响 IR Drop。开关太少,电压域中间电压会掉得很厉害。我建议用工具自带的 IR Drop 分析功能,反复迭代几次,找到最优的开关数量和位置。

知识体系总览

下面这张图,是我自己总结的多电压域实现流程,你一看就明白了:

多电压域物理实现流程 电压域创建 定义物理边界 指定工作电压 电源域分配 逻辑分组 电压等级划分 Always-On处理 常开区域标记 独立电源网络 电源开关插入 开关类型选择 数量计算与摆放 IR Drop 分析反馈 完成多电压域物理实现 通过 LVS/DRC 验证 电压域 电源域 Always-On 电源开关 最终输出 反馈回路

这张图把整个流程串起来了。你从电压域创建开始,一步步往下走,中间别忘了用 IR Drop 分析来反馈调整。我每次做项目,至少要在电源开关插入这一步迭代 3-5 轮,才能把 IR Drop 压到 5% 以内。

最后说一句:多电压域设计,说白了就是「分而治之」。把大芯片切成几个小电压域,每个域独立控制电源,既能省功耗,又能保证性能。但代价就是设计复杂度上去了,你得花更多时间在物理验证上。


公众号:蓝海资料掘金营,微信deep3321