2. FPGA基础回顾
时序分析,说白了就是检查你的设计能不能在目标频率下稳定工作。我刚开始做FPGA时,总觉得时序约束是后端的事,跟我写RTL没关系。直到有一次,一个看似简单的计数器在板子上跑着跑着就跳数了——嗯,从那以后我再也不敢忽视时序分析了。
这一章,我们先把时序分析的基础打牢。你理解了建立时间、保持时间、时钟偏斜和抖动这些概念,后面做RISC-V软核的时序优化才能有的放矢。
2.1 建立时间与保持时间:触发器的“铁律”
每个触发器都有两个硬性要求:建立时间(Setup Time, Tsu)和保持时间(Hold Time, Th)。
- 建立时间:时钟有效沿到来之前,数据必须保持稳定的最短时间。
- 保持时间:时钟有效沿到来之后,数据必须保持稳定的最短时间。
你可以把触发器想象成一个“拍照”的过程。时钟沿就是按下快门,建立时间要求你在按下快门之前摆好姿势,保持时间要求你在按下快门之后别乱动。任何一个不满足,拍出来的照片就是模糊的——也就是亚稳态。
关键公式(建立时间检查):
T<sub>clk</sub> + T<sub>skew</sub> ≥ T<sub>co</sub> + T<sub>logic</sub> + T<sub>su</sub>
其中Tclk是时钟周期,Tskew是时钟偏斜,Tco是触发器输出延迟,Tlogic是组合逻辑延迟。
我的经验:在RISC-V软核中,最长的组合逻辑路径通常出现在ALU或加载/存储地址计算单元。我习惯先约束这些关键路径,让工具优先优化它们。
2.2 时钟偏斜与抖动:理想时钟不存在
理想情况下,时钟信号应该同时到达所有触发器。但现实是,时钟网络有延迟,而且这个延迟还不一样。
时钟偏斜(Clock Skew)
时钟偏斜是指同一个时钟信号到达不同触发器的时间差。它分为两种:
- 正偏斜:目标触发器比源触发器晚收到时钟。这有助于建立时间,但会恶化保持时间。
- 负偏斜:目标触发器比源触发器早收到时钟。这有助于保持时间,但会恶化建立时间。
我在项目中遇到过一种情况:一个RISC-V处理器的写回路径总是出现保持时间违例。查了半天,发现是时钟树综合时,写回级的触发器比执行级的触发器更靠近时钟源,产生了负偏斜。解决办法是在路径中插入两级缓冲器,人为增加延迟。
时钟抖动(Clock Jitter)
时钟抖动是时钟边沿在时间上的随机变化。它主要由电源噪声、温度变化和PLL相位噪声引起。
| 类型 | 来源 | 对时序的影响 |
|---|---|---|
| 周期抖动 | PLL噪声、电源波动 | 影响建立时间裕量 |
| 长期抖动 | 温度漂移、老化 | 影响系统同步 |
| 随机抖动 | 热噪声、散粒噪声 | 不可预测,需统计处理 |
注意:时钟抖动是随机量,STA工具通常用“最差情况抖动”来建模。我曾经在RISC-V的调试接口上吃过亏——调试时钟来自外部晶振,抖动比内部PLL大得多,导致调试器偶尔读回错误数据。后来我在调试路径上加了双级同步器才解决。
2.3 时序路径分类:三种路径,三种约束
FPGA中的时序路径可以分为三类。每种路径的约束方法不同,我们一个一个看。
2.3.1 寄存器到寄存器路径
这是最常见的路径,也是STA工具最擅长分析的路径。数据从源触发器的Q端出发,经过组合逻辑,到达目标触发器的D端。
约束方法很简单:只要指定时钟周期,工具会自动检查所有寄存器到寄存器的路径。
# 创建时钟
create_clock -name clk -period 10.0 [get_ports clk]
# 工具自动分析所有reg-to-reg路径
# 不需要额外指定
2.3.2 输入路径(输入端口到寄存器)
数据从芯片外部进入,经过输入缓冲和组合逻辑,到达第一个触发器。外部器件的数据输出延迟和PCB走线延迟都会影响这个路径。
约束时,你需要告诉工具:外部数据相对于时钟是什么时候有效的。
# 输入延迟约束
set_input_delay -clock clk -max 2.5 [get_ports data_in]
set_input_delay -clock clk -min 1.0 [get_ports data_in]
我个人习惯在约束输入路径时,先测量外部器件的最大输出延迟,再加上PCB走线延迟的裕量。比如外部ADC的Tco是2ns,PCB走线延迟约0.5ns,那我就会设输入延迟为2.5ns。
2.3.3 输出路径(寄存器到输出端口)
数据从最后一个触发器出发,经过输出缓冲,到达芯片外部。外部器件的建立时间要求决定了输出路径的约束。
# 输出延迟约束
set_output_delay -clock clk -max 3.0 [get_ports data_out]
set_output_delay -clock clk -min 0.5 [get_ports data_out]
输出延迟的数值怎么定?看外部器件的建立时间要求。如果外部器件的Tsu是3ns,那输出延迟就设为3ns。意思是:FPGA必须在时钟沿之后3ns内把数据送到外部器件。
避坑指南:我曾经在RISC-V的AXI总线接口上犯过一个错误——只约束了输入路径,忘了约束输出路径。结果综合工具报告所有输出路径都通过了,但板子上就是读不到正确数据。后来发现,输出路径的保持时间违例了,数据在时钟沿之后变化太快,外部器件根本抓不住。
2.4 知识结构总览
下面这张图把本章的核心知识点串起来了。你可以把它当作一个快速参考。
2.5 小结
这一章我们聊了三个核心概念:
- 建立时间和保持时间是触发器的物理约束,不满足就会出亚稳态。
- 时钟偏斜和抖动是现实中的非理想因素,会吃掉你的时序裕量。
- 三种时序路径需要不同的约束方法,输入/输出路径尤其容易出错。