ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Level Shifter电平转换单元:多电压域低功耗设计的关键细节

Level Shifter电平转换单元:多电压域低功耗设计的关键细节 前两篇把多电压域和电源关断聊完了本来准备一口气把电平转换单元也写掉结果越写越长只能单独拆出来。这篇专门补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.72V0.8V减去一定压降1.8V IO域要求输入高电平至少达到1.8V的65%左右也就是1.17V0.72V远低于1.17V1.8V域根本识别不出这是逻辑1信号进来就是乱码。反过来的方向1.8V域输出1电平大约1.62V0.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 ShifterUPF是目前最常用的低功耗设计约束格式。要在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只解决电平匹配不解决浮空问题。关断域的电源被切断后即便接了一个LSLS的输入是浮空的输出自然也是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_environment4.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 SoCLS其实无处不在也许有人觉得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就是其中最典型的一个——它不显眼但少了它整个多电压域的基石就会松动。希望这篇补充能把这块拼图给你补完整。
返回列表