☰
Level Shifter电平转换单元:多电压域低功耗设计的关键细节
2026/10/5 5:20:47 网站建设 项目流程

前两篇把多电压域和电源关断聊完了,本来准备一口气把电平转换单元也写掉,结果越写越长,只能单独拆出来。这篇专门补Level Shifter cell,把这种在低功耗设计里存在感不强、但出问题就让人头疼的单元讲透。

很多刚接触低功耗设计的同学会把Level Shifter当成一个“自动帮你把电压对上的黑盒子”,实际上它没那么神秘,但也没那么简单——尤其是它的类型、摆放策略、PG连接方式,每一样都能直接影响芯片能不能跑对、功耗是不是达标。这篇不绕弯子,直接从问题出发,把Level Shifter是什么、怎么用、踩过哪些坑一次讲清楚。

1. Level Shifter到底解决什么问题

1.1 芯片内部为什么会有多个电压域

一颗SoC或者MCU里同时存在多个电压域,本质上就是性能和功耗的妥协。CPU、GPU这类模块需要高主频,供电电压就得高一点;而一些对速率不敏感的模块,比如RTC、看门狗、低功耗定时器,用很低的电压就能跑,没必要跟着核心一起喝高电压的“血”。

在多电压域设计里,电压高的域叫高电压域,电压低的叫低电压域。常见组合有1.2V核心逻辑配0.8V近阈值计算域,或者0.8V逻辑域配1.8V/3.3V IO域。而不同的电压域如果直接拿信号线互连,就一定会遇到问题——高电压域输出的逻辑1,到了低电压域可能“过冲”;反过来,低电压域输出的逻辑1,在高电压域看来根本就不是1。

1.2 电压域直接相连会发生什么

这里用一个具体例子来算。假设某个设计里有1.8V IO域和0.8V逻辑域:

  • 0.8V逻辑域输出高电平,在最差情况下大约0.72V(0.8V减去一定压降);
  • 1.8V IO域要求输入高电平至少达到1.8V的65%左右,也就是1.17V;
  • 0.72V远低于1.17V,1.8V域根本识别不出这是逻辑1,信号进来就是乱码。

反过来的方向,1.8V域输出1,电平大约1.62V,0.8V域输入阈值通常在0.52V左右,1.62V远高于0.52V,能被正确识别。但高电平对低电压域的MOS管来说可能是过压,长期可靠性会出问题,而且会形成从高电压域到低电压域的漏电通路。

所以高压域向低压域,很多时候可以依赖“直接驱动”的容忍性,但前提是库的输入级能承受这个电压;低压域向高压域则基本必须加电平转换单元。简单记就是:低压往高压走,必须Level Shifter;高压往低压走,要看工艺节点和库的IO容忍能力。

在我看来,这一块是Level Shifter最核心的存在价值:它是多电压域设计的“翻译官”,负责让不同“语言体系”的电压域之间能准确、安全地通信。

2. Level Shifter的几种类型和内部结构

2.1 单电源LS和双电源LS的区别

市场上常见的Level Shifter按供电方式分成两大类。

单电源LS,也叫无电源电平转换,通常只需要低电压域供电或者高电压域供电,内部靠反相器翻转阈值来“识别”输入电平,再通过输出级把电平抬升或拉低。这种结构的优点是单元面积小、布线简单、不需要额外分配供电网络;缺点也很明显——阈值点容易受工艺角影响,输出驱动能力弱,一旦输入电压和输出压差过大,速度就上不去。

双电源LS,就是有两个供电引脚,典型是VDDL(低电压电源)和VDDH(高电压电源),输入级用VDDL供电,输出级用VDDH供电,两边互不干扰。这种结构的转换速度快、可靠性高、工艺角敏感性低,是标准单元库里最常见的Level Shifter类型。代价就是物理实现的时候要多连一条电源线,后端工作量会增加一点。

2.2 双电源LS的经典内部结构

双电源LS的核心结构一般是交叉耦合锁存器,配合输入级的差分对管。简单描述一下:输入信号IN同时接到一个NMOS管的栅极和一个反相器的输入端,反相器输出接到另一个NMOS管的栅极,这样在输入级形成差分输入对;两个NMOS管的漏极分别接一对交叉耦合的PMOS管,输出端从PMOS交叉耦合点引出。

工作原理并不复杂。输入IN为高电平时,一侧NMOS导通,把对应输出节点往下拉;交叉耦合的PMOS锁存器感知到一侧被拉低后,另一侧PMOS会导通更强,把输出节点持续上拉到VDDH。整个过程中,输入级的工作电压一直是VDDL的范围,输出级则完全工作在VDDH范围。由于加入了锁存器结构,静态情况下只要状态稳定,输出会一直保持,不会产生静态直流通路,这也是它适合低功耗设计的原因之一。

