第二章:时序路径分类——四种路径,四种脾气
做时序分析这么多年,我最大的体会就是:你得先知道敌人长什么样,才能谈怎么打。时序路径说白了就四种,每种都有自己的脾气。今天我就把这四种路径掰开揉碎了讲清楚。
2.1 寄存器到寄存器路径(Reg-to-Reg)
这是最常见的一种路径,也是我们平时花精力最多的地方。
什么叫寄存器到寄存器?就是一个触发器的输出,经过组合逻辑,跑到另一个触发器的输入端。嗯,就这么简单。
核心公式:
T_clk + T_ck2q + T_logic + T_setup ≤ T_period
其中:
- T_clk:时钟周期
- T_ck2q:寄存器时钟到输出的延迟
- T_logic:组合逻辑延迟
- T_setup:建立时间要求
我在项目中遇到过最头疼的情况,就是这条路径上的组合逻辑太深。有一次做AI加速器,一个关键路径的T_logic占了整个周期的70%。我当时就意识到,这条路径的优化空间其实最大——要么插流水线,要么重写逻辑。
我的个人习惯:每次综合完,第一件事就是看Reg-to-Reg路径的slack。如果slack小于0.1ns,我基本就会开始考虑插寄存器了。别等到后端布局布线完再后悔,那时候改起来成本高得多。
2.2 输入到寄存器路径(Input-to-Reg)
这条路径是从芯片的输入端口,经过一些组合逻辑,到达第一个触发器的数据输入端。
说白了,这就是外部信号进入芯片后的第一段旅程。这段路好不好走,直接决定了你的芯片能不能正确接收外部数据。
约束要点:
set_input_delay -clock [get_clocks clk] -max 2.5 [get_ports data_in]
这个input delay怎么设?我建议你参考上一级芯片的输出延迟。别瞎猜,要跟系统工程师对清楚。
我曾经吃过一次亏。有个项目,我随便设了个input delay,结果流片回来发现数据老是采错。查了三天,最后发现是input delay设小了,外部数据到达时间比预期晚了0.3ns。你想想看,0.3ns的误差,在1GHz的时钟下就是半个周期的事。
避坑指南:我曾经因为input delay设得太乐观,导致芯片在高温下工作不稳定。后来我学乖了,input delay一定要留余量,至少留10%的margin。温度、电压、工艺角,这些都会影响外部器件的输出延迟。
2.3 寄存器到输出路径(Reg-to-Output)
这条路径是从最后一个寄存器,经过输出缓冲,到达芯片的输出端口。
它的时序约束跟Input-to-Reg有点像,但方向反了。这里我们关心的是输出延迟——数据从时钟沿到出现在输出端口需要多长时间。
约束示例:
set_output_delay -clock [get_clocks clk] -max 3.0 [get_ports data_out]
这个值通常由下一级芯片的建立时间要求决定。
我记得有个项目,输出路径的T_ck2q特别大,因为输出缓冲驱动能力不够。后来我换了个大驱动力的buffer,延迟直接降了40%。有时候问题不在逻辑,而在驱动。
2.4 输入到输出路径(Input-to-Output)
这条路径最特殊——它完全由组合逻辑组成,中间没有寄存器。
说白了,就是从输入端口直接到输出端口,中间全是组合电路。这种路径在纯组合逻辑设计中很常见,比如地址译码器、多路选择器。
约束方式:
set_max_delay -from [get_ports addr_in] -to [get_ports sel_out] 5.0
注意,这里不能用setup/hold约束,要用set_max_delay/set_min_delay。
我个人不太喜欢这种路径。为什么?因为它没有寄存器做缓冲,任何组合逻辑的变化都会直接反映到输出。在高速设计中,这种路径很容易成为瓶颈。我建议能加寄存器就加寄存器,实在不行才用纯组合路径。
2.5 四种路径对比
| 路径类型 | 起点 | 终点 | 约束方式 | 优化重点 |
|---|---|---|---|---|
| Reg-to-Reg | 寄存器 | 寄存器 | create_clock + setup/hold | 组合逻辑深度 |
| Input-to-Reg | 输入端口 | 寄存器 | set_input_delay | 外部延迟匹配 |
| Reg-to-Output | 寄存器 | 输出端口 | set_output_delay | 输出驱动能力 |
| Input-to-Output | 输入端口 | 输出端口 | set_max_delay | 纯组合路径优化 |
2.6 知识体系图
下面这张图展示了四种路径在芯片中的位置关系,我建议你把它记在脑子里:
2.7 我的实战建议
四种路径,四种处理方式。我总结了几条经验:
- Reg-to-Reg是主战场——大部分时序问题都出在这里。优先优化这条路径。
- Input-to-Reg和Reg-to-Output要跟外部对齐——别自己瞎猜,一定要跟系统工程师确认外部器件的时序参数。
- Input-to-Output能不用就不用——纯组合路径在高速设计中就是定时炸弹。我建议加一级寄存器,成本不高,但能省很多麻烦。
一个小技巧:在做STA之前,先手动把四种路径都标出来。我习惯在代码里加注释,比如// REG2REG_PATH、// IN2REG_PATH。这样后面分析报告时,一眼就能看出是哪类路径出了问题。
好了,四种路径就讲到这里。记住它们的脾气,后面分析时序报告时你就能快速定位问题。说白了,时序分析就是跟这四种路径打交道,摸透了它们的规律,你就成功了一半。