第四节:逻辑单元分类——从基本门到特殊单元

好,咱们今天聊聊标准单元库里的逻辑单元分类。说实话,我刚入行那会儿,觉得单元库不就是一堆门电路嘛,有啥好选的?后来被现实狠狠教育了一回——选错了单元,整个芯片的功耗和面积直接崩盘。所以这一节,我带你把这些单元掰开揉碎讲清楚。

4.1 基本逻辑门:AND/OR/NAND/NOR

基本逻辑门是数字电路的砖瓦。AND、OR、NAND、NOR、NOT、XOR、XNOR,这些你肯定都认识。但作为后端工程师,咱们关心的不是逻辑功能,而是它们的物理实现和时序特性。

核心要点:基本门的选择直接影响芯片的面积、功耗和速度。NAND/NOR 通常比 AND/OR 更优,因为 CMOS 工艺中 NAND/NOR 的晶体管堆叠更少。

举个例子,一个 2 输入 AND 门,内部其实是一个 NAND 加一个反相器。你想想看,多了一级门,延迟自然就大了。所以我个人习惯,在关键路径上尽量用 NAND/NOR 代替 AND/OR。我在一个 28nm 的项目里,就是靠这个技巧把关键路径的 slack 从负值拉回了正值。

门类型 晶体管数(2输入) 典型延迟(ps) 面积(um²)
NAND 4 15 0.5
NOR 4 18 0.5
AND 6 22 0.7
OR 6 24 0.7

我的小技巧:选型时别只看驱动强度(drive strength)。同样的驱动强度,NAND 的输入电容通常比 AND 小,这对前级驱动更友好。

4.2 复合逻辑门:AOI/OAI

复合逻辑门,说白了就是把多个基本门组合成一个单元。AOI(And-Or-Invert)和 OAI(Or-And-Invert)是最常见的。为什么要用它们?因为面积更小、延迟更低。

我举个例子。你要实现一个逻辑:Y = (A & B) | (C & D) 再取反。用基本门实现需要两个 AND 加一个 NOR,总共 3 个单元。但用 AOI22 一个单元就搞定了。面积省了 40%,延迟也少了 15%。

避坑指南:我曾经在一个项目中过度使用 AOI,结果发现某些 AOI 单元的输入 pin 电容特别大,导致前级驱动能力不足。所以用复合门之前,一定要先看 Liberty 库里的 input capacitance 参数。

常见的复合门有:

  • AOI21: Y = !(A & B | C)
  • AOI22: Y = !(A & B | C & D)
  • OAI21: Y = !((A | B) & C)
  • OAI22: Y = !((A | B) & (C | D))

嗯,这里要注意:AOI 和 OAI 的驱动强度通常比基本门弱一些。因为内部晶体管堆叠更多,输出电阻更大。所以如果你用它驱动长线或大负载,记得选大驱动强度的版本。

4.3 时序单元:DFF 与 Latch

时序单元是芯片的“记忆细胞”。DFF(D Flip-Flop)和 Latch 是最基本的两种。DFF 是边沿触发,Latch 是电平触发。这个区别你肯定知道,但选型时还有更多门道。

我个人习惯,在大多数同步设计里用 DFF。因为 DFF 对时钟抖动不敏感,时序分析也简单。但 Latch 在某些场景下更省功耗——它可以在时钟高电平时透明传输,低电平时锁存,这样能减少不必要的翻转。

警告:Latch 在 STA 中容易产生 timing loops,处理起来很麻烦。我建议除非有明确的低功耗需求,否则尽量用 DFF。

DFF 的常见变种:

  • 普通 DFF: 带 Q 和 QN 输出
  • 带复位 DFF: 异步复位(RN)或同步复位(R)
  • 带使能 DFF: 增加 EN 引脚,控制数据是否更新
  • 扫描 DFF: 带 SI/SE 引脚,用于 DFT 扫描链

选型时,我特别关注 setup time 和 hold time。不同驱动强度的 DFF,时序参数差别很大。比如一个 DFFX1 的 setup time 可能是 20ps,但 DFFX8 可能只有 10ps。为什么?因为内部驱动更强,数据建立更快。但代价是面积和功耗更大。

4.4 特殊单元:时钟门控、扫描链、电平转换器

特殊单元是标准单元库里的“特种兵”。它们不常用,但用对了能解决大问题。

4.4.1 时钟门控单元

时钟门控(Clock Gating)是低功耗设计的核心手段。它通过一个使能信号控制时钟是否传递给下游寄存器。说白了,就是让不需要工作的模块“睡大觉”。

常见的时钟门控单元是 ICG(Integrated Clock Gating)。它内部包含一个 Latch 和一个 AND 门。为什么用 Latch?因为要避免时钟毛刺(glitch)。

关键点:ICG 的使能信号必须在时钟低电平时变化,否则会产生毛刺。所以综合工具会自动插入 Latch 来同步使能信号。

我在一个手机芯片项目里,靠时钟门控把动态功耗降了 30%。但要注意,ICG 本身也有功耗和面积开销。如果使能信号翻转太频繁,反而得不偿失。

4.4.2 扫描链单元

扫描链(Scan Chain)是 DFT(可测试性设计)的基础。它把普通 DFF 替换成带扫描功能的 SDFF(Scan DFF)。SDFF 有两个数据输入:正常数据 D 和扫描数据 SI。通过 SE(Scan Enable)信号切换。

选型时要注意:

  • 扫描类型: 有 muxed-D 和 LSSD 两种。muxed-D 最常用,面积小。LSSD 更可靠,但面积大。
  • 扫描时钟: 有些库提供独立的扫描时钟 pin,方便 ATE 测试。
  • 扫描输出: 注意 SO 引脚的驱动强度,它要驱动下一级 SI。

我的经验:扫描链的插入率通常控制在 80%-90%。太高了面积受不了,太低了测试覆盖率不够。我曾经为了追求 95% 的覆盖率,结果芯片面积暴涨了 15%,被老板骂了一顿。

4.4.3 电平转换器

电平转换器(Level Shifter)用于不同电压域之间的信号传输。比如核心电压 0.8V 到 IO 电压 1.8V,或者从 0.7V 到 1.0V。没有它,信号根本传不过去。

电平转换器分两种:

  • 单向: 只能从一个方向转换,比如低到高或高到低。
  • 双向: 可以双向转换,常用于 I/O 接口。

选型时,我主要看三个参数:

  1. 转换速度: 延迟不能太大,否则影响时序。
  2. 静态功耗: 电平转换器通常有静态电流,低功耗设计要选漏电小的。
  3. 驱动能力: 输出端要能驱动下一级负载。

注意:电平转换器不能随便放。我见过一个项目,把电平转换器放在时钟路径上,结果时钟 skew 大了 50ps,整个芯片时序崩了。电平转换器最好只放在数据路径上,时钟路径要用专门的时钟电平转换器。

小结

好了,这一节的内容就这些。总结一下:

  • 基本门选 NAND/NOR 优先,面积和速度都更好。
  • 复合门 AOI/OAI 能省面积,但要注意输入电容。
  • 时序单元 DFF 是主流,Latch 慎用。
  • 特殊单元 ICG、SDFF、Level Shifter 各有用途,选型要结合具体场景。

下一节咱们聊聊单元库的时序建模和 Liberty 文件。到时候我会手把手教你怎么看 .lib 文件里的 timing arc 和 power table。嗯,那才是真正考验功底的地方。


公众号:蓝海资料掘金营,微信deep3321