2. Lattice FPGA时序基础与静态时序分析

时序收敛的本质,是让每一组“发射沿—数据路径—捕获沿”的关系都满足建立与保持的双重约束。Lattice FPGA 的静态时序分析(STA)不依赖激励向量,而是把设计拆解成时序路径,逐条计算到达时间与要求时间,再给出裕量(Slack)。理解 STA,先要理解它衡量的四个基本量:建立时间、保持时间、时钟偏斜与抖动。

建立时间与保持时间:捕获端的双重窗口

建立时间 Tsu 指数据必须在捕获时钟有效沿之前稳定的最短时间;保持时间 Th 指有效沿之后数据仍需保持稳定的最短时间。二者共同在捕获沿两侧划出一个“禁止跳变窗口”,数据穿越窗口就会导致亚稳态或误采样。

以 Lattice ECP5 的通用寄存器为例,数据从发射寄存器经组合逻辑到达捕获寄存器,建立关系可写成:

Tclk_period ≥ Tco + Tlogic + Trouting + Tsu − Tskew
Slack_setup = 要求时间 − 到达时间
            = (Tclk_period + Tskew) − (Tco + Tlogic + Trouting + Tsu)

保持关系则与时钟周期无关,只比较同一沿附近的数据保持能力:

Slack_hold = (Tco + Tlogic + Trouting) − (Th + Tskew)

这里约定:Tskew 定义为捕获时钟到达时刻减去发射时钟到达时刻,正值表示捕获沿“来得更晚”。全文与图示均采用这一约定。若 Tskew 为正,建立裕量增大、保持裕量减小;反之则相反。这正是偏斜治理中“不能只盯建立”的原因。

时钟偏斜与抖动:两类不同的时钟不确定性

时钟偏斜是空间概念:同一时钟域内,因走线长度、缓冲级数、时钟树结构不同,各寄存器收到的时钟沿存在固定的到达时间差。抖动是时间概念:同一节点上,时钟沿相对理想位置随周期波动,包括随机抖动与确定性抖动。STA 通常把抖动折算为时钟不确定度(Uncertainty),从要求时间中扣除;偏斜则通过时钟树分析或显式约束参与计算。

偏斜可通过布局与时钟树平衡改善,抖动只能通过时钟源质量、PLL 配置与裕量预留来管理。二者在约束中分别体现为 skew 与 uncertainty,不要混为一谈。

时序路径分类:四条路径,四种约束

Lattice Timing Analyzer 把路径分为四类,每类的起止点和约束方式都不同:

  • 输入到寄存器:从器件输入引脚经外部器件到内部寄存器,用 set_input_delay 描述。
  • 寄存器到寄存器:完全在 FPGA 内部,由时钟周期与时钟不确定性约束,是时序收敛的主战场。
  • 寄存器到输出:从内部寄存器经输出逻辑到引脚,用 set_output_delay 描述。
  • 输入到输出(纯组合):不经过寄存器,需用 set_max_delay 或虚拟时钟单独约束。

此外还有跨时钟域路径与异步复位路径,前者通常用 set_clock_groups 或 set_false_path 声明为伪路径,后者需检查恢复/移除时间。分类的意义在于:只有先判断路径属于哪一类,才能选对约束命令,否则约束再紧也只是“错位的努力”。

Lattice FPGA 时序路径分类与约束映射 发射寄存器 FF (Launch) 组合逻辑 LUT / 路由 捕获寄存器 FF (Capture) 数据路径 Tco + Tlogic + Trouting 时钟路径(偏斜 Tskew = 捕获到达 − 发射到达) 捕获沿禁止窗口 Tsu(沿前) | Th(沿后) 输入 → 寄存器 set_input_delay 外部器件延迟 + 板级走线 约束输入到达时刻 寄存器 → 寄存器 create_clock 时钟周期 + 不确定性 + 偏斜 时序收敛主战场 寄存器 → 输出 set_output_delay 外部建立/保持需求 + 板级走线 约束输出稳定时刻 输入 → 输出 set_max_delay 纯组合路径 虚拟时钟参考 无寄存器可借力

Lattice Timing Analyzer 工具链概览

Lattice 的 STA 能力主要集成在 Diamond 与 Radiant 两条工具链中。Diamond 面向 ECP5、MachXO 等器件,使用 TRACE 引擎;Radiant 面向 CrossLink-NX、Certus-NX、Mach-NX 等新一代器件,使用 Timing Analyzer 视图。两者流程一致:综合后生成网表,映射布局布线后提取实际延迟,再执行时序分析。

典型使用路径如下:

  1. 在 .lpf(Diamond)或 .pdc(Radiant)约束文件中定义时钟、输入输出延迟与伪路径。
  2. 运行布局布线,工具自动调用时序引擎。
  3. 打开 Timing Analyzer,查看 Summary 中的 WNS(最差建立裕量)、TNS(总负裕量)、WHS(最差保持裕量)、THS。
  4. 在 Path 列表中定位关键路径,查看其起点、终点、逻辑级数与各级延迟。

判断收敛的常用标准是:WNS ≥ 0 且 WHS ≥ 0,同时 TNS 与 THS 为 0。若 WNS 为负,说明存在建立违例;若 WHS 为负,说明保持违例。前者通常通过降低逻辑级数、优化布局或放宽周期解决;后者多与偏斜过大或路径过短有关,可通过插入延迟或调整时钟树改善。

不要只看 WNS 就宣布收敛。跨时钟域路径若未正确声明为伪路径,会被误报为违例;而真正危险的异步路径若被错误地设为 false_path,则会被掩盖。约束的准确性比裕量数字本身更重要。

一个可复用的时序检查清单

检查项关注内容判断依据
时钟定义主时钟、生成时钟、PLL 输出是否全部约束Timing Analyzer 中无未约束时钟
输入输出延迟外部器件 Tco/Tsu/Th 与板级走线是否折算IO 路径裕量合理,不过松也不过紧
跨时钟域同步器是否存在,是否声明 clock_groups无跨域误报,无真实违例被掩盖
伪路径异步复位、静态配置、测试逻辑是否排除伪路径列表可追溯、有依据
裕量汇总WNS/TNS/WHS/THS 是否全部达标四项均满足,且留有一定余量

把这张清单与前面的路径分类对应起来,就能形成“先分类、再约束、后看裕量”的闭环。下一阶段的实际收敛工作,都将围绕这四类路径和四个裕量指标展开。