ARTICLE DETAIL

资讯详情

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

数字IC设计入门五要素:宽长比、开关结构、锁存器触发器、版图与毛刺解析

数字IC设计入门五要素:宽长比、开关结构、锁存器触发器、版图与毛刺解析 这几个词放在一起基本就是数字集成电路设计入门时绕不过去的五道坎。宽长比决定管子能流过多少电流传输门和三态门管着信号能不能走、往哪走锁存器和触发器负责把“此刻”记住简单版图是把电路画成硅片上的真实形状而竞争与冒险则是组合逻辑里最让人头疼的毛刺问题。我当年学这部分时最直观的感受是书上的符号都能看懂但真要自己设计一个反相器、画一个D触发器或者排查一个glitch就完全不知道从哪里下手。这篇文章我就把这五块内容串起来讲一遍。不是抄书而是按我实际做项目时的思路来拆每个概念到底解决什么问题、手算和仿真怎么对应、版图里有什么坑、毛刺怎么消。适合正在学CMOS电路设计的学生也适合刚入职做数字IC或标准单元库工作的工程师。读完之后你至少能对“为什么要有这些结构”有一个系统性的认知而不是停留在背公式、认符号的阶段。1. 宽长比CMOS电路里最核心的“设计旋钮”1.1 W/L到底在决定什么从电流公式说起MOS管工作在饱和区时漏极电流公式是Ids (1/2) · μ · Cox · (W/L) · (Vgs - Vth)²这里面的 μ 是载流子迁移率Cox 是栅氧化层电容Vth 是阈值电压而 W/L 就是我们常说的“宽长比”。前几个参数在普通工艺节点下基本是固定的除非你是做工艺开发的所以对一个电路设计师来说真正能动手改的最主要就是 W/L。你可以把 MOS管想象成一根水管栅极电压是水龙头开度Vds 是出水口和入水口的压差而沟道宽度 W 就是管子的粗细沟道长度 L 就是管子的长短。管子越宽能流过的电流越大驱动能力越强沟道越短电流路径越短、电阻越小速度越快但短沟道效应也会更明显。宽长比直接影响三个关键指标驱动能力能拉/灌多少电流、传播延迟给负载电容充放电的速度、功耗动态功耗和短路功耗都跟充放电电流相关。所以在工程上宽长比不是随便定的它是延迟、功耗、面积三者博弈的结果。提示教科书里的平方律公式只是理想模型。到了深亚微米甚至纳米节点速度饱和效应会让电流和 (Vgs - Vth) 呈近似线性关系。但 W/L 对电流的决定性作用依然成立。1.2 手算一个反相器尺寸2倍驱动实例假设我们要设计一个反相器用来驱动一个较大的负载电容 CL 200 fF。管子的工艺参数给一个典型值μn·Cox 200 μA/V²μp·Cox 100 μA/V²迁移率差异导致PMOS约慢一半Vthn 0.4VVthp -0.4V电源电压 VDD 1.8V。第一步先定PMOS和NMOS的比值。因为空穴迁移率只有电子的约一半为了让反相器的上升时间和下降时间对称通常取 PMOS 的宽长比是 NMOS 的 2~3 倍。也就是(W/L)p ≈ 2.5 × (W/L)n第二步估算延迟。用一阶RC模型传播延迟近似为tp ≈ 0.69 · Req · CL其中 Req 是导通管的等效电阻。如果我们希望 tp 小于 200 ps那么Req 200ps / (0.69 × 200fF) ≈ 1.45 kΩ第三步把等效电阻和宽长比关联起来。饱和区电阻的粗略估算Req ≈ VDD / IdsatIdsat 就是上面那个平方律公式。取 NMOS 的 Vgs VDD 1.8V那么Idsat 0.5 × 200 × (W/L)n × (1.8 - 0.4)² 0.5 × 200 × 1.96 × (W/L)n ≈ 196 × (W/L)n μA要使 Req ≈ 1.45 kΩ需要 Idsat ≈ 1.8V / 1.45kΩ ≈ 1.24 mA 1240 μA。于是196 × (W/L)n ≈ 1240 → (W/L)n ≈ 6.3取整就是 NMOS 宽长比大约 6PMOS 取 2.5 倍就是 15。如果最小沟道长度 L 0.18 μm那 NMOS 就是 Wn 1.08 μmPMOS 就是 Wp 2.7 μm。这个手算结果可以直接丢进 Virtuoso 或 HSPICE 里仿真验证。实际仿真可能会发现延迟比手算的大 20% 左右因为还要考虑内部节点的寄生电容和管子的漏电容。这个误差在可接受范围内手算的价值是给你一个“量级正确”的起点而不是精确答案。1.3 匹配与版图里宽长比的那些坑宽长比不只在电学上重要在版图上也有讲究。两个需要严格匹配的管子比如差分对、电流镜它们的 W/L 必须做到“比例精确”。如果两个管子都画成 W2μm、L1μm理论上 W/L 都是 2但光刻时边缘会有偏差长沟道器件受 L 偏差的影响会比短沟道更敏感。工程上常用的做法是用叉指结构multifinger把一个大管子拆成多个小管子并联每个小管子的 W 和 L 保持一致降低梯度误差。加 dummy 器件让边缘管子看到的环境和中间管子一致。电流镜等敏感电路采用共质心布局common centroid把匹配管交叉摆放。宽长比不是标称值实际有效尺寸要减去光刻偏差比如有效沟道长度 Leff L_drawn - 2·ΔL。我记得第一次画镜像电流源两个管子明明画得一模一样仿真结果电流却差了 8%。后来发现是源漏共用区的寄生电阻不一样一个是靠近电源端一个是远离电源端。解决办法是把两个管子对称摆放并把电源走线加宽、加过孔阵列。这件事给我的教训是宽长比匹配不光是图上比例对版图的对称性和寄生也要一起考虑。2. 传输门与三态门两种“开关”的工程取舍2.1 传输门模拟开关的完整导通逻辑传输门Transmission Gate由一个 NMOS 和一个 PMOS 并联组成NMOS 的栅极接控制信号 ENPMOS 的栅极接 EN 的反相。当 EN1 时两个管子同时导通输入和输出之间呈现一个低阻通路当 EN0 时两个管子都截止输入输出断开。为什么要用两个管子并联而不是只用其中一个这里有一个关键限制单个 NMOS 只能传“强0、弱1”单个 PMOS 只能传“强1、弱0”。因为 NMOS 的栅极接 VDD 时它的源极电压最高只能到 VDD - Vthn也就是存在阈值损失而 PMOS 的栅极接 GND 时它的源极电压最低只能到 |Vthp|。两个管子并联后NMOS 负责把低电平拉到 GNDPMOS 负责把高电平拉到 VDD互补之后输入和输出之间就是完整的 0~VDD 范围。这在实际电路里非常关键。比如一个采样保持电路如果只用 NMOS 做开关采样高电平时电容上的电压永远到不了 VDD会损失一个阈值电压严重影响线性度。用传输门就没有这个问题。传输门的导通电阻 Ron 跟输入电压 Vin 有关近似为一个抛物线的形状在两端的导通电阻会比中间大。所以在高精度模拟开关设计里需要把传输门的尺寸做大或采用多路并联、可调衬底偏置来降低 Ron 的平坦度。2.2 三态门数字总线上的高阻态三态门Tri-state Buffer是在普通反相器或缓冲器的基础上增加一个使能控制端。它的输出有三种状态高电平、低电平、高阻态Z。当 EN1 时它就是一个正常的缓冲器当 EN0 时输出管被关断输出引脚对外呈高阻态。高阻态的物理意义是输出既不驱动高电平也不驱动低电平就好比开关断开外部电路可以接管这个节点。这是多路信号分时共享一根总线如 I2C、SPI、内部数据总线的基础。同一时刻只允许一个三态门使能输出其他三态门都处于高阻态总线上的电平就由那个唯一使能的门来决定。三态门内部的结构其实很简单在一个标准反相器后面加一个“输出使能控制”的 NMOS/PMOS 管对。当输出使能无效时同时关断上拉 PMOS 和下拉 NMOS输出自然就悬空。但需要注意悬空节点的漏电问题以及总线上的上拉/下拉电阻配置否则高阻态会导致电平不确定产生浮空噪声。2.3 什么时候用哪个选型经验很多初学者会把传输门和三态门搞混因为它们都像“开关”。我总结了一个简单的判别方式如果你要做的是“模拟信号的通断”信号电平是任意的0~VDD之间都行用传输门。如果你做的是“数字信号的总线复用”输出只需要 0/1/Z 三种状态用三态门。如果你的信号频率很高且需要双向传输比如I/O Pad里的双向缓冲多半是三态门方案因为三态门本身有驱动能力能推大负载电容。如果信号幅度很小且要保证线性度比如音频模拟开关、采样开关只能用传输门而且要做传输门互补控制避免时钟馈通。还有一点在标准单元库里传输门常常被用作锁存器或触发器内部的传输管结构而三态门则更多出现在芯片的 I/O 单元和总线接口上。两种结构各有各的“主场”不存在谁替代谁。从功耗和速度上看传输门的导通电阻相对稳定但有一定损耗三态门因为是数字全摆幅驱动速度更快但输出使能切换时可能产生比较大的动态电流。设计高水平电路时要对这两种开关的瞬态行为有预期。3. 锁存器与触发器时序逻辑的两种“记忆细胞”3.1 锁存器电平敏感的记忆单元锁存器Latch最基本的单元是 SR 锁存器由两个交叉耦合的与非门或或非门构成。真值表标准答案我就不重复了关键是要理解“保持”状态是怎么来的。当 S1、R0 时输出 Q 被置 1当 S0、R1 时输出 Q 被清零当 S0、R0 时两个门的输出会互相维持对方的状态也就是“锁存”。一个更常用的结构是 D 锁存器Data Latch在使能信号 E 有效时输出跟随输入变化E 无效时输出保持使能无效前那一刻的值。它的本质是一个电平敏感元件只要使能端处于有效电平输入变化就会穿透到输出。这个特性在组合逻辑通路没有隔离时会带来一个严重问题——如果输入端在被使能期间发生了多次跳变输出也会跟着跳变导致后续逻辑产生错误的中间状态。所以 D 锁存器通常用在需要“透明传输”的场合比如 CPU 流水线中的某些暂存阶段、异步接口的 FIFO 设计中。做静态时序分析时锁存器的 timing check 也是基于电平窗口time borrowing它允许数据在一个时钟周期内“借”一点时间这在高性能设计中是一种常用技巧。3.2 触发器边沿敏感的同步神器触发器Flip-Flop和锁存器最大的区别在于“边沿敏感”。以最常用的上升沿 D 触发器为例它只在时钟上升沿到来那一瞬间采样输入 D其余时间输出 Q 保持不变。这个特性让触发器成为同步时序电路的基本存储单元。从结构上看一个最经典的 D 触发器可以用“主从式”实现由两个 D 锁存器级联前一个在时钟高电平期间透明后一个在时钟低电平期间透明。当时钟上升沿到来时主锁存器先采样输入从锁存器随后锁存主锁存器的值并输出。这样就能确保时钟边沿之外输入的任何变化都不会影响输出。触发器还有几个关键的时间参数建立时间Setup Time, Tsu数据在时钟边沿之前必须稳定的最短时间。保持时间Hold Time, Th数据在时钟边沿之后必须继续保持的最短时间。时钟到输出的延迟Clock-to-Q, Tcq时钟边沿到输出稳定的延迟。这三个参数是静态时序分析的核心。实际做数字后端时如果某个触发器路径产生时序违例我们首先就要判断是 setup 违例还是 hold 违例。setup 违例通常通过降频或优化组合逻辑来解决hold 违例则需要在数据通路上插 buffer 增加延迟。3.3 为什么静态时序分析里触发器是主角做数字IC设计时我们常说“同步电路用触发器异步电路用锁存器”但绝大多数后端工具默认的处理对象都是触发器。原因很简单边沿触发让数据在每个时钟周期内只采样一次时间边界非常清晰工具可以按“寄存器到寄存器”的路径做精确分析。如果设计里大量使用锁存器时序分析会复杂一个数量级因为锁存器在电平有效期间是透明的路径可以跨时钟周期“借用”时间。所以除非有明确的高速设计需求一般建议尽量用触发器而不是锁存器。我做第一版 CPU 的时候为了省面积在寄存器堆里用了锁存器结果综合后时序收敛非常困难。后来把关键路径上的锁存器全部换成 D 触发器setup 一下子就满足了代价是面积大约多了 10%但设计可维护性大幅提升。这个经历让我明白了在数字后端层面触发器比锁存器友好得多。关于“创建触发器”这个话题很多 EDA 工具如 Design Compiler、Genus在综合时会把 always (posedge clk) 这样的 RTL 代码映射成 D 触发器。如果你 in RTL 里写出电平敏感的 always * 并带有内部状态工具会推断出锁存器这时通常会报 warning。我的建议是如果不是刻意设计锁存器看到这类 warning 必须去修。被综合工具偷偷插入一个锁存器往往是功能 bug 的温床。4. 简单版图从原理图到硅片的最后一公里4.1 基础器件的版图画法简单版图Layout是把你设计的电路真正画到硅片上的过程。最基础的元件包括反相器、与非门、传输门、D触发器单元等。以反相器为例它的版图由三部分组成N阱里的PMOS、P衬底里的NMOS、栅极多晶硅连线。画版图时需要注意的是每个管子的有源区Active/Diffusion要画够大小并且确保源漏两端有足够的接触孔Contact来连接金属层。PMOS 一定要放在 N阱 里N阱周围要有够宽的阱边界避免闩锁效应Latch-up。多晶硅栅可以横跨有源区但栅两端要伸出来足够长保证刻蚀时不会把栅切短。衬底接触Tap不能省NMOS 要接 P tap 到 GNDPMOS 要接 N tap 到 VDD否则器件会浮体电平不稳定。对于标准单元库来说版图还需要满足单元高度一致、电源轨横向贯穿、输入输出端口对准等要求。我之前画过一个 D 触发器的版图尺寸大概是 3.4 μm × 5.04 μm在 0.18 μm 工艺下内部用了几层金属走线。信号线尽量走 Metal 1时钟线走 Metal 2 并且要尽量短、对称减少时钟偏斜。4.2 布线、寄生与DRC/LVS简单版图画完之后必须跑两个检查设计规则检查DRCDesign Rule Check和电路一致性检查LVSLayout vs. Schematic。DRC 检查你的版图有没有违反工艺规则比如最小线宽、最小间距、孔的大小范围等。LVS 检查版图提取出来的电路网表和原理图网表是否一致包括管子的宽长比是否对得上、连线有没有接错。初学者最容易在 DRC 上栽跟头。我记得第一次画版图报了几十个错全是“Metal1 spacing violation”和“poly contact enclosure不够”。这些不是难事但非常磨人需要逐条修改。经验是画之前先建好格点grid所有图形边缘都落在格点上能避免大量间距错误。多用快捷键保证矩形对齐。跑 DRC 要分层看比如先只查 Active 层再查 Poly最后查 Metal不要等全部画完再一次性查否则错误太多很难定位。寄生参数对版图性能的影响也很直观。走线越长寄生电阻和电容越大信号延迟越大。一个负载为 100 fF 的反相器如果输出走线用 Metal 1 走了 100 μm额外增加的寄生电容可能会有 20~40 fF占负载的很大比例。所以在版图阶段关键节点和时钟线要优先画短、画宽并且利用高层金属如 Metal 3/4做长距离低阻走线。4.3 我的版图初战教训我画版图时踩过一个大坑是“N阱接反”。PMOS 的衬底必须接 VDDN阱电位也是 VDDNMOS 的衬底必须接 GND。有一次我为了图省事把 N阱的 tap 接到了某个中间电平结果电路仿真没问题但流片后严重漏电芯片功耗比预期大了三倍。后来排查 LVS 报告才发现 N阱电位连接错误。另一个教训是电源和地线的宽度。我给一个反相器链画电源线时用了最小宽度 0.24 μm结果仿真中后级反相器切换时电源线上产生了很大的电压降落IR drop导致前几个反相器的延迟明显变大。改成 1 μm 电源轨之后问题就消失了。版图阶段一定要先规划好电源网络不能先画完管子再随便拉一条细线当电源。5. 竞争与冒险组合逻辑里的“毛刺”问题5.1 竞争与冒险的本质是什么竞争与冒险Race and Hazard是组合逻辑里最经典、也最容易被初学者忽略的现象。简单说当同一个逻辑门的多个输入信号不是同时变化时输出在跳变过程中可能会产生一个短暂的“毛刺”glitch也就是非预期的窄脉冲。这个窄脉冲足够窄的时候后续触发器可能采到错误数据。冒险分为两类静态冒险输入变化前后输出理论值应该不变但中间出现了一个短暂的反向毛刺。动态冒险输入变化前后输出理论值应该变化但跳变过程中出现了多次翻转。动态冒险比静态冒险更难消除。举个例子考虑逻辑 Y A · B A · C。当 BC1 时Y 应该恒为 1。但 A 从 0 跳变到 1 时A 从 1 变为 0如果 A 的这条路径延迟比 A 的那条路径长那么在某个瞬间两条与门输出可能同时为 0Y 就出现一个 0 毛刺。这就是静态 1 冒险。5.2 卡诺图判断与消除方法用卡诺图判断冒险非常直观。在卡诺图中如果两个相邻的“1”格之间存在一个“圈”implicant覆盖而实际逻辑表达式没有用这个圈来覆盖那么这两个相邻状态之间就存在冒险。消除冒险的经典方法就是“加冗余项”。还是上面那个例子Y A·B A·C卡诺图上 BC1 的相邻格之间存在隐患。解决办法是再加一项 B·CY A·B A·C B·C这样当 BC1 时冗余项 B·C 恒为 1即使 A 和 A 的两条路径存在延迟差Y 也能保持 1毛刺就被消除了。代价是多一个与门面积和功耗略有增加。需要强调的是卡诺图冗余项方法只适用于“单输入变化”下的静态冒险。在实际数字电路里多输入同时变化的情况非常普遍而且布线延迟、门延迟的差异导致我们不能简单依赖逻辑化简来解决所有毛刺。5.3 同步设计里处理冒险的工程手段在真实的数字IC设计流程中我们不会指望靠卡诺图把每个组合逻辑的毛刺都消干净因为那根本不现实。工程上更通用的手段有加输出寄存器在组合逻辑的输出端口加一级 D 触发器毛刺只要不在时钟边沿附近出现就会被寄存器过滤掉。这是最有效、最常用的做法。改善时钟方案如果时序电路在毛刺发生时刻的建立/保持窗口内采样就会出错。合理约束时钟偏斜让采样点避开毛刺区域。平衡路径延迟尽量让同一逻辑门的不同输入路径延迟接近减少多个输入到达时间差。不过这只能缓解不能根除。使用格雷码编码在多比特信号跨时钟域或状态机跳转时采用每次只变化一位的编码方式从根上避免多信号竞争。这是状态机设计里的经典技巧。我在做流水线 CPU 时ID 阶段的写寄存器地址信号是经过一堆译码逻辑产生的结果仿真时发现 register file 的写使能经常采到毛刺。查了半天发现是写地址的两位信号路径延迟差太大译码器输出短暂出现了一个错误的中间值。最终我用寄存器在写地址送入译码器之前打了一拍毛刺问题就解决了。注意组合逻辑毛刺在仿真里不一定总是可见。只有当仿真精度足够、延迟建模足够细时毛刺才会被反映出来。功能级仿真经常“看不到”毛刺所以做时序仿真和静态时序分析非常必要。6. 把这五块知识串起来一个最小项目实战讲完五个单独的概念我想用一个最小项目把它们串起来设计一个带三态门输出的 D 触发器单元版图画出来并验证它没有竞争冒险问题。第一步确定电路结构。用两个 D 锁存器主从级联构成 D 触发器输出端加一个三态门使能信号为 OE。这样可以接到共享总线上。第二步算尺寸。输出三态门要驱动较大的总线电容PMOS 宽长比取 12/0.18NMOS 取 6/0.18保证上升下降对称。内部锁存器的管子尺寸可以小一些因为只驱动内部节点。第三步画版图。电源轨上下分布PMOS 在上半部分、NMOS 在下半部分。时钟信号 CLK 和 CLKB 用 Metal 2 走尽量短且对称。D 输入走 Metal 1Q 输出接三态门后通过 Metal 3 引出。第四步跑 DRC 和 LVS确保版图无误。再做后仿真提取寄生参数后验证 setup/hold 时间是否满足要求。如果输出总线上出现毛刺检查三态门使能信号的时序确保 OE 切换是在时钟边沿之后的稳定期。第五步做一次简单的时序分析。假设时钟周期 10nsD 触发器 Tcq 为 0.5ns三态门输出延迟为 1ns总线寄生电容造成 0.5ns 延迟那么从时钟边沿到总线稳定大约需要 2ns。如果总线上还有其他模块在驱动必须保证同一时刻只有一个 OE 有效否则会出现总线冲突轻则功耗大增重则烧毁驱动管。这个小项目并不复杂但它把宽长比、传输门/三态门、锁存器/触发器、简单版图、竞争与冒险全部串了起来。做完一遍之后你再看课本上的那些孤立概念会有完全不同的感觉。单看这些概念每一个都不难难点在于它们之间的耦合。尺寸算得再准版图画得不匹配性能照样拉胯触发器建得再标准组合逻辑毛刺没管好时序照样违例三态门使能控制不好总线冲突可能直接烧片子。这些东西书上不会一次性讲透只有在实际画过、流片过、调试过之后才会真正长在身上。希望这篇文章能帮你把五块碎片拼成一块完整的地图少走一点我当年走过的弯路。
返回列表