引言
过去十年,功耗取代面积成为芯片设计的第一约束。原因很简单:频率在 3~5GHz 附近撞墙,工艺微缩带来的电压下降幅度越来越小,而单位面积功耗密度持续上升——散热能力成了硬上限。移动设备靠电池,数据中心靠电费与散热预算,两端都逼着设计者把功耗当成一等公民。
低功耗设计最反直觉的一点是:收益最大的手段几乎都在架构层,而工程上花时间最多的却在 RTL 与后端层。一个错误的架构决策(比如用了不该用的全定制存储、没做并行化降频)可能让功耗翻倍,而后面所有的时钟门控加起来也补不回来。反过来,架构定下来之后,时钟门控、操作数隔离、电源门控这些技术能把动态功耗再砍掉 30%~60%。
本文按「功耗来源 → 优化层次 → 具体技术 → 实现机制 → 分析验证」的顺序展开。设计流程的整体位置见 芯片设计流程与 EDA 工具链 ,时钟资源与约束的部分见 FPGA 时序约束与收敛 ,跨时钟域与复位策略见 有限状态机与时序设计 。本文专注功耗这一个维度,把它们串起来。
目录
- 功耗从哪里来:动态与静态
- 功耗优化的层次与收益排序
- 时钟门控:集成与手工
- 操作数隔离与数据门控
- 电源门控与电源域划分
- UPF:电源意图的描述
- 隔离、保持与电平转换单元
- 多电压域与 DVFS
- 电源管理控制器与低功耗状态机
- 功耗分析方法与签核
- FPGA 上的低功耗设计
- 可落地的 RTL 编码准则
1. 功耗从哪里来:动态与静态
数字电路的功耗由三部分组成:
P_total = P_dynamic + P_short_circuit + P_leakage
P_dynamic = α × C_L × V² × f (翻转功耗,α 是翻转率)
P_short_circuit= I_sc × V × f (短路功耗,输入跳变期间 PMOS/NMOS 同导通)
P_leakage = I_leak × V (静态功耗,亚阈值 + 栅氧漏电)
动态功耗对电压是平方关系,这是所有低功耗技术的理论根基:电压降 20%,动态功耗降 36%。降频降的是 f(线性),降压降的是 V²(平方),所以 DVFS 里降压比降频收益大得多——前提是时序还收敛得下来(延迟与 V 近似反比)。
静态功耗对阈值电压是指数关系:
I_subthreshold ∝ exp(-V_th / (n × V_T)) V_T = kT/q ≈ 26mV @ 300K
V_th 降 100mV → 漏电涨约 10 倍
工艺越先进,阈值电压越低,漏电占比越高。在 28nm 时漏电约占 20%~30%,到 7nm 以下可以到 40% 以上,甚至待机时漏电就是主要功耗。这就是为什么先进工艺必须用电源门控——不切断电源,待机功耗根本降不下来。
| 工艺节点 | 典型 Vdd | 漏电占比 | 主要对策 |
|---|---|---|---|
| 65nm | 1.2V | 10%~20% | 时钟门控 |
| 28nm | 1.0V | 20%~35% | 时钟门控 + 多阈值 |
| 16/14nm | 0.9V | 30%~45% | 电源门控 + DVFS |
| 7nm 以下 | 0.75V | 40%+ | 电源域 + 体偏置 |
多阈值单元(multi-Vt) 是另一条主线:同一工艺提供 HVT(高阈值、慢、漏电小)、SVT、LVT(低阈值、快、漏电大)三种单元。综合工具在关键路径上用 LVT 保时序,在非关键路径上用 HVT 省漏电,通常能在不损失频率的前提下把漏电降低 30%~50%。这是「零成本」的优化,应该默认开启。
2. 功耗优化的层次与收益排序
低功耗技术的收益排序(从高到低):
| 层次 | 技术 | 典型收益 | 代价 |
|---|---|---|---|
| 系统/算法 | 降采样率、稀疏化、近似计算 | 2~10x | 精度、功能 |
| 架构 | 并行化降频、降压、专用加速器 | 2~5x | 面积 |
| 架构 | 电源域划分、时钟域划分 | 1.5~3x | 验证复杂度 |
| RTL | 时钟门控、操作数隔离 | 1.3~2x | 少量面积 |
| 门级 | 多阈值、单元尺寸优化 | 1.2~1.5x | 无(EDA 自动) |
| 物理 | 电源网络、布局优化 | 1.1~1.3x | 后端工作量 |
架构层的「并行化降频」是最被低估的手段:把一个 500MHz 的单路处理单元换成两个 250MHz 的并行单元,吞吐不变,但由于 P ∝ V²f,在电压可随之降低时功耗可以降到原来的一半左右。这就是为什么 GPU 用海量低速核心、为什么 FPGA 加速器能在能效上碾压 CPU——它们用面积换频率,再用频率换电压。
单路 500MHz @ 1.0V:P = C × 1.0² × 500 = 500C
双路 250MHz @ 0.8V:P = 2 × C × 0.8² × 250 = 320C → 降低 36%
(假设低压下时序仍收敛,实际需要设计余量)
但并行化不是免费的:多份硬件带来多份漏电(静态功耗不随频率下降),面积增加带来布线拥塞。当漏电占比超过 30% 时,并行化的收益会被漏电吃掉,此时应该转向电源门控(关掉不用的副本)。
3. 时钟门控:集成与手工
时钟网络是动态功耗的最大单一来源,通常占动态功耗的 20%~40%。原因是时钟树要驱动全芯片所有触发器,扇出巨大,且每个周期都翻转(翻转率 100%,而数据线的平均翻转率只有 5%~15%)。
时钟门控(clock gating) 的原理:当一组触发器在某个周期不需要更新时,把它们的时钟关掉,省下时钟树翻转和数据翻转的功耗。
集成时钟门控单元(ICG, Integrated Clock Gating cell) 是标准做法,不能直接用 and 门——用 and 会把毛刺带进时钟,产生非法窄脉冲,导致触发器误翻转或时序错误。ICG 内部用锁存器 + 与门,在时钟低电平期间锁存使能信号:
// ICG 的行为(标准单元库提供,RTL 里不要自己写)
always @(*) if (!clk) en_latched <= en; // 低电平锁存
assign gclk = clk & en_latched; // 门控时钟无毛刺
// RTL 写法一:显式时钟门控(推荐,综合工具能识别并映射到 ICG)
always @(posedge clk or negedge rst_n)
if (!rst_n) cnt <= 32'b0;
else if (cnt_en) cnt <= cnt + 1'b1; // 综合自动插入 ICG
// RTL 写法二:手工实例化 ICG(需要精确控制时)
CKLNQD1 u_icg (.CP(clk), (.E(cnt_en)), .Q(gclk), .TE(1'b0));
always @(posedge gclk) cnt <= cnt + 1'b1;
综合工具会自动插入 ICG:只要写成「带使能的寄存器组」形式(if (en) q <= d;),工具就会把使能识别为门控条件,在寄存器组的时钟输入端插一个 ICG。因此RTL 阶段最重要的时钟门控工作是「写出工具能识别的使能形式」,而不是手工插门。
工具识别的关键条件:
- 使能信号是同步的(由同一时钟域的触发器产生),否则会有亚稳态风险。
- 使能条件覆盖一组寄存器,单个寄存器的门控收益小,工具可能不做。
- 使能表达式不含异步逻辑或复杂组合,太复杂会降低识别率。
门控的粒度与收益:
粗粒度(模块级):省得多,但唤醒延迟大,可能频繁开关
中粒度(寄存器组):最常用,工具默认粒度
细粒度(单寄存器):收益小、面积开销大,一般不划算
实测:典型 SoC 开时钟门控后动态功耗降 25%~40%
4. 操作数隔离与数据门控
操作数隔离(operand isolation) 针对的是组合逻辑的翻转功耗:当一个运算单元的输入在当前周期不被使用时,把它的输入钳位到固定值,避免组合逻辑因输入变化而无效翻转。
// 未隔离:无论 en 是否为 1,乘法器输入都在变,组合逻辑一直在翻转
assign product = a * b;
always @(posedge clk) if (en) result <= product;
// 隔离后:en=0 时输入钳位,乘法器不翻转
assign a_iso = en ? a : 32'b0;
assign b_iso = en ? b : 32'b0;
assign product = a_iso * b_iso;
always @(posedge clk) if (en) result <= product;
乘法器、加法器、除法器、桶形移位器这类组合逻辑深度大、节点多的单元,隔离收益最明显。典型场景是共享运算单元(多个功能分时复用同一个乘法器)和流水线中的旁路路径。
数据门控(data gating) 是同一思想的推广,用在总线和存储接口上:当某个主设备没有访问请求时,把它的地址/数据线钳位,避免无效翻转。这在多主设备总线上效果显著。
// 总线数据门控:无请求时把数据线钳位
assign m_data = m_valid ? data : {WIDTH{1'b0}};
代价与注意点:
- 隔离会增加组合路径延迟(多一级与门),可能影响时序,需要在综合后检查。
- 隔离逻辑本身消耗面积和漏电,对小的组合单元(如 2 输入与门)不值得。
- 隔离必须保持功能正确:钳位后的值不能影响实际被使用时的结果,只在「确定不使用」的周期钳位。
5. 电源门控与电源域划分
电源门控(power gating) 是唯一能彻底消除漏电的手段:把整个模块的电源切断,漏电降为零(只剩电源开关本身的漏电)。
实现方式是在模块的电源和全局电源之间插入电源开关(power switch,通常是高阈值的 header/footer 晶体管),由电源管理控制器控制其导通与关断:
VDD ──┬──[ Power Switch (PMOS header) ]──┬── 模块内部 VDDV
│ │
全局电源 虚拟电源(virtual VDD)
│
模块逻辑
电源域(power domain)的划分原则:
- 按使用场景划分:同时开关的模块放一个域。CPU 核、GPU、视频编解码、显示控制器各自一个域,可以独立关断。
- 按电压划分:需要不同电压的模块必须在不同域(多电压域)。
- 按关断频率划分:频繁开关的域开关开销(唤醒延迟、能量)占比高,不划算;常关的域收益最大。
- 域的数量要克制:每个域需要独立的开关网络、隔离单元、保持单元、电源管理逻辑,验证复杂度随域数量组合增长。超过 8~10 个域后,管理开销开始超过收益。
开关的粒度与方式:
| 方式 | 特点 | 唤醒延迟 |
|---|---|---|
| 粗粒度(整域一个开关环) | 面积小、开关电流大、IR drop 大 | 长 |
| 细粒度(分布式开关) | 电流均匀、面积大 | 短 |
| 环形开关(ring) | 折中,最常用 | 中 |
上电顺序与浪涌电流:一次性打开所有开关会产生巨大的浪涌电流(inrush current),拉低电源电压导致芯片误动作。标准做法是分级上电(staggered power-up):把开关分成 N 组,依次打开,每组间隔几个周期。此外还需要上电复位电路,确保域内状态被正确初始化。
6. UPF:电源意图的描述
UPF(Unified Power Format,IEEE 1801) 是描述电源意图的标准语言。RTL 本身只描述功能,电源域、开关、隔离、保持这些「非功能」信息由 UPF 描述,供综合与后端工具使用。
# 定义电源域
create_power_domain PD_CPU -elements {u_cpu}
create_power_domain PD_GPU -elements {u_gpu}
create_power_domain PD_TOP -include_scope
# 定义电源网络
create_supply_port VDD
create_supply_net VDD
create_supply_net VDD_CPU -domain PD_CPU
connect_supply_net VDD -ports {VDD}
connect_supply_net VDD_CPU -ports {VDD}
# 定义电源开关
create_power_switch sw_cpu -domain PD_CPU \
-input_supply_port {vin VDD} -output_supply_port {vout VDD_CPU} \
-control_port {sleep ctrl_sleep} \
-on_state {on_state vin {!sleep}} -off_state {off_state {sleep}}
# 隔离策略:域关断时输出钳位(隔离电源必须常开)
set_isolation iso_cpu -domain PD_CPU \
-isolation_power_net VDD -clamp_value 0 -applies_to outputs
# 保持策略:关键寄存器在关断时保持
set_retention ret_cpu -domain PD_CPU \
-retention_power_net VDD -elements {u_cpu/u_reg_state}
UPF 的三个作用:
- 综合与实现工具据此插入特殊单元(隔离、保持、电平转换),并做电源域感知的优化与检查。
- 形式验证与仿真据此建模电源状态(低功耗仿真,如 VCS 的 UPF 模式)。
- 签核工具据此检查电源域交叉规则(有没有漏插隔离、隔离方向对不对)。
常见错误:UPF 与 RTL 不同步。RTL 改了模块层次或信号名,UPF 没跟着改,工具要么报错要么静默漏插单元——后者更危险,因为仿真可能过、硅上会挂。
7. 隔离、保持与电平转换单元
跨电源域的信号必须经过特殊单元,这是电源门控最容易出错的地方。三类单元:
隔离单元(isolation cell):域 A 关断时,它的输出会浮空(X),如果域 B 还在工作并采样这个信号,就会产生穿透电流甚至逻辑错误。隔离单元在域 A 关断时把输出钳位到固定值(0 或 1)。
// 隔离单元的行为(由工具插入,RTL 里通常不写)
assign out = iso_en ? CLAMP_VALUE : in; // iso_en=1 时钳位
关键规则:隔离单元必须由常开电源(always-on) 供电,否则域关断时它自己也断电,无法输出钳位值。这就是为什么 UPF 里要单独指定 -isolation_power_net VDD。
保持单元(retention cell):域关断后寄存器状态丢失,唤醒后需要重新初始化。如果某些状态必须保留(如配置寄存器、状态机的当前状态、FIFO 指针),就要用保持单元——它内部有常开供电的影子寄存器(shadow register),关断前把值存进去,唤醒后恢复。
保持单元的时序:
save 信号 → 主寄存器值复制到影子寄存器(常开供电)
域关断 → 主寄存器断电,影子寄存器保持
restore → 影子值写回主寄存器
域上电完成 → 恢复正常工作
保持单元的面积约为普通触发器的 1.5~2 倍,且 save/restore 需要若干周期,所以只对必要的状态用。原则是「能不保持就不保持」——能用软件重新初始化的状态就不要用保持单元。
电平转换单元(level shifter):不同电压域之间信号传递必须转换电平。低压到高压(LH)和高压到低压(HL)的转换器结构不同,不能混用。缺电平转换器会导致信号幅度不足、静态电流增大甚至逻辑错误。
| 单元 | 作用 | 必需场景 |
|---|---|---|
| 隔离单元 | 关断域输出钳位 | 域 A 关断、域 B 工作 |
| 保持单元 | 关断时保存寄存器状态 | 需要保留状态 |
| 电平转换 | 电压域之间转换 | 多电压域 |
| 电源开关 | 控制域供电 | 电源门控 |
一个域要关断,需要同时满足:所有输出有隔离、需要保留的状态有保持、跨电压的信号有电平转换、电源开关与上电时序正确。缺任何一项都会在硅上表现为「偶发错误」或「唤醒后功能异常」,且极难调试。
8. 多电压域与 DVFS
多电压域让不同模块工作在不同电压:CPU 用 1.0V 跑高性能,外设用 0.8V 省功耗。实现上每个电压域需要独立的电源网络、电平转换器和电源管理。
DVFS(Dynamic Voltage and Frequency Scaling) 是运行时动态调整电压与频率:
工作点(OPP)示例:
OPP0: 1.0V / 1.5GHz (高性能)
OPP1: 0.9V / 1.2GHz
OPP2: 0.8V / 900MHz
OPP3: 0.7V / 600MHz (低功耗)
切换顺序(升频必须先升压):
升:先提压 → 等电压稳定(数十微秒)→ 再提频
降:先降频 → 再降压
顺序反了会导致时序不收敛 → 功能错误
DVFS 的工程难点:
- 电压调节的响应时间:片外 DC-DC 或 LDO 的电压切换需要几十到几百微秒,比频率切换慢几个数量级。频繁切换的收益会被切换开销吃掉,因此 DVFS 的调度要有滞回与最小驻留时间。
- 频率切换要无缝:切频时时钟必须干净地停止、切换、重启,不能产生毛刺。通常用一个时钟切换电路(glitch-free clock mux),在时钟低电平期间切换。
- 电压切换期间要保证时序:电压下降过程中,逻辑延迟变长,必须在电压稳定后才提高频率,否则会出现时序违例。
- CPU 与总线的协同:CPU 降频时,AXI 总线与其他主设备的时钟比会变化,跨时钟域逻辑必须能容忍任意频率比。
// 无毛刺时钟切换(两个时钟源)
// 关键:每个源的使能要经过对方时钟域同步,且只在低电平切换
reg en_a_sync1, en_a_sync2, en_b_sync1, en_b_sync2;
always @(posedge clk_a or negedge rst_n)
if (!rst_n) {en_a_sync2, en_a_sync1} <= 2'b0;
else {en_a_sync2, en_a_sync1} <= {en_a_sync1, sel_a & ~en_b_sync2};
assign clk_out = (clk_a & en_a_sync2) | (clk_b & en_b_sync2);
AVS(Adaptive Voltage Scaling) 是 DVFS 的进阶:用片上传感器监测实际工艺/温度/电压,动态找出当前条件下的最低可用电压(而不是查表用保守值),通常能再省 15%~30%。代价是需要关键路径复制电路(critical path monitor) 与闭环控制逻辑,验证复杂度高。
9. 电源管理控制器与低功耗状态机
电源管理控制器(PMC)是负责执行电源状态迁移的硬件,通常是一个独立的小状态机 + 常开供电。它必须满足:
- 常开供电:即使所有计算域都关断,PMC 也要能工作并响应唤醒事件。
- 抗干扰:它控制整个芯片的电源,任何错误都可能导致芯片无法唤醒。
- 状态可见:软件能读取当前状态、发起状态迁移、等待迁移完成。
一个典型的低功耗状态机(类似 ARM 的 P-State/C-State 模型):
状态迁移(越往下功耗越低、唤醒越慢):
ACTIVE → 所有域上电,全速运行
IDLE → 时钟门控,域仍上电(唤醒 < 10 周期)
RETENTION → 部分域关断,关键状态用保持单元(唤醒 ~100 周期)
DEEPSLEEP → 大部分域关断,仅 PMC + RTC 供电(唤醒 ~1000 周期)
OFF → 全芯片关断(只能靠外部事件唤醒)
迁移条件:空闲计数达阈值 → IDLE → RETENTION;软件显式请求 → DEEPSLEEP
任意状态 → ACTIVE:中断到达(唤醒源),退出顺序与进入顺序严格相反
唤醒源(wake-up source)必须常开:RTC、GPIO 中断、外部唤醒引脚。这些逻辑即使在 DEEPSLEEP 也必须能工作,因此它们的供电与时钟必须独立于被关断的域。
迁移的原子性与顺序:进入低功耗状态前要「保存状态 → 隔离输出 → 关时钟 → 关电源」;退出时反向执行。任何一步顺序错误都会导致状态丢失或穿透电流。这个顺序通常由一个硬件序列器(sequencer)保证,而不是靠软件写时序。
10. 功耗分析方法与签核
功耗分析分三个精度层次:
| 方法 | 精度 | 输入 | 用途 |
|---|---|---|---|
| 早期估算 | ±30% | 架构参数、活动率假设 | 架构决策 |
| 门级 + SAIF | ±10% | 网表 + 仿真的翻转活动 | RTL/门级优化 |
| 物理 + 功耗签核 | ±5% | 布局后网表 + 寄生参数 + 向量 | 最终签核 |
SAIF(Switching Activity Interchange Format) 是连接仿真与功耗分析的桥梁:跑 RTL 仿真时记录每个节点的翻转次数,导出 SAIF 文件,功耗工具读入后按真实活动率计算。仿真环境与激励的组织方式见 SystemVerilog 验证与 testbench 。
# VCS 仿真导出 SAIF
./simv +saif_file=dump.saif +saif_start=1000 +saif_stop=50000
# PrimePower / PTPX 读入 SAIF 做功耗分析
report_power -saif dump.saif -analysis_mode time_based
功耗签核的两种模式:
- 平均功耗(average power):用于散热设计、电池续航估算。对活动率敏感。
- 峰值功耗(peak power):用于电源网络设计(IR drop)、去耦电容。峰值功耗往往由测试模式决定——扫描测试时所有触发器同时翻转,峰值功耗可能比正常功能高 2~5 倍,这是电源网络必须能承受的最坏情况,也是低功耗测试要专门处理的问题。
功耗签核的常见问题:
- SAIF 覆盖不足:仿真只跑了部分场景,活动率偏低,签核结果乐观。必须用真实工作负载(如跑一段操作系统启动 + 典型应用)。
- 向量选择:不同应用的功耗差异可达 3 倍,要选最坏场景而非平均场景。
- 温度反馈:高温下漏电增加,功耗上升,温度再升高——热失控(thermal runaway) 需要在签核时用最坏温度迭代。
11. FPGA 上的低功耗设计
FPGA 的功耗模型与 ASIC 不同:静态功耗占比更高(配置存储与漏电固定开销),且没有电源门控能力(不能关掉部分逻辑的电源)。
FPGA 功耗构成(典型):
静态功耗(配置 + 漏电) 40%~60%
时钟网络 15%~30%
逻辑与布线 15%~25%
I/O 5%~15%
FPGA 上可行的低功耗手段:
| 手段 | 收益 | 说明 |
|---|---|---|
| 时钟门控(BUFGCE) | 10%~25% | 用带使能的全局时钟缓冲 |
| 降频 + 并行化 | 20%~40% | 频率线性降低动态功耗 |
| 减少高扇出复位 | 5%~15% | 复位网络是时钟之外的第二大翻转源 |
| 降低 IO 翻转率 | 5%~20% | DDR 输出使能门控、降低接口频率 |
| 时钟域收敛 | 5%~15% | 减少 BUFG 数量与时钟树规模 |
| 选低功耗器件/电压 | 20%~50% | 换低电压档位的 FPGA |
高扇出同步复位是 FPGA 上被忽视的功耗陷阱:如果所有触发器都用同一个同步复位,综合工具会生成一棵巨大的复位树,每个周期都在翻转。改成「复位只在初始化用,之后用使能」的结构,或者用局部复位,能显著降低功耗。
// 差:全局同步复位,复位树每周期翻转
always @(posedge clk) if (rst) q <= 0; else if (en) q <= d;
// 好:用初始值 + 使能,复位树只在上电时有效
always @(posedge clk) if (en) q <= d; // 初值由 FPGA 配置决定
12. 可落地的 RTL 编码准则
把上面的技术落到 RTL 编码上,形成一份可执行的清单:
1. 所有寄存器组都写成「带使能」形式,让综合自动插 ICG
if (en) q <= d; ✅
q <= en ? d : q; ❌ 工具可能识别不出
2. 使能信号必须同步,且尽量来自同一时钟域的触发器
always @(posedge clk) en_r <= en; // 打一拍再门控
3. 共享运算单元加操作数隔离
assign mul_a = sel ? a : 0; assign mul_b = sel ? b : 0;
4. 避免不必要的全局复位树,优先用初值与局部复位
5. 状态机用 one-hot 编码(翻转少、译码浅),并做无用状态门控
6. 大位宽计数器/寄存器只在需要时更新(写使能)
if (cnt_en) cnt <= cnt + 1; ✅ 而非无条件累加
7. 时钟分频用时钟使能而非分频时钟(避免多时钟域与 CDC 开销)
if (clk_en) ... ✅
always @(posedge clk_div) ... ❌ 引入新时钟域
8. 存储器用带使能的块 RAM,空闲时不让地址线翻转
9. 跨电源域信号必须走隔离/保持/电平转换(UPF 中显式声明)
10. 功耗敏感模块考虑多阈值替换(综合脚本中设 HVT 优先)
一条经验:RTL 阶段的低功耗优化,90% 的收益来自「时钟门控 + 操作数隔离 + 避免无效翻转」这三件事,且它们的实现成本极低。电源门控与 DVFS 虽然收益大,但需要架构与后端的大量配合,应该在项目早期就规划,而不是后期打补丁。
权衡取舍
| 决策点 | 选项 A | 选项 B |
|---|---|---|
| 降功耗路线 | 降频:简单、线性收益 | 降压:平方收益、需时序余量 |
| 时钟门控粒度 | 粗粒度:省得多、唤醒慢 | 中粒度:平衡、工具默认 |
| 电源域数量 | 少:验证简单、收益有限 | 多:收益大、验证组合爆炸 |
| 状态保持 | 保持单元:快、面积大 | 软件重初始化:省面积、慢 |
| 电压方案 | 固定电压:简单、无转换器 | 多电压域:省功耗、需电平转换 |
| DVFS 调度 | 查表 OPP:可预测、保守 | AVS 闭环:省 15%~30%、复杂 |
| 复位策略 | 全局同步复位:简单、耗功耗 | 初值 + 局部复位:省功耗、需小心 |
| 优化时机 | 架构期规划:收益大、需决策 | 后期补丁:收益小、返工多 |
常见坑清单
- 用与门做时钟门控:产生毛刺导致触发器误翻转,必须用标准 ICG 单元(锁存器 + 与门)。
- 门控使能未同步:使能来自异步信号,门控窗口与数据窗口错位,功能错误。
- 隔离单元用被关断域的电源:域关断后隔离单元自身断电,无法钳位输出。
- 漏插隔离单元:域 A 关断后输出浮空,域 B 采到 X,产生穿透电流。
- 保持单元保存顺序错:先关电源再 save,状态丢失;必须先 save 再关断。
- 电平转换方向错误:LH 与 HL 转换器混用,信号幅度不足或静态电流大。
- 上电浪涌电流过大:所有开关同时打开,电源被拉低导致误动作,需分级上电。
- DVFS 先提频后提压:电压未升就提频,时序违例,必须「升压再升频、降频再降压」。
- 时钟切换有毛刺:切换时产生窄脉冲,必须用无毛刺时钟 mux 且只在低电平切换。
- UPF 与 RTL 不同步:层次或信号名改了 UPF 没改,工具静默漏插单元。
- SAIF 覆盖不足:仿真场景太少,活动率偏低,功耗签核结果乐观。
- 忽略测试模式峰值功耗:扫描测试时全翻转,峰值功耗是功能的数倍,电源网络设计不足。
小结
低功耗设计的主线是**「在正确的层次做正确的事」**:架构期用并行化降频降压、划分电源域,拿到数量级的收益;RTL 期用时钟门控、操作数隔离、避免无效翻转,拿到 1.52 倍收益;后端用多阈值、单元优化、电源网络,拿到 1.21.5 倍收益。顺序反了,收益就没了——架构定死之后,后面所有技术加起来也补不回一个错误的架构决策。
实现层面最容易出错的是跨电源域的特殊单元:隔离、保持、电平转换、上电时序,任何一项缺失或顺序错误都会导致「仿真过、硅上挂」的偶发故障。因此 UPF 必须与 RTL 同步维护,且要有专门的电源域规则检查(DRC)作为签核项。
下一步建议阅读可测性设计与测试,理解测试模式下的峰值功耗为什么是电源网络的最坏情况;如果关注整体流程中功耗签核的位置,可回看芯片设计流程与 EDA 工具链里功耗签核所处的位置。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。