实际项目里,工程师很少需要关心LS内部管子尺寸,但了解交叉耦合锁存器这个结构很有用——它决定了LS的输入阈值、输出摆率、以及能不能承受“浮空输入”这类异常情况。

2.3 按信号方向分类:单向、双向与可配置

按信号方向分类,Level Shifter又分为单向LS、双向LS和方向可配置LS。

单向LS只允许信号从低压域向高压域或从高压域向低压域转换,应用最广。双向LS主要用于I2C、SPI这类总线接口,同一个引脚既要发送又要接收,而且两个电压域随时可能切换通信方向。双向LS的内部通常有两个方向相反的单向转换路径,再配合方向控制信号来打开其中一条路径。

方向可配置LS在双向的基础上增加了方向选择引脚DIR,时序要求相对严格:在切换方向之前,总线必须处于空闲状态,否则可能产生毛刺。这也是I2C总线适配电平转换时大家比较警惕的地方——有些同学的板级I2C通信偶尔抽风,最后查出来是双向LS的方向切换和总线仲裁同时在动作。

2.4 带隔离功能的复合LS单元

在多电压域低功耗设计里,Level Shifter经常和隔离单元(Isolation Cell)搭配使用。低电压域被电源关断后,它的输出引脚会浮空,如果不处理,浮空信号进入高电压域后不但会产生很大的漏电,还会把未知状态传播到后级逻辑,导致整个模块状态机跑飞。

解决办法一般有两种。一是单独插隔离单元,在关断域的出口处把信号钳位到固定电平;二是用带隔离功能的复合LS,把隔离和电平转换做在同一个cell里。复合LS的优势是省了一级cell延迟和一份功耗开销,缺点是灵活性稍差——如果既要隔离到0又要隔离到1,就需要选两个不同版本的复合cell。

这块强烈建议大家在综合阶段就做好规划,而不是等物理实现时靠工具自动推断。工具自动推出来的隔离策略往往很保守,要么面积膨胀,要么时序变差。

3. Level Shifter在低功耗设计流程里的位置

3.1 UPF和CPF中如何声明Level Shifter

UPF是目前最常用的低功耗设计约束格式。要在UPF里让工具自动插入Level Shifter,一般用set_level_shifter命令:

set_level_shifter -name ls_rule \ -applies_to both \ -location self \ -threshold 0.2 \ -rule true \ -elements {u_core/u_dft_reg*} set_voltage_domain -name VDD_HIGH -power_net VDDH -ground_net VSS set_voltage_domain -name VDD_LOW -power_net VDDL -ground_net VSS set_level_shifter -applies_to input \ -location parent \ -threshold 0.1 \ -domain VDD_HIGH

几条关键参数含义:

  • -applies_to:指定LS作用于输入、输出还是双向both;
  • -location:指定LS放在哪个域,parent表示放在信号发起的父域,self表示放在当前域;
  • -threshold:电压差阈值,两个域的电压差超过阈值时才插入LS。

CPF里的语法略有差异,但概念一致。对于新手,我觉得最需要记住的是:Level Shifter的插入通常不是综合器自己“顺手”做的,而是需要你在UPF/CPF里给出明确的电压域定义和跨域信号规则,工具才有依据去自动插。

3.2 LS的摆放位置到底怎么定

LS放在哪个电压域很关键。先说明一个事实:LS本身有两个电源引脚,VDDL和VDDH都必须在工作范围内,它才能正确转换电平。所以从物理实现角度,LS必然跨在两个电压域的电源网络之间,但“跨”的位置是可以配置的。

  • 放在source域(发起域):LS的VDDL接低电压域,VDDH也尝试接低电压域附近能取到的高电压电源,这样输入信号走线短,输出则要走一段长线到目标域;
  • 放在destination域(目标域):LS的VDDH接高电压域,VDDL接低电压域,输入信号走长线进来,输出到目标域内部走线短。

从时序角度,我个人的经验是尽量放在目标域,也就是输出端靠近后级逻辑,这样能把LS的转换延迟分摊到较短的输出网络上。从功耗角度,LS放在常开域更好——如果LS本身所在的电压域会被关断,那它输出也会浮空,等于白接了。做低功耗设计时,这条可以当作默认原则。

3.3 什么时候可以不给跨域信号插LS

