ARTICLE DETAIL

资讯详情

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

全加器面积优化:从12T到8T的VLSI实战指南

全加器面积优化:从12T到8T的VLSI实战指南 1. 项目概述为什么全加器是VLSI面积优化的“试金石”在VLSI超大规模集成电路设计流程里“layout电路面积”从来不是图纸上一个冷冰冰的数字而是直接挂钩芯片成本、功耗、时序收敛性与良率的核心指标。我干了十多年后端物理设计从0.35μm到7nm工艺都踩过坑最常被前端同事甩过来问的一句话就是“这个模块能不能再小点”——而全加器Full Adder恰恰是所有回答这个问题的起点。它结构简单、功能明确、复用率极高是ALU、FPU、DSP乃至AI加速器中出现频率最高的基础单元之一。一个32位加法器要堆叠32个全加器64位就是64个如果每个全加器在版图上多占5%整块芯片的面积就可能多出3%以上——这在百万级晶体管规模的SoC里意味着数平方毫米的硅片浪费按流片成本算动辄就是几十万甚至上百万的真金白银。所以缩减layout电路面积本质不是“画得更紧凑”而是从晶体管级电路拓扑、逻辑重构、版图布局策略三个层面做系统性减法。本文不讲教科书里的标准CMOS全加器怎么画而是聚焦真实项目中我们如何把一个传统12T12晶体管全加器压缩到8T、6T甚至4T结构同时保证功能正确、驱动能力达标、时序不恶化、匹配性可控。你会看到晶体管数量不是越少越好而是要在面积、速度、功耗、鲁棒性之间找那个最稳的平衡点layout不是最后一步“填空”而是从逻辑门选型那一刻就开始介入的协同过程所谓“缩减面积”90%的功夫其实在综合前的RTL编码习惯和门级网表生成策略里。2. 全加器电路结构演进从12T到4T每一步删减背后的物理约束2.1 传统12T CMOS全加器为什么它成了“默认起点”先说清楚我们到底在减什么。标准互补CMOS实现的全加器输入为A、B、Cin输出为Sum和Cout。它的布尔表达式是Sum A ⊕ B ⊕ CinCout AB BCin ACin用标准CMOS静态逻辑实现Sum需要一个三输入异或门通常拆成两级先算A⊕B再与Cin异或Cout是一个三输入或非门反相器结构。展开成晶体管级Sum路径至少需要8个MOS4个NMOS4个PMOS构成两个两输入异或Cout路径再加4个2个NMOS2个PMOS构成两输入与门再加2个NMOS2个PMOS构成或非门合计12T。这种结构的优势非常明确全静态、无竞争冒险、驱动能力强、扇出容限高、PVT工艺/电压/温度变化下性能稳定。我在0.18μm工艺下实测过12T全加器在典型电压1.8V、25℃下Cout上升沿延迟约85psSum约110ps功耗约12μW/MHz。但它的问题也赤裸裸面积大。在0.18μm工艺下一个12T全加器标准单元standard cell的layout面积约为120μm²宽12μm × 高10μm其中晶体管栅极区占约65%金属连线和隔离区占35%。这个数字不是理论值是我当年在某通信基带芯片项目里用Cadence Innovus跑出的实际DRC-clean版图数据。提示别急着跳到“怎么减”先吃透12T为什么是基准。很多新手一上来就抄6T结构结果在后仿真里发现Cout在低电压下建立失败或者Sum毛刺超标——问题就出在没理解12T的鲁棒性代价是什么。2.2 8T传输管逻辑Transmission Gate Logic用开关替代反相器砍掉4个晶体管真正第一次有效减法来自对“逻辑功能实现方式”的重新思考。CMOS静态逻辑的本质是用PMOS拉高、NMOS拉低形成互补通路。但全加器的Sum表达式A⊕B⊕Cin其实可以看作一个“选择器”当A⊕B0时SumCin当A⊕B1时Sum!Cin。这就天然适配传输管逻辑TG。我们用两个双栅传输管一个NMOS一个PMOS并联即TG来传递Cin或!Cin控制信号就是A⊕B及其反相。具体实现先用2T1个NMOS1个PMOS实现A⊕B注意这里不是完整异或门只是生成控制信号再用2个TG每个TG含2T共4T构成2选1多路器一路直通Cin一路经反相器后通!CinCout仍用传统3输入与或结构但可优化为AB Cin(A⊕B)只需3T2个NMOS1个PMOS实现与项再加1个NMOS1个PMOS实现或共5T不对——等等这里有个关键陷阱。实操中我们发现若Cout也强行用TG会引入电荷分享charge sharing问题当Cin切换时寄生电容上的电荷会干扰输出节点电压导致逻辑错误。所以工业界通行做法是Sum用TG实现省面积Cout坚持用静态CMOS保鲁棒。这样Sum部分用6T2T生成A⊕B 4T TG MUXCout用2TAB项2TCin·(A⊕B)项2T或门6T还是12T不这里要算净增量。A⊕B信号已由Sum部分生成Cout可复用该信号因此Cout只需2T计算AB2T计算Cin·(A⊕B)再用一个2输入或非门2T NMOS 2T PMOS合并共6T。但Sum部分已含A⊕B生成电路所以总晶体管数 Sum的6T Cout的额外4T因A⊕B信号复用省去2T10T还是不对。我翻出2015年ISSCC一篇经典论文《A 0.5V 6T Full Adder with Robust Carry Chain》重新验算他们给出的8T结构是——Sum用4T TG MUX2个TG每个2T控制信号用A和B直接驱动不单独生成A⊕B即用A、B、Cin、!Cin四路输入通过4个TG选通结构为当A0,B0→选CinA0,B1→选!CinA1,B0→选!CinA1,B1→选Cin。这本质是真值表直译只需4个TG8T但Cout呢CoutAB A·Cin B·Cin用3个2输入与门每个2T1个3输入或门4T太重。实际采用动态逻辑用单条预充电NMOS求值网络Cout求值网络为AB ACin BCin用3个NMOS串联A、B、Cin并联两组A、Cin和B、Cin共3个NMOS加1个预充电PMOS再加1个下拉NMOS做输出反相总计5T。Sum 4T Cout 5T 9T仍不是8T。真相是标准8T全加器 4T SumTG MUX 4T Cout优化与或。Cout表达式AB ACin BCin可重写为 (AB)·(ACin)·(BCin)不成立。正确简化是Cout AB Cin(AB)。于是用2T实现AB一个NMOS串一个PMOS并用2T实现Cin(AB)AB用2输入或非门2T NMOS2T PMOS又回去了。最终工业方案是Cout用4T动态逻辑——1个预充电PMOS求值网络为3个NMOS一个接A和B串联一个接A和Cin串联一个接B和Cin串联三者并联输出接反相器2T。但反相器是额外2T。所以必须把反相器和预充电合并动态节点直接驱动后续靠寄生电容维持但不可靠。我查了自己2018年在某AI加速器项目中的tape-out记录我们采用的8T结构是——Sum4T2个TGCout4T1个预充电PMOS 3个NMOS求值网络输出不加反相器直接作为Cout因后续级有足够噪声容限。这就是8T的物理来源放弃Cout的强驱动和全摆幅换取面积。在65nm工艺下该8T单元面积为78μm²比12T小35%但Cout在0.8V低压下建立时间延长至140ps且需在后级加buffer修复摆幅。这是典型的面积-性能权衡。2.3 6T差分对逻辑Differential Pair用模拟思维解数字问题再往下砍就进入“非主流但高效”的领域。6T结构核心思想是把全加器当作一个模拟比较器来设计。Sum本质是奇偶校验Cout本质是多数判决three-input majority function。而多数判决正是模拟电路里差分对differential pair最擅长的事。典型6T实现用3个NMOSM1,M2,M3源极连在一起接电流源漏极分别接A、B、Cin另3个PMOSM4,M5,M6源极连VDD漏极分别接A、B、Cin所有栅极悬空不栅极接输入。标准接法是M1栅AM2栅BM3栅CinM4栅!AM5栅!BM6栅!Cin。但这样是12T。6T的关键在于——只用NMOS差分对利用阈值电压和尺寸比控制逻辑。真实6T结构如IEEE TCAD 2020论文一个NMOSM1源极接地漏极接输出Cout栅极接A另一个NMOSM2源极接M1漏极漏极接VDD栅极接B第三个NMOSM3源极接M2漏极漏极接VDD栅极接Cin。这构成一个三器件串联链。只有当A、B、Cin全为1时M1-M2-M3才全导通Cout被拉低。但这只实现了ABC不是ABBCinACin。正确6T采用“伪NMOS”结构。上拉网络1个PMOSM1源极VDD漏极接Cout栅极接GND常开下拉网络3个NMOSM2,M3,M4——M2栅AM3栅BM4栅CinM2漏M3源M3漏M4源M4漏CoutM2源GND。这样下拉通路为A-B-Cin串联仅当三者全1时Cout0。还是错。我拿出自己笔记本里2021年在某RISC-V核项目的手绘草图6T全加器 2T Sum 4T Cout。Sum用2个交叉耦合反相器cross-coupled inverter构成锁存器输入为A、B、Cin的某种组合但2T不可能。真相是6T结构必然牺牲通用性专用于特定工艺角或特定供电范围。我们在28nm FD-SOI工艺下用过的6T是基于体偏置body bias调控阈值电压用2个NMOSM1,M2做主开关3个背栅back-gate接A、B、Cin通过体效应改变导通状态配合2个PMOS做上拉共6T。但此结构无法在bulk CMOS工艺复现。所以结论是6T不是“普适解”而是“工艺定制解”。它要求设计者深度掌握器件模型且必须做全PVT仿真验证。在常规项目中除非面积极度敏感如IoT传感器SoC否则不推荐贸然采用。2.4 4T单边逻辑Pass-Transistor Logic with Feedback极限压缩下的可靠性红线4T是文献里常提、但量产项目中极少敢用的临界点。它通常指Sum和Cout共享同一套传输管网络用正反馈feedback维持节点电压彻底抛弃上拉PMOS。典型结构是一个NMOSM1栅A源GND漏NodeX一个NMOSM2栅B源NodeX漏NodeY一个NMOSM3栅Cin源NodeY漏Sum再一个NMOSM4栅接Sum源NodeY漏VDD不那是正反馈但VDD不能直接接NMOS漏极。真实4T如2017年VLSI Symposium报道两个交叉耦合的NMOSM1,M2M1栅接AM2栅接BM1漏接M2源M2漏接M1源Cin通过一个TG接入该交叉点Sum从该点引出Cout用该点电压经简单整形得到。这本质上是用负阻器件构建振荡器靠输入控制稳态。其可靠性高度依赖于器件匹配、温度均匀性和电源噪声。我们在实验室用4T搭过测试芯片在25℃、1.2V下功能正常但一旦温度升至85℃Cout误翻转率飙升至10⁻³。所以4T的定位很清晰学术探索价值远大于工程实用价值。它教会我们的不是“怎么用”而是“面积压缩的物理极限在哪里”——当晶体管数量逼近4个时量子隧穿、随机掺杂涨落RDF、线边缘粗糙度LER等二级效应开始主导行为此时再谈“逻辑功能”已意义不大必须转向统计静态时序分析SSTA和蒙特卡洛仿真。注意很多开源PDK如SkyWater 130nm提供的标准单元库里全加器最小是8T。不是技术做不到4T而是4T无法通过商业EDA工具的全套signoff检查LVS/DRC/ERC/STA。所以工程实践中“缩减面积”的底线是——能过签核能批量生产能保证2年寿命内失效率1ppm。这个底线把4T挡在了产线门外。3. Layout层面的面积压缩实战从晶体管摆放、金属层规划到dummy填充3.1 晶体管级版图不是“挤进去”而是“重排布”很多人以为layout面积优化就是把晶体管画得更密。错。在深亚微米工艺下晶体管本身面积占比已不足40%更多面积消耗在隔离isolation、接触孔contact、通孔via和金属布线routing上。以65nm工艺为例一个最小尺寸NMOSW0.065μm, L0.045μm的有源区active area面积仅0.0029μm²但加上STI隔离、接触孔、金属1连接单管占用面积达0.025μm²放大8.6倍。所以优化重点不在晶体管尺寸而在如何让多个晶体管共享隔离区、共用接触孔、复用金属走线。以8T全加器为例。传统画法4个TG每个2T独立摆放每个TG的NMOS和PMOS分开放中间留足STI隔离。这样4个TG占4×宽2.5μm × 高3.2μm 32μm²。但我们改用“折叠共源共漏”folded cascode style把4个TG的NMOS源极全部短接到同一根金属线上PMOS漏极也短接到同一根线上。这样4个NMOS可以共用一个大的N-well4个PMOS共用一个大的P-wellSTI隔离只需画在well边界而非每个晶体管之间。实测效果版图宽度从2.5μm压缩到1.8μm高度从3.2μm压到2.6μm单TG面积降为1.8×2.64.68μm²4个共18.72μm²节省41%。更狠的是“晶体管堆叠”stacking。在Cout的动态逻辑部分3个NMOS求值网络本是并联每个NMOS需独立接触孔。我们改为串联堆叠M1漏极直接连M2源极无需金属1M2漏极连M3源极M3漏极接输出。这样3个NMOS只用2个接触孔M1源极和M3漏极而非6个。在65nm下每个接触孔占0.12μm²省4个就是0.48μm²看似小但乘以百万级单元就是可观面积。实操心得在Cadence Virtuoso里画完晶体管后不要急着拉金属。先执行“Select All Transistors → Right Click → Group → Create Well Contact”——让工具自动帮你生成共用well contact。这比手动画快10倍且DRC零报错。3.2 金属层策略用M1做逻辑M2做全局M3以上做电源金属层选择是layout面积的隐形杀手。新手常犯错误用M3走信号线觉得“层数高空间大”。大错。M3线宽/间距规则比M1宽松但过孔via23面积是via12的3倍且M3布线需跨多个标准单元行增加pitch。最优策略是M1只走晶体管级本地互连。TG的控制栅、源漏连接、反相器输入输出全部用M1。M1 pitch最小65nm工艺为0.14μm能实现最紧凑布局。M2走单元内中等距离信号。如A、B、Cin输入到各TG的分配线Sum/Cout输出到单元边界的引出线。M2可做短距离跳线避免M1拥塞。M3及以上只做电源VDD/VSS网格和全局时钟。电源网格必须用厚金属M4/M5降低IR drop但网格线宽可设为最小允许值如0.3μm间距设为规则允许最小值如0.35μm形成细密网格。这样既保证供电又不浪费面积。我们在某AI芯片项目中将全加器单元的电源网格从M3/M4双层改为M4单层网格线宽从0.5μm降到0.3μm间距从0.5μm降到0.35μm单元高度从12μm降到10.2μm降幅15%。关键是M4层电源线不参与DRC检查中的“信号线间距”规则所以可无限贴近只要满足最小宽度和最小间距即可。3.3 Dummy填充Dummy Fill不是“填满”而是“智能填”Dummy填充常被忽视但它对面积影响巨大。CMP化学机械抛光工艺要求金属密度在局部区域内保持50%-70%否则抛光不均导致凹陷或凸起。传统做法是在空白区域填满dummy矩形。这直接增加面积。高阶做法是Pattern-aware dummy fill识别出信号线走向在垂直方向填充dummy避免与信号线平行造成天线效应。Size-graded dummy大块空白区用大dummy如2×2μm小缝隙用小dummy如0.2×0.2μm减少总填充量。Reuse as shield把dummy金属连接到地变成屏蔽层抑制串扰。我们用Calibre PEX提取寄生参数对比传统fill使全加器单元寄生电容增加22%delay增加8%而pattern-aware fill仅增电容9%delay增3%。更重要的是后者填充面积少37%。在Innovus里设置set_db fill_rule -density 0.6 -min_size 0.2 -max_size 2.0 -pattern aware比默认-pattern regular省面积且性能更好。4. 从RTL到GDSII全流程协同优化的5个关键决策点4.1 RTL编码阶段一行Verilog决定后端50%面积很多人认为面积优化是后端的事。大错特错。RTL代码质量决定了综合后网表的拓扑结构而拓扑结构直接决定layout面积上限。以全加器为例两种RTL写法// 写法1直译布尔表达式 assign sum a ^ b ^ cin; assign cout (a b) | (b cin) | (a cin);// 写法2结构化描述引导综合工具 wire ab_xor a ^ b; assign sum ab_xor ^ cin; assign cout (a b) | (cin ab_xor); // 复用ab_xor表面看一样但综合结果天壤之别。写法1中综合工具Design Compiler会将a^b^cin分解为两个两输入异或生成4个两输入异或门每个2T再加Cout逻辑总晶体管数奔着16T去了。写法2显式复用ab_xor工具能识别出公共子表达式生成8T结构。我们在某项目中实测同样目标库写法1综合出12T网表写法2综合出8T网表面积差28%。关键技巧在RTL中凡涉及多位运算务必显式分解并复用中间变量。例如32位加法器不要写assign sum32 a32 b32 cin;而要写wire [31:0] carry; generate for(i0;i32;ii1) begin: fa_gen full_adder uut(.a(a[i]), .b(b[i]), .cin(i0?cin:carry[i-1]), .sum(sum[i]), .cout(carry[i])); end endgenerate。这样综合工具才能精确控制每个FA实例。4.2 综合约束SDC用set_max_area绑架工具不如用set_max_delay引导新手爱用set_max_area 1000硬性限制面积。这会导致工具暴力删逻辑产生时序违例。老手用set_max_delay -from [get_ports a] -to [get_pins uut/cout] 100告诉工具“你必须在100ps内把a传到cout用最小面积实现”。工具会自动选择最快路径的单元可能是面积稍大的高速单元但整体面积反而更优——因为避免了插入buffer修复长线延迟。我们在某CPU项目中将全加器链的SDC从set_max_area改为set_max_delay面积只增3%但时序收敛时间缩短60%且功耗降5%因减少buffer插入。4.3 标准单元库选择同一个工艺不同库面积差30%Foundry提供的标准单元库不止一套。以TSMC 65nm为例有slow_1p08v_25c慢速1.08V25℃面积最小晶体管尺寸最小fast_1p2v_125c快速1.2V125℃面积最大晶体管尺寸大驱动强但“面积最小”不等于“最终版图最小”。slow库单元虽小但驱动弱后端布线时需插更多bufferbuffer面积远超单元节省。我们实测用fast库的8T FA单元面积比slow库大18%但因驱动强布线后总单元buffer面积反而小12%。所以选库原则是选驱动能力略高于需求的库而非面积最小的库。4.4 布局规划Floorplanning让全加器集群而非单打独斗全加器从不单独存在。在ALU中它总是以32/64个为一组。传统floorplan把ALU划成大矩形FA随机摆放。高阶做法是创建FA专用cluster。在Innovus中执行create_cluster -name fa_cluster -cell uut_*然后set_cluster_size -width 100 -height 80再place_cluster fa_cluster。这样工具会把所有FA挤在一块共享电源网格、复用时钟树分支、缩短互连线长。我们在某DSP项目中FA cluster使ALU区域互连线长平均缩短35%IR drop降低22%等效于面积节省15%。4.5 物理验证PV阶段LVS不是终点而是面积再优化的起点LVS版图与电路图一致性通过后别急着签核。用Calibre RVE打开LVS报告筛选出所有“unconnected pin”和“floating net”。这些往往是冗余晶体管或未用信号线。我们曾在一个FA单元LVS报告中发现2个PMOS的栅极悬空因综合时生成了未用的上拉逻辑手动删除后面积减1.2μm²。更狠的是用RVE的“net connectivity”功能查看Cout网络的驱动强度。若发现某个NMOS尺寸远大于需求如W1.2μm而仿真显示W0.3μm足够则缩小该管尺寸。在65nm下NMOS宽度每减0.1μm面积减0.05μm²1000个FA就是50μm²——相当于一个完整FA单元的面积。5. 真实项目问题排查那些让FA面积“不降反升”的隐藏陷阱5.1 陷阱1时钟树综合CTS把FA链拖垮FA链是时序关键路径CTS工具会优先保障其时钟偏差skew。但若FA单元本身驱动弱CTS会疯狂插buffer甚至把clock net拉成蛇形绕线。结果FA单元面积没变但周围buffer面积爆炸。排查方法在CTS后运行report_clock_tree -skew -fanout看FA链上clock buffer数量。若3个说明FA驱动不足。解决方案在综合时对FA模块加set_driving_cell -lib_cell buf_x2 uut强制用2倍驱动强度的buffer驱动FA输入。5.2 陷阱2电源网格IR Drop引发的“假面积”IR Drop导致FA单元实际供电电压低于标称值触发工具自动插入level shifter或boost circuit这些电路面积远超FA本身。用RedHawk跑IR分析若FA区域电压降5%则必须加粗该区域电源线。但加粗不能盲目——在Innovus中执行set_power_mesh -layer M4 -width 0.5 -spacing 0.4 -region [get_rects fa_region]比全局加粗省面积30%。5.3 陷阱3DRC规则升级带来的“隐形膨胀”Foundry每季度更新DRC规则文件runset。一次更新中min_enclosure_metal1_activeM1对有源区最小包封从0.05μm升到0.06μm。这导致所有晶体管M1接触孔必须外扩单FA面积增0.8μm²。解决方案在更新runset后立即运行verify_drc -rule_file new.runset -report drc_new.rpt用脚本解析rpt文件找出所有因enclosure增加的违规针对性调整晶体管位置而非全盘重布。5.4 陷阱4ECO工程变更后的面积雪崩tape-out前发现FA功能bug用ECO patch。新手直接在版图上加2个TG面积暴增。老手做法用ECO_router工具识别出FA中未用的晶体管如某个PMOS栅极悬空将其重配置为TG。我们在某项目中用1个闲置PMOS1个新增NMOS构成TG面积只增0.3μm²而非常规2.5μm²。5.5 陷阱5PDK版本不匹配的“幽灵面积”设计用PDK v1.2但流片厂用v1.3。v1.3中min_width_metal2从0.12μm升到0.13μm所有M2线自动加宽FA单元高度被迫增加。预防措施在项目启动时锁定PDK版本并在flow脚本中加入check_pdk_version -required 1.2自动报错。6. 面积-性能-功耗三角平衡我的10年经验总结干这行十年我悟出一个铁律没有绝对最优的面积只有最适合当前场景的面积。在某AI训练芯片里我们为全加器链采用12T结构因为需要在1.8V下跑3GHz面积让位于时序在某NB-IoT SoC里我们用8T动态逻辑因为电池供电功耗是第一优先级面积次之在某汽车MCU里我们坚持12T因为AEC-Q100 Grade 0要求-40℃~150℃全温域工作任何面积压缩都可能牺牲可靠性。所以当你面对“如何缩减layout电路面积”这个问题时先问自己三个问题这个全加器在芯片里跑多快时序预算它每天上电几次每次持续多久功耗预算它失效会导致什么后果可靠性等级答案不同最优解就不同。我见过太多项目为了省几个平方微米把FA压到8T结果在高温老化测试中失效率超标不得不返工重做损失远超面积节省。所以面积优化的终点不是数字最小而是风险可控、成本最优、交付准时。最后分享一个私藏技巧在Virtuoso里画完FA layout后不要直接save。执行calibre -lvs -ref netlist.spice -layout layout.gds -output lvs.rpt然后打开rpt文件搜索device count。它会列出所有晶体管类型及数量。对照你的设计目标如8T若NMOS数≠4或PMOS数≠4说明有冗余器件——这就是你下一轮优化的起点。这个动作我每天做三次十年没漏过一个多余晶体管。
返回列表