2. 时序路径分类:输入到寄存器、寄存器到寄存器、寄存器到输出、输入到输出
做时序分析,说白了就是搞清楚信号从哪来、到哪去。我刚开始接触STA时,看着密密麻麻的路径报告头都大了。后来带我的老工程师说了一句:「你把路径分成四类,问题就简单了。」嗯,这句话我一直记到现在。
这四类路径,就是:输入到寄存器、寄存器到寄存器、寄存器到输出、输入到输出。咱们一个一个说。
2.1 输入到寄存器(Input to Register)
这类路径从芯片的输入端口开始,终点是某个触发器的数据输入端。说白了,就是外部信号进来后,能不能在时钟沿到来前稳稳地采进去。
我在项目中遇到过一个问题:某次芯片的SPI接口死活读不到正确数据。查了半天,发现是输入路径的延时太大了,外部信号到了内部寄存器时已经过了建立时间。后来我在约束里加了 set_input_delay,问题就解决了。
关键点:输入路径的延时由两部分组成——外部器件的输出延时 + PCB走线延时。你需要在约束里告诉工具这些信息。
我的习惯:做输入路径分析时,我会先看输入端口到第一个寄存器的组合逻辑级数。如果超过3级,就要小心了。我曾经在一个项目中看到5级组合逻辑,结果setup违例了200多ps。
2.2 寄存器到寄存器(Register to Register)
这是最核心的一类路径。起点是一个触发器的时钟端,终点是另一个触发器的数据输入端。说白了,就是数据在两个寄存器之间传递,能不能在一个时钟周期内搞定。
你想想看,这类路径的延时由三部分组成:
- 时钟到输出延时(Tco):时钟沿到来后,数据从寄存器Q端输出的时间
- 组合逻辑延时(Tlogic):中间的组合逻辑电路造成的延时
- 布线延时(Twire):信号在连线上的传播延时
公式很简单:Tco + Tlogic + Twire < Tclk - Tsetup。如果违例了,要么减组合逻辑,要么减布线,要么换更快的寄存器。
注意:寄存器到寄存器的路径,最容易出现setup违例。我曾经在一个高速设计中,发现一条路径上有8级组合逻辑,setup违例了500ps。最后拆成了两级流水线才搞定。
2.3 寄存器到输出(Register to Output)
这类路径从寄存器开始,到芯片的输出端口结束。说白了,就是内部数据能不能在时钟沿后,在规定时间内送到芯片外面。
这里有个坑:输出路径的延时不仅包括寄存器到输出端口的内部延时,还要考虑外部器件的建立时间要求。我记得有一次,客户说我们的芯片输出数据不稳定。查了半天,发现是输出路径的延时太大,导致外部器件采不到正确的数据。
约束时用 set_output_delay 来告诉工具外部器件的建立时间要求。我的建议是:输出延时约束要留10%-15%的余量,别卡得太死。
经验之谈:寄存器到输出的路径,hold违例比setup违例更常见。因为输出路径通常组合逻辑少,数据跑得太快,容易在下一个时钟沿到来前就变了。
2.4 输入到输出(Input to Output)
这类路径从输入端口直接到输出端口,中间不经过任何寄存器。说白了,就是纯组合逻辑路径。
这类路径在设计中应该尽量避免。为什么?因为它不受时钟控制,延时完全由组合逻辑和布线决定。你想想看,如果输入信号变了,输出要多久才能稳定?这完全取决于路径长度。
我在项目中遇到过这种情况:一个简单的控制信号,从输入到输出经过了6级组合逻辑,结果延时达到了3ns。后来我加了一级寄存器,把路径切成了两段,问题就解决了。
我的建议:除非是异步复位、测试模式等特殊情况,否则尽量别用输入到输出的纯组合路径。加一级寄存器,时序就好控多了。
2.5 四类路径的对比
| 路径类型 | 起点 | 终点 | 常见违例 | 约束方法 |
|---|---|---|---|---|
| 输入到寄存器 | 输入端口 | 寄存器D端 | setup违例 | set_input_delay |
| 寄存器到寄存器 | 寄存器CK端 | 寄存器D端 | setup/hold违例 | create_clock |
| 寄存器到输出 | 寄存器CK端 | 输出端口 | hold违例 | set_output_delay |
| 输入到输出 | 输入端口 | 输出端口 | 组合逻辑延时 | set_max_delay |
2.6 四类路径的关系图
下面这张图,是我画的一个四类路径的框架图。你看一眼,就能明白它们之间的关系。
从这张图可以看得很清楚:四类路径覆盖了芯片内部所有可能的信号流向。你拿到一份时序报告,先看路径属于哪一类,然后对症下药。
总结一下:四类路径中,寄存器到寄存器是最常见的,也是我们优化的重点。输入到输出要尽量避免。输入到寄存器和寄存器到输出,关键是把约束设对。
嗯,这四类路径搞清楚了,后面分析时序违例报告时,你就能一眼看出问题出在哪。我曾经带过一个新人,他看了三天时序报告还是一头雾水。我让他先把路径分类,结果半天就理清了思路。你试试看?