不是所有的跨电压域信号都需要插LS,这一点很多资料没有重点讲。至少有以下几种情况可以省掉:

  • 两个域电压差极小。比如0.8V和0.9V之间,高电压域输入阈值在0.6V左右,低电压域输出高电平最低也在0.75V,能正确识别且没有过压风险,此时可以不插;
  • 单向信号,高压域往低压域传,且低压域输入管能容忍高压;
  • 信号已经通过其他机制做了电平转换,比如接到了带有内置电平转换的模拟IP或者PAD;
  • 信号是异步的、低速率的状态信号,且只用于触发中断,即使阈值识别边界模糊,后端通过特殊约束也能满足功能。

省LS的好处很明显:少一级延迟、少一份cell功耗、少布一组电源线。但省的前提是你对电压值和库特性非常清楚。我见过不少设计为了省几个LS cell,最后在硅片上翻车,然后靠ECO补一大堆隔离和转换逻辑,反而更被动。

3.4 物理实现中的PG连接和时序处理

从物理实现角度,Level Shifter cell最需要注意的是PG连接。双电源LS有两个电源pin,综合工具默认只会连一个主电源,后端必须在floorplan阶段就把VDDL和VDDH分配到对应的电源网络,否则DRC不一定报错,但时序和功耗分析结果都是错的。

实际项目中用的标准单元库里,LS cell通常都带always_on属性,表示它不能被power switch关断。因为一旦LS被关断,输出就浮空,后级逻辑全乱。这也是为什么LS在布放时往往会放在常开区域,或者放在专门保留的always-on domain里。

时序方面,LS的输入到输出延时是一个跨电压域的时序弧。在STA时,工具需要同时读入两个电压域的lib view,并且两个域的时序库PVT条件要匹配,否则报出来的setup/hold都是虚的。这里有个小技巧:做multi-corner分析时,不建议为了省时间让低电压域和高电压域跑不同的corner组合,因为LS的时序弧是跨两边的,corner不对会导致margin失真。

4. 常见问题与排查经验

4.1 仿真出现X态或未知态传播

低功耗仿真里最典型的问题,就是关断域的信号在恢复供电后出现X态。表现通常是:仿真波形里,某个跨域信号在关断期间变成红色X,恢复上电后仍然长时间处于X,后级状态机全乱。

碰到这类问题,排查顺序是:先看LS的供电是否正常,再看LS输入端前面的隔离策略是否生效,最后看UPF里的power state table有没有正确描述关断和恢复顺序。

一个常见误区是只给信号插了Level Shifter,没配合isolation。Level Shifter只解决电平匹配,不解决浮空问题。关断域的电源被切断后,即便接了一个LS,LS的输入是浮空的,输出自然也是X。正确做法是三件套一起上:关断域的输出接isolation cell,钳位到0或1,再接Level Shifter转换到目标域电压。现在很多库直接提供集成了isolation功能的LS cell,推荐优先选用。

4.2 UPF规则写了但工具没插入LS

有时候UPF里set_level_shifter写得明明白白,综合之后打开门级网表却发现没有LS cell,跨域信号直接连到后级了。这个问题排查起来很气人。

多数原因是threshold参数设得太大,工具判断两个域的电压差没超过这个阈值,于是认为不需要插。另一个原因是信号被工具优化掉了——综合器发现跨域路径上某个组合逻辑已经把电平“顺便抬高了”,就不会再插独立的LS。还有一种情况是LS规则只约束了input或output方向,但信号实际是双向总线,需要用-applies_to both。

排查技巧是使用工具的命令检查UPF规则覆盖情况。以DC或Genus为例:

check_mv_design -verbose report_level_shifter

这两条命令会列出所有跨域信号以及对应的LS处理状态。看到某个信号出现在unhandled列表里,就说明规则没覆盖到。

4.3 LS的PG连接错误导致功耗异常

LS cell的功耗异常通常不是静态漏电大,而是出现了从VDDH到VDDL的贯穿电流。原因是两个电源域之间本来应该是隔离的,如果LS的VDDL和VDDH在布局时被接成了同一个网络,或者VDDL电源网络被误接到高电压域的电源,那就相当于把两个电压域短路了,电流会一直从高电压流向低电压。

这种问题在早期LVS阶段不一定能查出来,因为LVS更关注连通性,不太关注电压域的归属。需要靠power domain check和IR drop分析来抓。如果跑出来的IR drop结果在某条跨域线上特别异常,而这条线又刚好过了一个LS,优先检查PG连接。

后端工具里可以用列出LS cell的电源pin连接来确认:

get_pins -of_objects [get_cells u_level_shifter_inst] -filter "name =~ VDD*" report_analysis_environment

4.4 时序报告里LS延时异常大

