ARTICLE DETAIL

资讯详情

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

多电压域设计必修课:Level Shifter原理、插入流程与STA约束实战

多电压域设计必修课:Level Shifter原理、插入流程与STA约束实战 聊到低功耗设计绕不开的一个基础概念就是Level Shifter cell。这几年芯片项目越做越多从MCU到SoC再到各类AI加速器几乎每个项目都会碰到多电压域设计而电压域之间要通信Level Shifter就是那个必不可少的“翻译官”。这篇不是教科书式的理论堆砌我会以实际项目中用Level Shifter的经验为主线把原理、选型、插入流程、时序分析以及踩坑排查串起来讲适合正在做低功耗芯片设计、数字后端实现或者验证的同学参考。我先说个比较扎心的现状很多新手对Level Shifter的理解停留在“两个电压域之间要加一个电平转换单元”这个层面但真到了项目里什么时候插、插哪种、UPF里怎么写、STA怎么约束、怎么防止综合工具把它优化掉问题一个接一个。这篇文章就把这些摊开来聊一遍。1. 为什么聊Level Shifter多电压域是低功耗的第一课1.1 低功耗的核心手段之一是电源管理芯片功耗由动态功耗和静态功耗两部分构成。动态功耗主要是翻转功耗和负载电容充放电带来的开销静态功耗则来自漏电流。当成工艺节点逐步从28nm往更先进节点走漏电流占比会越来越不容忽视。低功耗设计里最直接、最有效的思路之一就是“不用的时候少给电、给低电”这引出了多电压域Multi-Voltage Domain设计。所谓多电压域就是把芯片内部的逻辑划分成多个电压区域。比如CPU核心跑在0.8V的高性能电压域而低速外设、GPIO、电源管理逻辑跑在0.6V的低电压域。高电压域满足性能要求低电压域降低功耗整个芯片的平均功耗因此能明显降下来。这个思路在很多低功耗SoC和MCU上都有应用像一些基于Cortex-M系列的低功耗芯片内部就有好几个电压域在做精细化电源管理。但电压域一旦被切分问题就来了不同电压域之间的信号传递没法直接用一根线连过去。原因很好理解一个模块的输出高电平是0.8V另一个模块的输入却需要0.6V的逻辑电平高电平的判定阈值可能完全对不上。甚至在某些场景下如果一个高电压域的信号直接灌入低电压域的端口还可能造成漏电路径异常甚至损伤器件。这里的核心需求就指向了Level Shifter cell。1.2 Level Shifter的“翻译官”职责Level Shifter cell电平转换单元就是用来将信号从一个电压域的电平标准转换成另一个电压域的电平标准。它做的事情和翻译官类似两个说不同语言的人要交流需要一个翻译把一方的话换成另一方听得懂的语言。在数字芯片里一个信号从1.2V的电压域进入0.8V的电压域需要经过Level Shifter把1.2V的高电平转换为0.8V的高电平同时保证0和1的逻辑值不丢失、传输延时可控。反过来说从低压域往高压域传信号同样需要转换。这个转换过程看似简单实际里面涉及电路结构、时序约束、物理实现等多个层面的问题。我遇到不少初学者会把Level Shifter和Isolation cell混为一谈。这里先做个区分Level Shifter解决的是“不同电压域之间的电平匹配”问题而Isolation cell解决的是“某个电压域断电时输出信号不能悬空或者产生不定态”的问题。两者经常配合使用但职责完全不同。后面我会再细讲它们协作时的注意事项。2. Level Shifter的工作原理与核心结构2.1 从反相器链到电平转换电路结构拆解Level Shifter的实现方式在不同工艺库里会有些差别但经典结构通常基于交叉耦合的PMOS负载和差分输入对。为了便于理解我把它类比成一个“带电压翻倍功能的反相器”。普通反相器由一颗NMOS和一颗PMOS组成输出高电平就是供电电压。Level Shifter的核心思路则是输入级仍然由低压域信号驱动但输出级的电源接到目标电压域的高压电源上。这带来的一个关键问题是如果NMOS输入端的电压低于输出级PMOS的阈值电压PMOS可能无法完全关断产生直流导通电流。所以很多Level Shifter结构里会引入交叉耦合的PMOS用它来保证输出节点能完全被拉高到目标电压域的高电平同时避免静态电流过大。实际项目里我不建议大家自己设计Level Shifter电路大多数时候是直接从工艺库的标准单元里挑。但理解这个结构有个实际意义你知道它内部存在交叉耦合结构时序开销和面积开销都不会太小所以在做floorplan或者低功耗规划时得给它预留足够的资源和位置。2.2 两种主流类型电平上转换和下转换以及单向双向之分从方向上分Level Shifter分为上转换Low-to-High和下转换High-to-Low两类。上转换是低压域信号驱动高压域负载比如从0.7V到1.1V下转换则相反从高压域往低压域传。这里有个容易被忽视的细节有些工艺库里下转换可以不做专门的Level Shifter。原因是高压域的高电平对于低压域来说逻辑1判定通常没有风险但上转换几乎必须使用专用的电平转换单元。这背后涉及阈值、输入耐压以及漏电路径的综合判断不能拍脑袋决定。从方向性上分还有单向和双向的Level Shifter。双向单元适合那些信号方向在运行时会变化的接口比如I2C这类双向总线。不过双向Level Shifter在数字后端里约束起来会麻烦一些因为你得额外设置方向控制信号在综合和时序分析时也要小心处理双向端口。2.3 关键电气参数怎么读懂库里的Level Shifter从工艺库的.lib文件里Level Shifter cell主要有这么几组关键参数需要关注输入电平范围与输出电平范围明确这个单元支持从多少伏转换到多少伏。输入阈值Input Threshold输入高电平判定的最小电压这决定了低压域信号能否被正确识别。传播延时Cell Rise/Fall Delay信号经过单元后的时序开销。功耗特性Internal Power单元自身的动态功耗和漏电功耗。面积。这几项参数里传播延时和功耗之间通常存在trade-off。我见过有人为了极端低功耗去选延时很大的Level Shifter结果在后端时序收敛时吃了大亏。建议选型时把上升沿和下降沿的延时都抓出来看最好做一下电压-延时曲线别只看库里的typical corner数据。参数影响选型建议输入输出电压范围是否适用于特定电压域组合确认最差corner下仍满足要求传播延时影响路径时序裕量关键路径避免选大延时单元静态功耗对整体漏电影响常开电源域选低功耗版本面积影响布局布线资源预估数量后提前规划空间3. 项目实战Level Shifter的插入与实现3.1 UPF里怎么声明和连接在多电压域设计中UPFUnified Power Format是描述电源意图的标准格式。Level Shifter在UPF里通常通过set_level_shifter相关约束来声明。典型的操作包括指定需要插入Level Shifter的电压域边界、指定电平转换策略以及指定使用哪个库单元。我举个例子假设有两个电压域PD_CORE运行在1.0VPD_IO运行在1.8V两个域之间有一条数据总线。在UPF里你可以这样描述电源域划分然后声明一条level_shifter策略让工具自动在边界插入合适的转换单元。这里需要特别提醒的是UPF只是声明了“意图”真正插入Level Shifter是综合工具或后端工具来完成的。如果UPF写得不够完整比如漏掉了某些跨域路径工具可能就不会自动插入Level Shifter后面等到仿真或者流片回来才发现问题代价非常大。所以每次写完UPF我都会自己检查一遍所有跨域信号确保没有遗漏。3.2 什么时候必须插什么时候可以省实际项目里不是所有跨电压域的信号都需要Level Shifter。是否插入取决于几个条件第一两个电压域的电压值是否存在差异。如果两个域虽然名字不同但实际电压完全一样那通常不需要插入电平转换但最好在UPF里显式声明避免工具默认插入造成面积浪费。第二接收端是否能容忍输入电平的偏差。上转换场景低压域信号驱动高压域接收端时如果低压域的VDDH无法达到接收端高电平的最低要求就必须插。下转换场景很多标准单元输入端本身就兼容更高电压这时候可以不用插。第三是否存在断电场景。如果某个域会断电即使电压值匹配也往往需要配合Isolation cell使用而Level Shifter的位置要放在断电域边界之外否则它也随断电域一起失电起不到转换作用。我在一个MCU项目里就碰到过这种情况两个域正常工作电压相同但其中一个域会频繁进入睡眠断电状态。一开始为了省面积没有插Level Shifter结果断电域的输出通过内部反偏二极管等路径产生漏电导致睡眠电流指标超标。后来加了Isolation cell再配合电平转换才把问题解决。3.3 综合和布局布线阶段的自动化处理Level Shifter的插入可以发生在逻辑综合阶段也可以发生在物理实现阶段。两者的区别在于综合阶段插入工具对时序和面积有更全局的估算物理实现阶段插入位置信息更真实但改动成本更大。常见做法是让综合工具在网表阶段完成大部分Level Shifter插入后端布局布线阶段只处理遗漏和优化。这样网表从综合出来就带有电平转换单元后续仿真验证也能更早覆盖到这些单元的功能和时序。但自动化处理不等于不需要人工干预。我通常会检查综合报告里的level_shifter相关条目确认插入数量、插入位置是否符合预期。如果一个高扇出的跨域信号没有插上Level Shifter就要回过头检查UPF约束和目标库是否完整。4. 时序分析与低功耗验证里的Level Shifter4.1 为什么STA要为Level Shifter单独设置约束信号经过Level Shifter会产生额外的延时和输出转换时间变化。在静态时序分析STA中库里的timing arc已经包含这些信息但如果你在SDC里没有合理设置时钟域、输入延时、输出延时分析结果就可能和实际不符。我在一个项目里遇到过一次很有意思的现象STA报告显示一条跨域路径延时很小时序非常收敛但芯片回来后跑功能测试却一直出错。后来排查发现那条路径上其实需要Level Shifter但工具没插上STA误以为信号直接通过金属线传播自然很乐观。这个案例让我养成了习惯每次做STA都会重点check所有跨电压域路径确认路径上确实存在Level Shifter并且时序arc被正确分析。另外Level Shifter的输出驱动能力通常比普通缓冲器弱尤其是在低电压侧。如果后面带的负载比较大会出现信号的transition time严重超标这时候需要额外加一级buffer或选择驱动能力更强的Level Shifter版本。4.2 电源关断与电平转换的协同检查当芯片里既有多个电压域又有关断电源域的机制时Level Shifter和Isolation cell的协同关系就变得非常关键。断电域的高压信号在域断电后会自动掉到0V此时如果该信号不经过隔离直接送进常开域挂在常开域输入端的Level Shifter可能因为输入悬空而出现不定态或者产生额外的漏电流。所以设计规范通常是先隔离再转换。也就是说常开域接收来自断电域信号时需要在断电域边界处放置Isolation cell把断电域的输出钳位到安全电平然后再经过Level Shifter进入常开域。这个顺序千万别搞反。如果先接Level Shifter再接隔离单元断电瞬间Level Shifter的输入侧可能已经变得不可控。我记得最严重的一次就是断电域反复开关时常开域里出现了一连串的X态传播直接导致低功耗验证失败。低功耗验证这里特别要说一下如果你用的是UPF-based验证流程simstate和iso相关的检查工具会在仿真时自动报告这类X态传播问题。关键是要在验证计划里专门列出一条“跨域断电场景测试用例”覆盖断电域上电、断电、睡眠唤醒等各个状态切换点否则光靠静态检查很难发现所有风险。4.3 低功耗意图一致性检查LPCLevel Shifter相关的另一个重要环节是LP CheckLow Power Check也叫低功耗意图一致性检查。这类检查会比对UPF描述的电源意图和网表实现是否一致比如检查是否存在没有插Level Shifter的跨域路径、插入的Level Shifter是否在正确的电源域边界、是否存在把转换单元放在错误位置导致功能异常的情况。我建议在综合后和布线后各跑一次LP Check。综合后跑可以尽早发现UPF缺失布线后跑可以确认物理实现阶段没有发生单元替换或优化导致的问题。特别是现在很多后端工具在做低功耗优化时会自动替换或删除一些单元如果约束不到位Level Shifter会被当作普通buffer优化掉这类问题只能靠LP Check来兜底。5. 常见问题与排查技巧实录5.1 电平转换漏插的典型症状漏插Level Shifter的症状并不总是第一时间暴露。常见表现有这几类功能仿真出现不定态X态尤其在跨域数据比较路径上静态时序分析报告显示路径延时偏小但实际芯片时序裕量不足芯片实测低功耗模式下电流异常偏高ELTElectromigration Level Test或者EMIR分析发现某些跨域Net上的异常电流峰值。如果你在后端实现中遇到以上现象建议优先排查跨域路径上是否真的存在Level Shifter。怎么快速查我习惯在网表里抓出所有跨电源域信号的driver和receiver逐条确认有没有电平转换单元。一些低功耗EDA工具也支持自动生成跨域路径报告直接按电压域维度过滤更快。5.2 防止Level Shifter被优化掉综合工具在优化网表时有时会因为“logic equivalent”判定而把一个单元替换或删除。Level Shifter在某些工具里如果没被属性标记为dont_touch确实存在被优化掉的风险。我常用的加固方法有几种第一在UPF里将level_shifter策略设置为tie_off或rule相关模式让工具强制插入。第二在综合脚本里对Level Shifter相关实例设置dont_touch属性。第三在SDC里加set_case_analysis或set_voltage相关约束使工具能正确识别电压域边界。我这个建议可能听起来有点“土”但确实是我在项目中验证过最有效的方式插入完成后检查一遍网表里Level Shifter实例数量和综合报告里预期数量是否一致。如果不一致优先查是不是被优化掉了不要急着往下走流程。5.3 功耗、面积、时序的平衡心得最后聊一点个人经验。Level Shifter本身会带来功耗和面积开销所以不是插得越多越好。合理的规划思路应该是这样在架构阶段先明确哪些模块之间需要频繁跨域通信尽量把高频交互的模块放在同一个电压域内减少跨域次数。在实现阶段对必要的跨域信号进行合并和复用比如把多条控制信号统一编组后再跨域而不是每根信号都单独插一个Level Shifter。在评估阶段统计Level Shifter的面积占比和功耗贡献如果发现占比过高回头审视电压域划分是否合理。我从多个项目里得到的体会是Level Shifter相关问题的本质往往不是单元选型本身而是电压域规划不够清晰。很多看起来是Level Shifter没插对的地方根源是前面电源域切分时就没有考虑清楚信号流向。所以如果你在项目中反复被这类问题困扰不妨往回退一步重新审视一下多电压域的划分合理性。还有一个很实用的小技巧在芯片架构评审时让负责UPF的人、负责后端的人、负责验证的人坐在一起把电压域示意图从头到尾过一遍每一根跨域信号都明确指定它是否需要Level Shifter、是否需要Isolation、方向是什么并且在文档里记录下来。这个动作看起来花不了多少时间但它能避免后面至少80%关于低功耗单元插入的扯皮和返工。我自己在实际项目中做过一次这样的评审当场就发现两条关键总线的跨域方向定义反了如果按原方案走下去等芯片回来后不是死等就是高功耗后期改版成本会非常难看。所以细节归细节低功耗设计里那些看起来最基础的概念往往才是最值得多花时间去较真的地方。
返回列表