1. 时序模型到底在芯片设计里扮演什么角色
数字芯片设计做到签核阶段,绕不开的一个环节就是静态时序分析。工具跑起来之后,它需要知道每个标准单元、每个宏单元、每条互连线的延迟到底是多少。这个“延迟数据从哪来”的问题,答案就是时序模型。你可以把时序模型理解成一张“延迟字典”:给定输入转换时间和输出负载,查表就能得到单元的延迟和输出转换时间。没有这张字典,STA工具就是一台没有地图的导航仪,根本不知道从A点到B点要花多久。
我刚开始接触后端流程的时候,对时序模型的理解非常粗浅,觉得不就是.lib文件嘛,工具能读就行。后来做先进工艺项目才发现,不同工艺节点、不同单元类型、不同精度要求下,时序模型的选型直接影响到签核结果是否可信。NLDM、CCS、ECSM这三个名字,基本上每个做数字后端的工程师都会遇到,但真正能把它们之间的差异、适用场景、以及为什么先进工艺必须换模型讲清楚的人并不多。
这篇文章面向的是有一定数字设计基础、正在或者即将接触时序签核的工程师,不管你是刚入行的新人,还是从其他环节转过来的老手,我都会从实际项目出发,把这三个模型的技术细节、选型逻辑、实操注意事项讲透。读完你至少能搞清楚:为什么28nm以下必须用CCS或ECSM、NLDM在什么情况下还能凑合用、以及拿到一个.lib文件后怎么快速判断它的模型类型和精度是否满足项目需求。
2. 三种时序模型的核心原理拆解
2.1 NLDM:查表法的经典实现
NLDM全称Non-Linear Delay Model,是非线性延迟模型的缩写。它的核心思想非常朴素:把单元延迟和输出转换时间表示为输入转换时间和输出负载电容的二维函数,然后用查找表的方式存储离散点上的值,实际计算时通过插值得到任意点的结果。
具体来说,NLDM的.lib文件里你会看到类似这样的结构:
cell (INVX1) { pin (A) { timing() { related_pin : "Y"; cell_rise (delay_template_5x5) { index_1 ("0.01, 0.05, 0.12, 0.3, 0.6"); index_2 ("0.5, 1.2, 3.0, 7.0, 15.0"); values ( \ "0.023, 0.031, 0.045, 0.078, 0.142", \ "0.025, 0.033, 0.047, 0.080, 0.145", \ ... ); } } } }index_1是输入转换时间,index_2是输出负载电容,values就是对应的延迟值。工具在计算时,如果实际输入转换时间和负载落在表格两个点之间,就用双线性插值算出延迟。
NLDM的优势在于结构简单、计算速度快、文件体积小。在0.25微米以上的工艺节点,互连延迟占主导,单元延迟本身受输入转换时间的影响相对平缓,NLDM的精度完全够用。但到了65nm以下,问题就来了:晶体管的短沟道效应、速度饱和、以及输入转换时间对延迟的非线性影响越来越剧烈,NLDM用简单的双线性插值已经无法准确描述实际波形。
我实测过一个65nm的缓冲器单元,在输入转换时间从10ps跳到200ps时,NLDM查表得到的延迟和SPICE仿真结果偏差能到15%以上。这个偏差在时序紧张的路径上足以让签核结果完全不可信。
2.2 CCS:电流源模型的精度飞跃
CCS全称Composite Current Source,复合电流源模型。它的出现就是为了解决NLDM在先进工艺下精度不足的问题。CCS不再把单元看成一个简单的延迟黑盒,而是把驱动单元建模为一个电流源,通过描述输出电流随时间的变化来精确计算延迟。
CCS模型的核心数据结构包括两部分:一是电流波形表,描述在不同输入转换时间和输出负载下,单元输出端的电流随时间的变化曲线;二是电压波形表,描述接收端看到的电压波形。工具在计算时,会把驱动单元的电流源模型和接收端的电容模型联立求解,得到实际的电压波形,再从波形上提取延迟和转换时间。
这种方法的精度接近SPICE仿真,但计算量比SPICE小得多。代价是.lib文件的体积会急剧膨胀。一个典型的CCS库,同样数量的单元,文件大小可能是NLDM库的5到10倍。我见过一个16nm的CCS库,解压后超过2GB,光是读库就要花不少时间。
CCS还有一个重要的变体叫CCS Timing,它只包含时序信息,不包含噪声分析所需的电流波形,文件会小一些。如果你的项目不需要做串扰噪声分析,用CCS Timing就够了。
2.3 ECSM:另一种高精度建模思路
ECSM全称Effective Current Source Model,有效电流源模型。它和CCS的目标一致——在先进工艺下提供接近SPICE的精度,但实现路径不同。ECSM的核心思想是用电压波形来表征单元行为,而不是像CCS那样用电流波形。
具体来说,ECSM模型存储的是在不同输入转换时间和输出负载下,单元输出端的电压随时间变化的波形。工具拿到这个波形后,直接从中提取延迟和输出转换时间。对于接收端,ECSM会用一个等效电容来建模,计算时把驱动波形和接收端电容结合,得到实际波形。
ECSM和CCS的精度在同一水平线上,差异主要体现在工具支持度和库提供商的偏好上。有些代工厂更倾向于提供CCS库,有些则主推ECSM。从使用者的角度看,两者在签核流程中的角色是可以互换的,关键看你的STA工具支持哪种、以及代工厂提供的库质量如何。
这里有一个容易混淆的点:ECSM和CCS都是电流源模型,但ECSM的“有效电流源”这个叫法容易让人以为它也是电流源。实际上ECSM存储的是电压波形,工具内部会根据电压波形反推电流行为。这个区别在理解模型精度和调试时序违例时很重要。
2.4 三种模型的精度与开销对比
把三种模型放在一起对比,能更清楚地看到各自的定位:
| 特性 | NLDM | CCS | ECSM |
|---|---|---|---|
| 建模对象 | 延迟查表 | 电流波形 | 电压波形 |
| 精度 | 低(65nm以下偏差大) | 高(接近SPICE) | 高(接近SPICE) |
| 文件体积 | 小 | 大 | 中到大 |
| 计算速度 | 快 | 慢 | 中 |
| 适用节点 | 0.25μm及以上 | 65nm及以下 | 65nm及以下 |
| 噪声分析支持 | 不支持 | 支持 | 部分支持 |
| 工具兼容性 | 所有STA工具 | 主流STA工具 | 主流STA工具 |
从实际项目经验来看,28nm是一个分水岭。28nm及以上,NLDM在大多数情况下还能满足签核精度要求;28nm以下,尤其是16nm、7nm这些节点,必须用CCS或ECSM。我做过一个28nm的移动芯片项目,一开始用NLDM跑签核,时序裕量留了15%,结果用CCS复跑后发现实际违例路径多了三十多条,最后不得不重新优化。这个教训让我之后所有先进工艺项目都直接上CCS或ECSM,不再在模型精度上省钱。
3. 从.lib文件快速识别模型类型与质量
3.1 看文件头部和查找表结构
拿到一个.lib文件,怎么快速判断它是哪种模型?最直接的方法是看查找表的结构和关键字。
NLDM的.lib文件里,时序信息通常以cell_rise、cell_fall、rise_transition、fall_transition这些关键字出现,每个都是一张二维查找表,索引是输入转换时间和输出负载。你搜索cell_rise就能看到典型的5x5或7x7表格。
CCS的.lib文件里,你会看到output_current_rise、output_current_fall这些关键字,后面跟着的是电流波形数据。波形数据通常以vector的形式存储,每个vector包含一组时间点和对应的电流值。CCS库的文件头部通常会有ccs_timing或ccs_noise之类的标识。
ECSM的.lib文件里,关键字是output_voltage_rise、output_voltage_fall,存储的是电压波形。ECSM库的头部通常会有ecsm标识。
一个快速判断的技巧:用文本编辑器打开.lib文件,搜索output_current,如果有大量匹配,就是CCS;搜索output_voltage,如果有大量匹配,就是ECSM;如果只看到cell_rise和cell_fall,那就是NLDM。
3.2 检查查找表的分辨率和覆盖范围
识别出模型类型后,下一步是评估库的质量。查找表的分辨率直接影响到插值精度。对于NLDM,我一般要求输入转换时间和输出负载的索引点至少各7个,覆盖范围要能包住项目中实际出现的最大值和最小值。如果索引点太少,比如只有3个,插值误差会很大。
对于CCS和ECSM,重点看波形数据的采样密度。采样点太少会导致波形失真,影响延迟计算精度。我通常检查vector里的时间点数量,至少要有20个以上,关键区域(波形上升沿和下降沿附近)的采样要更密。
还有一个容易忽略的点是温度和工作电压的覆盖。先进工艺下,单元延迟对温度和电压非常敏感。一个好的库应该提供多个PVT角下的时序信息,至少覆盖SS、TT、FF三个角,温度范围要覆盖项目的工作条件。如果库只提供了一个角的数据,签核时就要格外小心。
3.3 用SPICE仿真做交叉验证
最可靠的库质量评估方法是用SPICE仿真做交叉验证。具体做法是:从库中挑几个典型单元(比如反相器、缓冲器、与非门),在SPICE中搭建相同的测试电路,扫描输入转换时间和输出负载,得到延迟数据,然后和库中的查表值对比。
我一般会选5个单元、每个单元选10个测试点,总共50个数据点做对比。如果NLDM库的偏差超过10%,或者CCS/ECSM库的偏差超过5%,就说明库的质量有问题,需要联系代工厂确认。
这个验证过程听起来麻烦,但实际做一次只需要半天时间,而且能避免后期签核时出现难以排查的时序问题。我在一个40nm项目上就靠这个方法发现代工厂提供的NLDM库在低负载区域有系统性偏差,及时换用了CCS库,避免了流片风险。
4. 实际项目中的模型选型与配置实操
4.1 根据工艺节点和精度要求做选择
模型选型的第一原则是看工艺节点。0.25μm及以上,NLDM足够;0.18μm到65nm,NLDM可以用,但关键路径建议用CCS或ECSM复核;65nm以下,直接上CCS或ECSM,不要在NLDM上浪费时间。
第二个原则是看设计类型。高性能处理器、AI加速器这类对时序极其敏感的设计,即使是在28nm节点,我也建议用CCS或ECSM。而一些低速接口、控制逻辑为主的设计,在28nm用NLDM也能过签核。
第三个原则是看签核要求。有些项目要求时序签核必须和SPICE仿真结果在5%以内,这种要求下NLDM基本不可能满足,必须用CCS或ECSM。
实际操作中,我通常会准备两套库:一套NLDM用于早期探索和快速迭代,一套CCS或ECSM用于最终签核。早期用NLDM跑综合和布局,速度快,能快速收敛;后期换CCS或ECSM做签核,保证精度。这种“双库策略”在项目周期紧张时特别有用。
4.2 在STA工具中配置多模型库
主流STA工具都支持同时读入多种类型的库,但配置方式有差异。以常见的工具流程为例,你需要在配置文件里指定库的搜索路径和链接库。
一个典型的配置片段:
set search_path [list . ./libs/nldm ./libs/ccs] set link_library [list \ slow_nldm.db \ slow_ccs.db \ fast_nldm.db \ fast_ccs.db \ ] set target_library [list slow_ccs.db fast_ccs.db]这里的关键是link_library和target_library的区别。target_library是综合和优化时用的库,link_library是链接时用的库。做签核时,target_library应该指向CCS或ECSM库,确保优化和签核用的是同一套模型。
注意:不要混用不同模型类型的库做同一条路径的时序计算。比如综合用NLDM、签核用CCS,这会导致优化目标和签核结果不一致,出现“综合过了但签核不过”的情况。
4.3 处理库之间的单位不一致问题
不同代工厂、不同版本的库,单位可能不一致。常见的有时间单位(ns vs ps)、电容单位(pF vs fF)、电压单位(V vs mV)。如果单位搞错了,时序结果会差几个数量级。
检查单位的方法是看.lib文件头部的time_unit、capacitance_unit、voltage_unit字段。我一般会在读库后跑一个简单的测试脚本,检查几个已知单元的延迟值是否在合理范围内。比如一个反相器在TT角下的延迟应该在几十皮秒量级,如果读出来是几纳秒或者几飞秒,那肯定是单位有问题。
还有一个坑是库的版本和工具版本的兼容性。有些新版本的库用了新的语法特性,老版本工具读不了;反过来,老库在新工具上也可能有兼容性问题。我一般会在项目启动时确认工具版本和库版本的匹配关系,避免后期返工。
4.4 用CCS/ECSM做串扰噪声分析
CCS和ECSM相比NLDM的另一个优势是支持串扰噪声分析。在先进工艺下,互连线之间的耦合电容越来越大,串扰导致的延迟变化和噪声毛刺成为时序签核必须考虑的因素。
做串扰分析时,工具需要知道驱动单元的电流波形和接收端的噪声容限。CCS库提供了完整的电流波形数据,可以直接用于噪声计算。ECSM库如果包含噪声数据,也可以支持。NLDM库完全不支持噪声分析,这是它在先进工艺下被淘汰的另一个重要原因。
配置串扰分析的典型流程是:先读入CCS或ECSM库,然后在STA工具中开启串扰分析选项,设置噪声容限和传播阈值,最后跑带串扰的时序分析。这个过程计算量很大,我一般会先跑无串扰的时序分析,定位关键路径,再对关键路径做带串扰的详细分析,节省运行时间。
5. 常见问题排查与避坑经验
5.1 时序结果与SPICE偏差过大
这是最常见的问题。排查思路是从单元级到路径级逐步定位。
先检查单个单元的延迟。从STA结果中找一个单元,记录它的输入转换时间、输出负载、以及STA计算出的延迟。然后在SPICE中搭建相同条件的测试电路,仿真得到延迟。如果单元级偏差就很大,说明库本身有问题,需要联系代工厂。
如果单元级偏差正常,但路径级偏差大,问题可能出在互连延迟计算上。检查寄生参数提取是否准确、互连模型是否和单元模型匹配。我遇到过一次,单元用CCS库、互连用NLDM风格的延迟模型,结果路径延迟偏差超过20%。后来统一用CCS风格的互连模型,偏差降到3%以内。
5.2 库读入报错或警告
库读入时的报错和警告不能忽略。常见的报错包括:语法错误、单位不匹配、查找表索引不单调、波形数据不完整等。
语法错误通常是库文件损坏或版本不兼容,重新下载或换版本试试。单位不匹配需要检查工具的单位设置和库的单位设置是否一致。查找表索引不单调是库生成时的错误,这种库不能用,必须换。波形数据不完整可能是文件传输过程中损坏,校验一下文件完整性。
我一般会在读库后跑一个check_library命令,把所有的警告和错误都过一遍。有些警告看起来无害,但可能在特定条件下导致计算错误,不能掉以轻心。
5.3 不同PVT角下的模型切换
先进工艺项目通常需要在多个PVT角下做签核。每个角对应一套库,切换时要注意库的对应关系。
一个常见的错误是混用了不同角的库。比如用SS角的单元库配FF角的互连库,结果时序完全不对。我一般会在配置文件里把每个角的库路径写清楚,用变量控制,避免手动切换时出错。
还有一个坑是温度反转效应。在先进工艺下,某些单元在低温下的延迟反而比高温下大。如果库没有覆盖足够的温度范围,签核时可能漏掉最差情况。我一般会要求库覆盖-40°C到125°C,至少包含低温、常温、高温三个角。
5.4 模型精度与运行时间的平衡
CCS和ECSM的精度高,但运行时间长。一个大型SoC的签核,用CCS库跑一遍可能要十几个小时甚至几天。项目周期紧张时,这个时间成本很难接受。
我的做法是分级签核:先用NLDM跑全芯片的快速分析,定位关键路径和违例区域;然后只对关键路径和违例区域用CCS或ECSM做详细分析。这样既能保证关键路径的精度,又能控制运行时间。
另一个技巧是并行化。主流STA工具都支持多线程和分布式计算,把签核任务拆分成多个子任务并行跑,能大幅缩短时间。我一般会把芯片按模块拆分,每个模块单独跑签核,最后合并结果。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 单元延迟偏差大 | 库精度不足 | SPICE交叉验证 | 换CCS/ECSM库 |
| 路径延迟偏差大 | 互连模型不匹配 | 检查互连模型类型 | 统一模型类型 |
| 库读入报错 | 语法/单位/版本问题 | 检查文件头和工具设置 | 修正单位或换库 |
| 时序结果异常 | PVT角混用 | 检查库路径配置 | 统一PVT角 |
| 运行时间过长 | 模型计算量大 | 分析各阶段耗时 | 分级签核+并行化 |
| 串扰分析失败 | 库不支持噪声 | 检查库类型 | 换CCS库 |
6. 先进工艺下的模型演进与实操建议
6.1 从FinFET到GAA的模型挑战
工艺走到FinFET节点之后,单元的电气特性变得更加复杂。鳍式结构带来的量子限制效应、自热效应、以及更显著的工艺变异,让传统的查表模型越来越吃力。到了GAA(全环绕栅极)节点,单元延迟对输入转换时间的依赖更加非线性,NLDM基本完全失效,CCS和ECSM也在不断演进。
代工厂在先进节点上通常会提供LVF(Liberty Variation Format)库,在CCS或ECSM的基础上增加变异信息。LVF库能更准确地建模工艺变异对延迟的影响,是做先进工艺签核的必备。如果你的项目在16nm以下,一定要确认代工厂是否提供了LVF库。
6.2 机器学习辅助的时序建模
最近几年,用机器学习方法做时序建模的研究越来越多。基本思路是用神经网络或高斯过程回归来拟合单元延迟与输入转换时间、输出负载、以及PVT条件的关系。这种方法的优势是能捕捉传统查表法难以描述的高维非线性关系,精度可以超过CCS和ECSM。
不过,机器学习模型目前还没有被主流签核流程广泛接受,主要原因是可解释性差、验证困难、以及工具支持不足。我在实际项目中还没有用过机器学习模型做签核,但会关注这个方向的发展。如果你在做前沿研究,可以尝试用ML模型做快速预估,但最终签核还是要用代工厂提供的标准模型。
6.3 给新人的学习路径建议
如果你是刚接触时序模型的新人,我建议按这个路径学习:
第一步,理解NLDM的查表原理和插值方法。找一个简单的.lib文件,手动计算几个点的延迟,和工具结果对比,建立直观认识。
第二步,学习CCS和ECSM的波形建模原理。不用深入推导公式,但要理解电流波形和电压波形如何转化为延迟。
第三步,在实际项目中跑一遍完整的签核流程。从读库、配置PVT角、跑时序分析、到排查违例,走一遍全流程。
第四步,做一次SPICE交叉验证。亲手搭测试电路,对比库和SPICE的结果,感受不同模型的精度差异。
这个路径走下来,大概需要两到三个项目的时间。之后你再看到.lib文件,就能快速判断它的类型、质量、以及是否适合当前项目。
6.4 几个容易踩的坑
第一个坑是盲目相信库的默认配置。有些库的默认工作电压和温度可能和你的项目不一致,直接拿来用会导致时序偏差。我一般会在读库后手动设置工作条件,确保和项目规格一致。
第二个坑是忽略库的版本更新。代工厂会不定期更新库,修正错误或提升精度。如果项目周期长,中途要确认是否有新版本库可用。我有一次在项目后期发现代工厂更新了CCS库,修正了一个低负载区域的偏差,换库后时序结果改善了5%。
第三个坑是不做库的交叉验证。有些小代工厂的库质量参差不齐,不做验证直接用,风险很大。我一般会在项目启动阶段就做一次库质量评估,把问题暴露在前面。
第四个坑是混用不同来源的库。比如单元库用A代工厂的,互连库用B代工厂的,这种混用很容易出问题。尽量用同一来源的库,如果必须混用,要做充分的交叉验证。
6.5 工具配置的实操细节
最后分享几个工具配置的实操细节。在配置多角签核时,我一般会用脚本自动生成配置文件,避免手动写错。脚本从项目配置文件中读取PVT角列表和对应的库路径,生成工具能识别的配置。
对于CCS库,读入时要注意设置ccs_timing或ccs_noise选项,告诉工具库的类型。有些工具会自动识别,有些需要手动指定。如果读入后时序结果异常,先检查这个选项。
对于ECSM库,要注意波形数据的采样率和插值方法。有些工具支持设置插值精度,精度越高结果越准但速度越慢。我一般会在签核阶段用高精度设置,在早期探索阶段用低精度设置。
还有一个细节是库的搜索路径顺序。如果多个路径下有同名库文件,工具会按搜索路径顺序选择。我一般会把签核用的库放在搜索路径最前面,避免误用旧版本库。
这些配置细节看起来琐碎,但实际项目中出问题往往就是这些地方。我踩过几次坑之后,现在会在项目启动时写一个配置检查清单,逐项确认,确保万无一失。