另一种常见问题是LS的延时标得特别大,直接把路径时序打爆。这种情况要区分是真延时还是假延时。

真延时大的原因往往是因为LS的输入由弱驱动cell驱动,或者输出长线负载太大。LS本身的驱动能力是有限的,它主要起电平转换作用,不适合当大扇出buffer用。优化思路是在LS前面加一个驱动足够的buffer,保证输入信号有足够摆率,在LS后面再视情况加buffer驱动后级负载。

假延时大的原因则是STA配置问题。比如LS的输入侧和输出侧用了不同PVT条件下的库,或者没有正确标注VDDL/VDDH对应的电源网络,导致工具计算延时使用了错误的电压值。遇到这类问题,先把LS输入和输出的transition time查一遍,再确认lib里的power pin和UPF里的supply set对应关系正确,基本能定位。

5. 从MCU到BLE SoC:LS其实无处不在

也许有人觉得Level Shifter只是后端工程师的活,跟嵌入式、应用层没什么关系。实际上,现在市面上大量低功耗MCU和低功耗蓝牙SoC内部都集成了多个电压域。比如一些Cortex-M内核的MCU在进入深度睡眠模式后,会关断内核数字逻辑的供电,同时保留RTC域和唤醒控制逻辑的供电,这种场景里一定存在跨电压域的信号接口,内部必然有Level Shifter在默默工作。

如果你在调试某款低功耗蓝牙设备,发现广播电流、连接电流总是偏高,除了检查射频前端和协议栈配置,有时候问题就出在MCU内部某个外围模块没被彻底断电,导致跨域信号通过Level Shifter形成了额外的漏电路径。我在实际调试BLE设备时遇到过类似的情况:设备明明进入了睡眠模式,但IO口某个引脚仍然保持外部上拉,等于给内部的电平转换单元反向供电,电流一下多了几十微安,在电池供电产品里这已经是很严重的浪费了。

另一个容易被忽略的地方是外置电平转换芯片和内置LS的区别。很多板级工程师会在3.3V MCU和1.8V传感器之间放一颗外置电平转换芯片,这颗芯片本质上就是Level Shifter的板级形态。芯片内部的LS cell和这种板级芯片解决的问题一致,但实现方式完全不同:板级芯片需要自己提供两个电源,而芯片内部的LS则是标准单元库的一部分,由后端工具自动布局布线。

所以我说LS是“存在感不强”但“无处不在”的单元。越是对低功耗要求高的产品,多电压域设计越普及,LS的使用就越普遍。一颗看起来平平无奇的蓝牙SoC,内部可能用了成百上千个LS cell,分布在各种跨域接口上。

6. 关于Level Shifter的几条个人经验

最后讲几条我自己在项目里积累的经验,供参考。

第一,做低功耗设计,一定要把LS、ISOLATION、RETENTION这三类cell的关系先理清楚。LS只管电平匹配,ISOLATION管浮空钳位,RETENTION管寄存器的状态保持。三者经常组合使用,但功能边界一定要分清楚,否则你会在仿真阶段被各种X态搞得焦头烂额。

第二,不要过度依赖工具自动插入LS。工具确实能根据UPF自动插,但自动插入的策略偏向保守,经常出现该插的没插、能省的没省。比较好的做法是在RTL阶段就把关键跨域信号单独划到一个group里,明确标注好方向、电压域和是否需要隔离,然后在综合约束里一条一条列清楚。前期多一点设计意图的沟通,后期能省掉大量ECO时间。

第三,LS的时序余量要留足。因为LS本身有转换延迟,跨域路径往往比域内路径延迟大不少。如果一条关键路径刚好跨了两个电压域,就算综合时序能过,物理实现时的布线延迟也可能把它打爆。遇到这种情况,与其在物理实现阶段拆path,不如在架构设计阶段就把跨域关键路径改成都放在高电压域里,避免低电压域承担太高的性能压力。

第四,也是最容易被坑的一点:留意Level Shifter的“方向性”。很多库里的LS只支持低压到高压转换,高压到低压根本不提供。做UPF时,-applies_to both只是说“两个方向都可能需要”,并不代表工具会为每个方向自动选到正确的cell。如果库里没有双向LS,而你又声明了both,工具会报错或者综合出一些莫名其妙的组合逻辑,到时候花在排错上的时间远比一开始手工指定方向多。

低功耗设计做到最后,拼的往往不是哪个技术点多炫酷,而是这些不起眼的单元是否被正确、合理地使用。Level Shifter就是其中最典型的一个——它不显眼,但少了它,整个多电压域的基石就会松动。希望这篇补充能把这块拼图给你补完整。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询