2. 时序路径与单元:时序路径的组成
各位同学,咱们今天聊聊时序路径。这东西听起来玄乎,说白了就是信号从起点跑到终点,中间经过组合逻辑的那段路。我刚开始做后端时,总觉得STA就是跑个脚本看结果,后来被一个路径违例折腾了三天,才明白路径分析的门道。
2.1 时序路径的三要素
一条完整的时序路径,由三个部分组成:起点、组合逻辑、终点。你想想看,就像快递从仓库出发,经过,最后送到客户手里。每个环节都有它的规矩。
起点:时钟触发的源头
路径的起点,通常是时序单元的时钟引脚。比如触发器的CK端。信号从时钟沿到来那一刻开始,经过触发器的内部延迟(CK->Q),然后往外走。
我个人习惯把起点分为两类:
- 输入端口:芯片的输入引脚,比如data_in。这时候起点是输入端口,约束由set_input_delay定义。
- 时序单元时钟端:比如触发器的CK。这是最常见的起点,STA工具会从时钟沿开始计算。
重点:起点决定了路径的初始时间。如果起点是输入端口,你得告诉工具信号什么时候到。如果起点是触发器,工具会自动从时钟沿开始算。
组合逻辑:路径的中间段
信号从起点出来后,会经过一堆组合逻辑门。比如与门、或门、多路选择器、加法器等等。这些门会引入延迟,也就是单元延迟和互连线延迟。
我在项目中遇到过一条路径,组合逻辑有20级,结果setup违例了0.5ns。当时我一看,好家伙,这组合逻辑太深了。后来我拆成两级流水,问题就解决了。所以,组合逻辑的级数,是STA分析的关键指标。
终点:数据被捕获的地方
路径的终点,通常是时序单元的数据输入引脚。比如触发器的D端。信号必须在时钟沿到来之前稳定下来,这就是setup检查。信号在时钟沿之后还要保持稳定一段时间,这就是hold检查。
终点也分两类:
- 输出端口:芯片的输出引脚,比如data_out。这时候终点是输出端口,约束由set_output_delay定义。
- 时序单元数据端:比如触发器的D端。这是最常见的终点,STA工具会检查setup和hold。
小技巧:分析路径时,我习惯先看起点和终点是什么类型。如果是输入到输出,那是纯组合路径,只检查延迟。如果是触发器到触发器,那是时序路径,要检查setup和hold。
2.2 标准单元库中的时序参数
标准单元库,说白了就是芯片的“积木块”。每个积木块都有它的时序参数。你想想看,没有这些参数,STA工具怎么算延迟?
核心时序参数
每个标准单元,至少包含以下几个时序参数:
| 参数名称 | 含义 | 单位 |
|---|---|---|
| cell_rise | 输出从低到高时的延迟 | ns/ps |
| cell_fall | 输出从高到低时的延迟 | ns/ps |
| rise_transition | 输出上升沿的转换时间 | ns/ps |
| fall_transition | 输出下降沿的转换时间 | ns/ps |
| setup_time | 数据在时钟沿前必须稳定的时间 | ns/ps |
| hold_time | 数据在时钟沿后必须保持的时间 | ns/ps |
这些参数不是固定值,它们会随着输入转换时间和输出负载电容变化。库文件里通常用查找表(NLDM)或者电流源模型(CCS)来描述这种关系。
注意:setup_time和hold_time是触发器的参数,不是组合逻辑的。组合逻辑只有cell_rise、cell_fall这些延迟参数。我曾经见过新手把setup_time加到组合逻辑上,结果算出来的延迟完全不对。
时序弧:路径的“地图”
每个标准单元内部,从输入引脚到输出引脚,都有一条或多条时序弧。比如一个两输入与门,从A到Z有一条弧,从B到Z也有一条弧。STA工具就是沿着这些弧计算延迟的。
时序弧分为两种:
- 组合弧:输入变化直接导致输出变化。比如与门、或门。
- 时序弧:时钟沿触发输出变化。比如触发器的CK到Q。
嗯,这里要注意:有些单元有多个时序弧,比如一个D触发器,从CK到Q有一条弧,从D到Q没有直接弧(因为D的变化不会立即影响Q)。这个逻辑关系,库文件里写得清清楚楚。
延迟计算:不是简单的加法
路径的总延迟,不是简单地把所有单元延迟加起来。因为每个单元的输入转换时间会影响下一个单元的延迟。这就是为什么STA工具要迭代计算。
我曾经调试过一条路径,手动算延迟和工具算的结果差了0.2ns。后来发现,我忽略了互连线上的RC延迟。所以,现在的工艺节点下,互连线延迟占比越来越大,甚至超过单元延迟。
避坑指南:我曾经在28nm项目上,以为组合逻辑延迟占主导,结果一条路径违例,查了半天发现是互连线太长,RC延迟太大。从那以后,我每次分析路径都会先看互连线长度。如果超过500um,就要小心了。
2.3 知识体系框架
下面这张图,是我自己总结的时序路径知识体系。你可以把它当作一个“地图”,方便以后查阅。
这张图把时序路径拆成了三层:路径本身、三要素、标准单元库参数。你分析路径时,可以按这个框架一步步来。先确定起点和终点类型,再看组合逻辑的级数和延迟,最后查标准单元库的参数。
个人经验:我每次拿到一个新设计,第一件事就是跑一条典型的路径,看看起点和终点是什么。如果发现路径是从输入端口到输出端口,那就要小心了,这种纯组合路径很容易出问题。我曾经在一个项目中,输入到输出的路径延迟太大,导致芯片无法正常工作。后来加了流水线寄存器,才解决问题。
好了,这一章的内容就到这里。时序路径的分析,说白了就是搞清楚信号从哪里来、经过哪里、到哪里去。标准单元库的参数,就是告诉你每个门要花多少时间。把这些搞清楚了,STA分析就成功了一半。