传输门与传输管逻辑实现全加器:从原理到仿真的设计指南
全加器这东西说实话在数字IC设计里属于“不起眼但无处不在”的角色。但凡做过加法器、乘法器、ALU甚至只是给计数器加个进位链都绕不开这几十个管子。而我个人一直觉得全加器是最适合拿来练逻辑风格和电路结构手感的一个单元——它既有组合逻辑的复杂性又有进位链这样天然的模块化接口规模又足够小可以一轮又一轮地推倒重来。今天想聊的是用传输门Transmission Gate和传输管逻辑Pass-Transistor Logic来实现全加器。这两种技术都是“用开关去传输信号”的思路跟传统的CMOS互补逻辑完全不一样设计出来的电路管数少、速度快、功耗也低但代价是逻辑设计时要多留几个心眼。这篇内容不打算照着课本念原理我尽量按实际做项目的思路来拆从为什么选这种结构到具体怎么搭再到仿真时踩过的坑一次讲清楚。1. 为什么全加器值得用传输门和传输管来做1.1 全加器逻辑的两种等价化简先回到最基础的东西。全加器有三个输入A、B、Cin两个输出S、Cout逻辑表达式通常是Sum A ⊕ B ⊕ CinCout A·B Cin·(A ⊕ B)教科书上还有一种等价写法把A⊕B提出来作为中间变量P A ⊕ B进位传播信号G A·B进位产生信号那么 Sum P ⊕ CinCout G Cin·P为什么要强调这种变形因为一旦把P作为公共信号求和和进位两条路径就可以共用同一个异或生成电路这正是传输门/传输管逻辑最擅长的场景——用最少的管子生成差分的中间信号然后用开关把它送到对应的输出端。如果用传统的静态CMOS互补逻辑去搭上面的表达式一个异或门最省要8个管子与非门、或非门各要4个一个完整的全加器大概28到32个管子。而换成传输门结构一个异或或者同或可以压缩到4个管子整个全加器能做到12到14个管。管数少了寄生电容和面积都下来了关键是关键路径上的管子级数也变短了速度自然上去。1.2 传输门与传输管逻辑的本质区别这里必须先说清楚一个很多人会混淆的点传输门和传输管是两种不同的器件结构虽然名字像工作方式也沾点边但特性差别很大。传输门TG是一个NMOS和一个PMOS并联NMOS的栅接控制信号CPMOS的栅接控制信号的反相。当C1时两个管子同时导通输入信号可以从源端跑到漏端输出基本没有压降损失。用生活里的东西打比方传输门像是一扇双向平开门里外都能推开关闭合时人在走廊里来回走几乎没阻挡。传输管PTL则只用一个MOS管可能只有一个NMOS也可能只有一个PMOS。单管导通时它本质上是个有压降的开关——NMOS传高电平只能传到VDD-Vthn传低电平可以传到比较干净的GNDPMOS则反过来传高电平比较干净传低电平会停在Vthp附近。这两种器件在传输信号上的能力差异直接决定了电路结构怎么搭。传输门适合用在需要保持信号完整摆幅的路径上比如后面还要再接反相器或者逻辑门的节点传输管则更多用在“电平有损失也没关系后面反正会恢复”的场景或者干脆就是用来做NAND/NOR这类天然不要求摆幅无损的结构。1.3 方案选型MUX结构和异或结构两条路线用传输门和传输管做全加器业内基本有两条成熟路线。一条是MUX多路选择器路线。用传输门搭二选一选择器利用P A⊕B作为选择信号将进位和输入端的组合关系送到输出。Cout (A·B) Cin·(A⊕B) 实际上就是一个以P为选择信号的二选一当P0时输出AP1时输出Cin。这样连与非门需求都省了非常优雅。另一条是异或/同或启动路线。先用4个管子做一个异或或同或电路得到P或者PB然后用它去控制求和路径和进位路径的选择开关。我在实际设计里更倾向于后者因为它的信号走向更规整P或者PB在生成后分两路走一路用于S输出一路用于Cout输出两边逻辑都有天然缓冲效果不容易出现某一侧负载特别重的失衡情况。MUX路线虽然省管子但对信号摆幅的敏感度更高尤其是在低电压工作条件下容易翻车。2. 传输门和传输管的核心特性摆幅、体效应和串扰2.1 传输门完整摆幅传输的条件传输门能实现“无损传输”并不是无条件的。它的NMOS和PMOS是互补并联的当控制信号C1、CB0时两个管子都导通输入信号无论是高是低都能找到至少一个合适的导通路径传高电平时PMOS管的源漏压差小导通电阻本来就低可以尽力把节点拉到接近VDD传低电平时NMOS管的源漏压差小同样能拉到接近VSS。但有两个前提一是控制信号的摆幅必须完整如果C或者CB本身被衰减过比如只有VDD-Vth那么高那传输门的导通能力会明显下降输出摆幅就保不住了二是输出端必须有一些电容负载传输门本质上是靠对负载电容充放电来传输电平的如果输出端悬空且没有任何寄生电容那电平根本建立不起来。所以在设计传输门全加器时所有控制信号尤其是P或PB的生成电路必须确保有足够强的驱动能力和完整摆幅否则后面所有路径都会跟着遭殃。2.2 传输管阈值损失的量化分析单管传输的压降问题很多人记了个大概但具体损失多少未必算过。拿NMOS传高电平来算NMOS导通的条件是VGS Vthn也就是栅极电压VG减去源极电压VS必须大于阈值电压。如果源极输入是高电平VDD栅极接的也是VDD那么输出端最高只能到VDD - Vthn因为一旦输出端电压接近VDD - VthnVGS就跌破阈值了管子自动截止。具体数值要看工艺和体偏置。在典型0.18μm工艺里NMOS阈值电压大约0.4到0.5V一个纯NMOS传输管传高电平输出大概停在1.3到1.5V左右VDD1.8V损失差不多四分之一到三分之一的信号摆幅。如果后续电路直接把这信号当作逻辑输入很容易造成NMOS弱截止、PMOS弱导通的状态静态功耗飙升甚至逻辑错误。PMOS传低电平则是镜像情况输出会停在Vthp附近也就是大约0.4到0.5V下不来零。PMOS传高电平倒是干净但PMOS的电子迁移率只有NMOS的一半左右同样的尺寸下导通电阻会大很多速度上不如NMOS。2.3 体效应对阈值电压的影响传输管还有一个特别坑的地方——体效应。MOS管的衬底电位不总是等于源极电位尤其是传输管作为开关时源极和漏极的角色会互换。比如NMOS传输管刚开始传高电平时源极在输入侧衬底接GNDVSB0没问题但当输出端逐渐被充到接近VDD-Vthn源漏角色互换原来的输出端变成源极此时衬底仍然接GNDVSB变成了负值。体效应会让有效阈值电压升高等效于开关的导通能力进一步下降。公式是Vth(net) Vth0 γ·(√(2ΦF VSB) - √(2ΦF))这里γ是体效应系数通常在0.4到0.6之间ΦF是费米势大约0.3V。代入VSB-0.8V这种场景阈值电压可能会增加0.2V以上。这意味着传输管不仅传高电平压降大而且传着传着压降还在变大输出电平根本稳不住。这是传输管逻辑在实际设计中最难搞的地方解决思路一般有两种要么在传输管后面加恢复电路比如静态反相器、锁存器把电平重新拉回完整摆幅要么尽量把传输管放在关键路径的低摆幅容忍节点上避免它产生的衰减信号继续驱动别的传输管。2.4 传输门做异或门的两种经典结构利用传输门实现异或或者同或是搭全加器的基础。最简单的方案是用两个传输门加上两个反相器结构如下输入B被一对互补控制信号A和AB选择当A1时输出等于B取反A0时输出等于B于是得到Y A⊕B或者Y A⊙B差别只在于输出端有没有再加一级反相器。这种结构的优点是输出摆幅完整因为用的是传输门输入信号直接传到输出节点中间的信号路径上没有阈值损失缺点是控制信号A和AB都要有足够的驱动能力如果A本来就是某个逻辑门的输出驱动能力不够控制摆幅会变形导致传输门导通电阻不稳。另一种更省管子的做法是用两个NMOS交叉耦合再加两个PMOS管。这种结构少了一对反相器但信号摆幅需要特别留意因为交叉耦合的PMOS管在拉高输出时本身就存在阈值损失输出高电平可能只有VDD-Vthp。这个信号再往下传就没那么靠谱了。我个人的建议是在核心设计里不要为了省两个管子而牺牲摆幅。全加器这种单元通常是要级联的你这次省了两管下一级就得花四个管子在恢复摆幅上整体未必划算。2.5 全加器真值表与关键信号的重组写到这里顺便把全加器的真值表摆一下后面讲电路就全靠它做基准ABCinPA⊕BGA·BSP⊕CinCout00000000010010010101001110011001010101100111001111110101从真值表能看出一个有趣现象P为1即A和B不同时Cout直接跟Cin走P为0即A和B相同时Cout等于A也等于B。这正是MUX结构能成立的基础。而S信号永远等于P ⊕ Cin这又是一个异或操作可以用跟前面一样的结构复用。整个全加器如果规划得好只需要一级异或生成P再用P作为控制信号搭两级二选一多路选择器就能同时得出S和Cout。这就是传输门/传输管全加器最核心的设计思路。3. 完整实操14管传输门全加器从原理图到仿真3.1 总体结构信号流与控制信号的规划我在项目里实现的是一个经典的14管传输门全加器管数分布在三个模块模块功能管数异或/同或模块生成PA⊕B和PBA⊙B8使用传输门结构进位MUX模块生成Cout2传输门二选一求和MUX模块生成S4传输门二选一反相器反相器产生控制信号及输出整形若干注意这里的14管是把反相器也算进去了的如果只算核心开关管还要更少。整个信号流的规划顺序是A和B先进异或/同或模块生成P和PB两个差分信号P和PB同时扇出到两个MUX模块。因为P和PB是差分对MUX的选择控制基本上不需要额外生成反相信号一个模块里直接用P和PB各控制一个传输门就行省了一级反相器延迟。3.2 异或/同或模块的4管传输门实现这一步是整个设计的精华。用两个传输门搭异或/同或原理图可以这样描述传输门TG1控制端接A反向控制端接AB输入端接B传输门TG2控制端接AB反向控制端接A输入端接B取反需要一级反相器两个传输门的输出短接在一起就是同或输出Y A ⊙ B这里的关键是B取反需要一级反相器。反相器本身要两个管子所以一共是4个传输管加2个管子的反相器这就是“4管异或”的来历——严格说是4个开关管加2个反相管。实际测试下来这个结构的延迟主要来自两个地方一是B信号要经过反相器才能变成B取反这会比B慢半拍二是两个传输门的输出短接节点有一定电容充放电速度受限。所以A信号如果跟B一样从外部输入进来建议在A进入模块前先加一级缓冲器把上升沿和下降沿修整齐一点同时提升驱动能力。如果你用的是Cadence Virtuoso或者类似的原理图工具画这个模块时建议将两个传输门的输出节点冗余地引出来加个探测点方便仿真时直接观察节点波形。传输门输出节点是最容易出现毛刺和摆幅问题的地方。3.3 进位MUX模块用传输门实现二选一Cout生成是本设计里最简单也最关键的路径。用P作为选择信号数据端接两个值当P0时输出接A其实也可以是B因为AB当P1时输出接Cin。于是Cout就直接等于二选一的结果当P 1时选通Cin → Cout Cin当P 0时选通A → Cout A实现就是两个传输门一个由P控制一个由PB控制两个输出短接再加一个反相器整形。这种接法连与门和或门都不需要直接用传输门的开关特性把组合逻辑吞掉了。实际设计时这个MUX的输出一定要加反相器做整形吗我会说看下游负载。如果Cout直接接到下一级的同位置端口而且下一级也是类似的传输门结构那不加整形其实也能工作但摆幅可能有轻微损失。稳妥起见我建议加一级反相器顺便隔离负载避免Cout输出节点同时驱动太多管子导致上升下降时间恶化。3.4 求和MUX模块两次异或的复用S P ⊕ Cin。这个逻辑也可以用二选一MUX实现选择信号是P或者PB数据端是Cin和Cin取反。也就是说当P1时S 取反后的Cin当P0时S Cin 直接通过。这里又需要一级反相器来生成Cin的取反信号。要注意的是Cin信号在求和路径上被反相了一次这意味着在物理实现上Cin至S的传播路径包含1个反相器加2个串联传输门。如果这个全加器被用于级联进位链每级的Cin-to-Cout延迟和Cin-to-S延迟会被放大所以必须在版图阶段特别注意这一段的走线。如果像我一样使用的是Cadence环境直接把Sum的输出接到一个反相器整形输出再带一个理想的集电极开路负载或者干脆用一个高阻节点做仿真可以避免输出驱动引起的非理想效应混淆测量结果。3.5 管子尺寸的选择为什么不能全用最小尺寸传输门和传输管逻辑的尺寸设计跟传统CMOS静态逻辑有个很大的区别后者很多情况下直接用最小尺寸就能跑得很好因为逻辑门的放大作用会修正摆幅问题前者作为开关导通电阻直接与尺寸成反比尺寸太小会导致信号沿变慢尺寸太大又浪费面积和功耗。我在0.18μm工艺下的经验值是传输门的NMOS和PMOS都用约3倍最小尺寸比如最小尺寸W0.22μm那么传输管W0.66μm这可以在导通电阻大约1-2kΩ、寄生电容和面积之间取得平衡。PMOS可以再比NMOS宽 1.5到2倍因为PMOS迁移率低需要用更宽的沟道来补偿从而确保两个方向的传输延迟基本对称。对于后面接的整形反相器PMOS/NMOS宽度比大约2:1到3:1即可注意不要用太大的反相器否则会把前面传输门的负载拉垮。3.6 仿真验证测什么、怎么测、达到什么标准才能算过搭完原理图以后仿真不能随便跑几个case就收工。我的测试清单一般是五大项第一项是功能验证遍历全部8种输入组合检查S和Cout是否与真值表一致。这一步主要是发现逻辑结构错误测试激励可以直接用SPICE里的脉冲源写成一个递增计数器每几个纳秒变一次输入然后用波形窗口肉眼核对或者写成结果比对脚本。第二项是延迟测量。重点测Cin到Cout、A到Cout、A到S三条路径分别提取上升延迟和下降延迟看有没有明显的不对称。我之前做过一颗测试版测出来的结果就是A到S走的是两级传输门一级反相器延迟大约在200ps左右而Cin到Cout只走一个传输门加反相器延迟可以做到100ps以内。如果你测量结果中Cin到Cout比A到S还慢多半是管子尺寸设置有问题。第三项是摆幅检查。把节点电压录下来看高电平最低点是否低于VDD-50mV低电平最高点是否高于50mV。如果超过这个范围说明有传输管路径在工作需要插入恢复电路。第四项是功耗测量。用标准的输入翻转率跑10MHz时钟测平均功耗。传输门结构因为活动节点少静态功耗几乎为零动态功耗应该比同性能的CMOS全加器低30%以上才算合格。第五项是PVT角仿真。至少要跑SS、TT、FF三个工艺角再叠加温度0度、27度、125度和电压0.9x、1.0x、1.1x倍化的组合。这一步能暴露出体效应、阈值漂移引起的摆幅问题。我在SS角下就见过传输门全加器输出高电平掉到VDD-0.3V的情况纯粹是NMOS和PMOS的导通电阻失衡导致的。4. 实际操作中踩过的坑与排查技巧4.1 常见问题速查表现象可能原因排查方法某个输入组合下输出为高阻态控制信号P没有正常翻转差分信号生成失败检查异或模块的输入管脚是否接反输出高电平只有VDD-Vth有传输管路径带高电平或传输门控制信号摆幅不足检查传输门控制信号是否经过衰减输出波形出现明显毛刺多个传输门同时导通信号互相打架看控制信号是否有重叠导通区间级联后进位链越来越慢串联传输门的RC延迟累积在每两到三级间插入反相器缓冲低电压下功能失效率高阈值损失放大导致逻辑门翻转错误换用完整摆幅的传输门替代单管传输4.2 摆幅下降的恢复方案反相器还是锁存器当节点电压变成VDD-Vth或者Vth这种“半吊子”电平恢复方案有两种最简单的是在节点后面接一个反相器等于用反相器的开关阈值把模糊电平重新整形成标准的0和VDD。但这个方案有个问题如果节点的摆幅太差、离阈值太近反相器的噪声容限会非常小稍微有点干扰就直接翻转出错。更稳妥的做法是在节点后面挂一个弱反馈锁存器——比如两个反相器首尾相接其中一个尺寸很小。这样低摆幅信号只需要临时把锁存器推翻锁存器自己会把节点电平修正到完整摆幅然后维持住。这个方案代价是两个管子但可靠性提升非常明显。我在做过一次射频开关的电路时因为控制电压只有0.9V靠反相器恢复完全不管用换成弱反馈锁存器之后一切都稳定了。4.3 体内偏置对信号完整性的干扰传输管逻辑里最隐蔽的问题就是体效应。尤其是当传输管串联的时候中间节点电平在动态变化源极电压一直在变阈值电压也跟着变导致信号传播延迟很不稳定。我个人的习惯是在版图阶段尽量将传输管的衬底单独接不要直接接到电源或者地。虽然这会占用多一点面积但能斩断很多衬底偏置路径。另一个办法是使用深N阱工艺给PMOS做独立隔离代价是面积进一步增加一般只在高端设计里才会负担得起。4.4 动态节点与电荷分享问题传输门和传输管结构里有大量动态节点——就是只在导通瞬间被充电、之后保持在悬浮状态的节点。这些节点会跟相邻节点的寄生电容发生电荷分享当两个节点通过导通管连通时总电荷守恒但电压会重新分配如果原本的节点电压是满摆幅分享之后可能会掉不少。比如求和路径输出端节点是高电平1.8V另一个数据端节点是低电平0V两个节点通过一个传输门连通最终平衡电压就是两者按电容加权后的平均值。如果两边电容差不多大输出会直接掉到0.9V逻辑直接翻转了。解决电荷分享的根本办法是保证每个动态节点都有某种形式的静态保持路径。最简单的做法是在关键动态节点上挂一个弱反馈反相器形成一个小锁存器代价是增加晶体管数和一点功耗。另一种工程折中是把动态节点附近的寄生电容尽量做小同时把大电容节点跟敏感节点隔离。4.5 版图阶段的关键检查点传输门全加器的版图设计比静态CMOS逻辑更需要动脑筋。因为传输门依赖对称的差分信号走线时必须保持P和PB两条线等长、同层、间距一致否则会产生严重的时钟偏斜。我曾经在一次流片里遇到过一个问题逻辑仿真全对但硅片回来后高速模式下S输出偶尔出错。查了半天发现是版图里PB线绕了一个大圈比P线长了十几微米导致两个控制信号到达时间差了几十皮秒。在高速场景下这个误差足以让传输门出现短暂的同时导通或者同时断开窗口输出就乱了。所以版图阶段建议做三件事第一差分信号线严格走镜像对称结构第二传输门的源漏共享区域尽量紧凑减少节点电容第三在PN交叉区域加保护环防止闩锁效应。尤其是第三点传输门因为NMOS和PMOS靠得很近而且源漏电压摆动幅度大闩锁风险比普通逻辑门高得多。5. 从全加器到更大规模关键路径与功耗实测5.1 串联进位链的RC延迟问题单个传输门全加器的延迟数据看着很不错但一旦级联成一个16位加法器问题立刻浮现Cin到Cout路径上全是串联的传输门每一级导通电阻和节点寄生电容形成一个RC低通网络16级串联下来信号上升沿会被拖得极其缓慢。这就像水管接力前面的人开闸了但水流要经过十几根串联的软管才能到达终点每一根软管都在消耗水压。解决办法是在进位链上每隔2到3级插入一个反相器把信号重新整形放大。这个反相器相当于给软管加了个加压泵牺牲一点延迟换回陡峭的上升沿。插入反相器最直接的好处是打破了RC累积。按我测试的数据16位加法器如果完全不加缓冲Cin到Cout延迟可能达到几纳秒每隔3级插一个反相器后延迟能降到原来的四分之一左右。这个优化对超前进位和进位旁路结构同样有效。5.2 超前进位与进位旁路的适配既然全加器的进位生成如此简洁能不能直接跳过多级进位来加速可以但要换个思路。传统超前进位需要额外的CLA逻辑块而传输门全加器本身没有生成P和G的单独引脚——P和G信号都在内部节点上没有引出。我试过一种做法在传输门全加器的P信号节点上加一个探测缓冲器把P单独引出来用于旁边CLA模块的计算。这样每个全加器多4个管子却能换来16位加法器关键路径从进位链延迟变成CLA计算延迟收益在位数增大后非常可观。另一种更轻量级的优化是用进位旁路当某一段所有P都是1时这段进位可以直接跳过不用逐级传播。这个逻辑在传输门结构里做起来特别自然因为P信号本身就是现成的。唯一要注意的是P引出后驱动能力不够要加缓冲器否则会拖慢全加器内部原来的时序。5.3 功耗测试与优化我从实测数据里提炼的三条经验我在流片测试中对比过传输门全加器和标准单元库全加器工艺是0.18μm1.8V电源输入翻转率50%工作频率100MHz。测到三个关键结果第一动态功耗降低了约35%。原因倒不难理解传输门结构省去了大量管子的栅极翻转内部节点数量少翻转率低。第二晶体管的衬底漏电在低压下有优势但在高温下优势缩小。SS角、125°C下阈值下降导致漏电增加功耗差距从35%缩小到20%左右。这个现象在低功耗设计里值得注意如果目标工作温度很高还是要老老实实做功率柱子分析。第三进位链部分的功耗占比在全加器中最高。同样测16位加法器进位链消耗的功耗占总功耗40%以上。如果按传输门逻辑的固有优势进一步优化可以在进位链的P/G节点上做门控时钟让整个进位链在没有有效进位时保持静止几乎白赚一段功耗节省。5.4 由全加器到ALU的结构扩展单个全加器设计完成后很容易往ALU方向扩展。最基本的扩展是加入模式控制信号让它能根据MUX的选择信号在加法、减法、与、或、异或之间切换。我在项目中试过一种简单做法用四个额外的传输门来旁路掉原来的进位生成逻辑当MODE0时走全加器路径MODE1时让B输入直接经过一个取反传输门变成减法路径。复用原有电路等于一举两得。不过这种扩展有一个隐藏代价每一级内部又多了几个传输门串在路径上级联后的延迟明显增大。如果想保持高性能要么在扩展模式里也插入缓冲器要么干脆用独立的ALU控制逻辑替代全加器内部的模式切换。我实际操作用了前一种方案多付了一些面积但延迟数据还能接受。6. 再聊两句材料与工程习惯传输门和传输管逻辑全加器的实现难点从来不在原理理解而在工程细节上的拿捏。管子尺寸的高一点低一点、差分信号走线齐不齐、恢复反相器放哪个位置每一项都会直接影响最终性能。我自己做了这么多年最深的体会是四个字先摆信号再谈管数。很多初学者一上来就想着怎么把全加器压缩到最少管子结果要么摆幅崩了要么时序乱了最后重做。正确顺序应该是先把信号流画清楚把哪个节点控制哪个传输门标明白再计算每一级的负载和驱动关系最后才是缩减管数。管数优化应该是水到渠成的结果而不是一上来就追求的目标。另外如果你用的是老工艺0.35μm及以上传输门的优势会没那么明显因为阈值电压占比高摆幅损失相对更严重。到了28nm以下的先进工艺阈值电压占比降低传输门结构才真正如鱼得水。所以选型之前一定先看清工艺库的特征——同样的电路在0.18μm能跑1.2GHz在65nm可能直接跑崩了不要盲目套经验。这次项目里用到的仿真方法、恢复电路技巧、版图检查清单我都已经整理在上面的内容里了项目源文件不好直接发但照着思路复现一遍应该不难。这套电路做熟了之后你会发现自己看数字电路的眼光都变了——不再盯着布尔表达式翻来覆去化简而是能直观地想到这个信号可以用一组开关直接传过去那个信号需要加个泵重新升压。这种直觉才是传输门逻辑最值钱的东西。