3、时序弧与延迟计算:单元延迟与线延迟的概念,NLDM与CCS模型简介
各位同学,咱们今天聊点实在的。时序分析里最基础、也最绕不开的两个概念,就是单元延迟和线延迟。
说白了,一个信号从起点走到终点,时间都花在了两个地方:一是经过逻辑门内部(单元延迟),二是在金属线上跑(线延迟)。你想想看,芯片里动辄几千万个标准单元,再加上密密麻麻的连线,这俩延迟算不准,整个时序分析就是空中楼阁。
3.1 单元延迟:门内部的“堵车”时间
单元延迟,就是信号从输入引脚到输出引脚,穿过一个标准单元(比如与门、或门、触发器)所花的时间。这个时间不是固定的,它主要受两个因素影响:
- 输入转换时间(Input Slew):输入信号上升/下降的快慢。信号越陡,延迟越小;信号越缓,延迟越大。
- 输出负载电容(Output Load):这个单元要驱动多少负载。负载越大,延迟越大。
我在项目中遇到过一件事:有个同事调了半天的时序,怎么都修不掉一条setup违例。后来发现,他用的那个缓冲器驱动能力太弱,输出负载又大,单元延迟直接翻了一倍。嗯,这就是典型的“小马拉大车”。
核心公式(简化版):
Cell Delay = f(Input Slew, Output Load)
这个函数关系,就是通过时序库里的查找表(Look-Up Table)来描述的。
3.2 线延迟:金属线上的“跑路”时间
线延迟,就是信号在金属互连线上传输的时间。随着工艺节点越来越小,线延迟在总延迟中的占比越来越高。到了7nm以下,线延迟甚至能占到60%以上。
线延迟的计算,早期用的是集总模型,就是把整条线当成一个电容。后来精度要求高了,改用π模型或RC树模型。现在主流工具(比如PrimeTime)都支持Elmore延迟模型,它能考虑电阻和电容的分布效应。
我个人习惯,在评估线延迟时,会先看线的长度和金属层。顶层金属(厚金属)电阻小,延迟也小;底层金属(薄金属)电阻大,延迟也大。你想想看,同样的线长,走M1和走M9,延迟能差好几倍。
避坑指南:
我曾经在一个28nm的项目里,因为忽略了线延迟的电阻屏蔽效应,导致后仿时序和STA对不上。后来查了三天才发现,是RC抽取时没设对参数。所以,线延迟的精度,很大程度上取决于寄生参数提取的准确性。
3.3 NLDM模型:老牌经典,但有点“糙”
NLDM,全称是Non-Linear Delay Model(非线性延迟模型)。它是目前最常用的时序模型之一,也是很多老工程师最熟悉的模型。
NLDM的核心思想很简单:把单元延迟和输出转换时间,做成两个二维查找表。表的两个轴分别是输入转换时间和输出负载电容。
举个例子,一个2输入与非门的NLDM表可能长这样:
| 输入转换时间 (ns) | 负载电容 0.01pF | 负载电容 0.02pF | 负载电容 0.05pF |
|---|---|---|---|
| 0.01 | 0.12 | 0.18 | 0.30 |
| 0.05 | 0.15 | 0.22 | 0.38 |
| 0.10 | 0.20 | 0.28 | 0.45 |
工具在计算时,会根据实际的输入转换时间和负载电容,在表里做线性插值。如果落在表格范围外,就做外推。
NLDM的优点很明显:计算速度快,库文件小。但缺点也很突出:它假设输出波形是线性的(或者说是单斜率的),这在先进工艺下误差越来越大。
注意:NLDM模型在输入转换时间变化剧烈时,插值误差会显著增大。我曾经在16nm节点吃过这个亏,后来果断换成了CCS模型。
3.4 CCS模型:先进工艺的“救星”
CCS,全称是Composite Current Source Model(复合电流源模型)。它和NLDM最大的区别在于:CCS不再用简单的延迟查找表,而是用电流波形来描述单元的行为。
说白了,CCS模型把每个标准单元的输出端,建模成一个受控电流源。这个电流源的输出电流,会随着时间和输出电压的变化而变化。这样一来,工具就能精确模拟出输出波形的真实形状,而不是像NLDM那样假设一个线性斜坡。
CCS模型的好处:
- 精度高:能捕捉到波形非线性、Miller效应、IR Drop等复杂效应。
- 一致性:同一个模型,既能用于STA,也能用于功耗分析、信号完整性分析。
- 支持多输入翻转:多个输入同时变化时,CCS能更准确地计算延迟。
当然,CCS也有代价:库文件体积大(通常是NLDM的5-10倍),计算时间也更长。
我的建议:
如果你做的是28nm以上的成熟工艺,NLDM完全够用。但如果你做16nm、7nm、5nm,甚至更先进的节点,我强烈建议你用CCS。别为了省那点仿真时间,最后流片回来发现时序有问题,那代价可就大了。
3.5 NLDM vs CCS:怎么选?
我整理了一个对比表,方便你快速决策:
| 对比项 | NLDM | CCS |
|---|---|---|
| 建模方式 | 延迟查找表 | 电流源波形 |
| 精度 | 中等(线性近似) | 高(非线性精确) |
| 库文件大小 | 小 | 大(5-10倍) |
| 计算速度 | 快 | 较慢 |
| 适用工艺 | 28nm及以上 | 16nm及以下 |
| 额外能力 | 仅延迟 | 延迟+功耗+SI |
嗯,这里要注意:有些工艺厂会同时提供NLDM和CCS两种库。我个人习惯,在前期快速评估时用NLDM,到了最终签核阶段,一定切回CCS。
3.6 延迟计算的实际流程
最后,咱们串一下整个延迟计算是怎么跑的。工具拿到一个设计后,大致会做这几步:
- 读入库和网表:加载标准单元的NLDM或CCS模型,以及互连线的寄生参数(SPEF文件)。
- 计算线延迟:根据寄生参数,用Elmore模型或AWE模型算出每段互连线的延迟。
- 计算单元延迟:对于每个标准单元,根据输入转换时间和输出负载,查表或仿真得到单元延迟。
- 累加路径延迟:把路径上所有单元延迟和线延迟加起来,得到总路径延迟。
- 检查时序:用总路径延迟去和时钟周期做比较,看setup/hold是否满足。
你看,整个过程环环相扣。任何一个环节的模型选错了,或者参数设错了,结果都会偏。所以,理解NLDM和CCS的本质区别,是做好时序分析的第一步。
一个小技巧:
当你拿到一个新的工艺库时,可以先用一个简单的反相器链,分别用NLDM和CCS跑一下延迟,对比两者的差异。如果差异超过5%,那这个工艺节点下,NLDM可能就不太靠谱了。
好了,这一章的内容就到这里。下一章,咱们聊聊时序约束里的那些“坑”,特别是set_max_delay和set_min_delay的正确用法。到时候见。