4. 静态时序分析(STA)在Lattice中的实战
静态时序分析不依赖激励向量,而是把设计展开成时序图,对所有路径逐一计算到达时间与要求时间,再判断裕量是否为正。在Lattice Diamond或Radiant流程中,综合、映射、布局布线之后都会生成时序报告,真正需要精读的是布线后的报告,因为只有它包含真实的布线延迟与时钟树延迟。本节围绕建立/保持检查、跨时钟域分析、多周期与虚假路径约束,以及报告解读与关键路径定位展开。
一、建立与保持检查的物理含义
建立检查约束的是数据到达触发器D端的时间必须早于捕获时钟沿至少一个建立时间;保持检查约束的是数据在捕获沿之后仍需稳定至少一个保持时间。以Lattice ECP5的普通触发器为例,其建立时间约为0.2~0.4ns、保持时间约为0.1~0.2ns(具体值随器件、速度等级和温度变化,应以数据手册为准)。
对一条从寄存器A到寄存器B的路径,建立裕量可写成:
Setup Slack = (T_clk + T_skew) - (T_co + T_logic + T_route + T_setup)
Hold Slack = (T_co + T_logic + T_route) - (T_hold + T_skew)
其中T_co为发射触发器时钟到输出的延迟,T_logic为组合逻辑延迟,T_route为布线延迟,T_skew为两个触发器时钟到达时间之差。可以看到,增大时钟周期只改善建立裕量,对保持裕量没有帮助;而减小布线延迟同时改善两者。这也是为什么保持违例通常出现在短路径上——数据跑得太快,抢在捕获沿的保持窗口内就变了。
二、时钟域交叉分析
STA工具默认把不同时钟域之间的路径当作同步路径分析,这会产生大量虚假违例。实际工程中应区分三类跨时钟域路径:
- 慢到快、单比特控制信号:用两级同步器,STA中应设为false path或set_max_delay,避免工具按最坏情况报违例。
- 快到慢、脉冲信号:需要脉冲展宽或握手,否则会丢脉冲,STA无法发现这类功能问题。
- 多比特数据总线:必须用异步FIFO或格雷码,不能简单打两拍,否则会出现数据错位。
在Radiant中可用set_clock_groups -asynchronous声明异步时钟组,或用set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]逐条切断。注意:切断之后工具不再检查,功能正确性必须靠CDC检查工具或人工审查保证。
三、多周期路径与虚假路径
多周期路径适用于数据需要多个时钟周期才能稳定的场景,例如分频器输出、慢速外设接口。若某路径实际允许4个周期,但工具按1个周期分析,会报出巨大负裕量。此时应写:
set_multicycle_path 4 -setup -from [get_cells src_reg*] -to [get_cells dst_reg*]
set_multicycle_path 3 -hold -from [get_cells src_reg*] -to [get_cells dst_reg*]
保持约束通常设为建立周期数减1,目的是把保持检查沿拉回到发射沿附近,否则工具会把保持检查放在第4个周期,反而放松了要求。虚假路径则用于逻辑上不可能发生的路径,例如复位多路选择器的非激活分支、测试逻辑、上电后固定的配置寄存器。虚假路径与多周期路径的区别在于:前者是“永远不会走”,后者是“走得慢但会走”。
四、报告解读与关键路径定位
Lattice时序报告通常包含Summary、Clock Domains、Path Details三部分。先看Summary中的WNS(最差负裕量)和TNS(总负裕量),若WNS为负再看具体路径。Path Details会列出每条路径的起点、终点、各级延迟和时钟偏斜。定位关键路径时,重点关注:
- 组合逻辑级数是否过多,一般建议单周期路径不超过6~8级LUT。
- 是否存在大位宽比较器、乘法器或优先级编码器,这些是常见瓶颈。
- 布线延迟占比是否异常,若超过逻辑延迟的2倍,说明布局拥塞。
- 时钟偏斜是否过大,检查时钟树是否被约束为全局资源。
下面这张图展示了一条典型路径从发射到捕获的时序关系,以及建立/保持窗口与裕量的位置,帮助理解报告中各延迟项对应的物理环节。
从图中可以看出,建立裕量是捕获沿与数据到达之间的差值,而保持裕量则取决于数据到达是否过早。实际调试时,若建立违例集中在少数路径,优先优化组合逻辑或插入流水线;若保持违例较多,检查是否存在过短的路径或时钟偏斜异常。对于跨时钟域路径,先确认约束是否正确,再判断是否需要同步器。只有把约束、报告和RTL结构三者对照起来,才能快速定位真正的时序瓶颈。