集成电路设计

标准单元(standard cell)

想象一下用乐高积木搭东西。每一块积木都被压成同样的高度,卡在同一套网格上,所以你从来不用操心两块积木能不能对齐——你只管把它们一排排地拼起来,结构就立住了。标准单元就是芯片设计里的那块积木:一小块预先设计好、预先验证过的逻辑——一个反相器、一个二输入与非门、一个触发器——由库团队(晶圆厂或 IP 供应商)画上一次,然后在一整颗芯片上被复用上百万次。一个库里的每个单元都共享同样固定的高度,电源轨和地轨沿着它的上下边缘延伸,于是工具可以把它们一个挨一个地拼成整齐的行,而不用对每一个单独手工布线。

所谓"标准",其实是单元和自动化工具之间的一份契约。因为每个单元都有已知的功能、已知的占位尺寸和已知的电学特性,逻辑综合就能挑选单元去实现你的 RTL,而布局布线能把它们塞进行里、连成线网——整个过程不用任何人画哪怕一个晶体管。这套特性是通过电路仿真表征出来的:对每个单元,库团队会算出它的延迟(作为输入跳变和输出负载的函数)、它的输入电容,以及它在一系列工艺、电压、温度角下的功耗,并把这些数字打包进一个库文件里。静态时序分析随后读取这些数字,判断你的设计是否满足它的时序约束。

一个库里通常装着数百个单元:同一个逻辑功能会有好几种驱动强度(一个省电但弱小的反相器,和一个孔武有力、能迅速把又长又重负载的线网充上电的反相器),外加为低漏电与高速度分别调校过的变体(不同的阈值电压口味)。综合的艺术,就在于为每个位置挑对单元——在有裕量可挥霍的地方用小而慢的,在关键路径上用大而快的。单元本身是用 CMOS 晶体管搭起来的,但作为设计者,你大多时候只需把每一个都当成一块封好的、值得信赖的积木。

NAND2_X1 u_nand (.A(sel), .B(data), .ZN(n1));
DFF_X1   u_reg  (.D(n1), .CK(clk), .Q(out));

综合之后,你的 RTL 不再是行为级代码,而是一张由标准单元实例组成的网表——比如一个与非门和一个触发器连在一起。单元名(NAND2_X1、DFF_X1)和引脚名都来自库;同一个设计若针对另一个库重新综合,就会改用那个库的单元名和引脚名。

标准单元处在一道光谱的"可自动化"中间地带。一个极端是纯手工的全定制版图(性能最大化、工作量巨大,留给高速 I/O 或模拟模块这类东西);另一个极端是大型预制硬核模块,包括由存储器编译器自动生成的 SRAM 和寄存器堆。正是标准单元让现代数字设计变得可行——你描述行为,工具就拼装匹配的预制积木。

又称
celllibrary cellstandard-cellstdcell标准单元標準單元