FPGA 进阶 00:静态时序分析(STA)——WNS/TNS/TPWS 与 report_timing 精读
本文是
fpga/进阶层第 04 篇。入门篇 XDC 约束入门 讲了create_clock是时序分析基准,枢纽页 时序约束与收敛 给了约束体系地图。这一篇往下钻一层:工具拿到时钟约束后,到底怎么判断「时序过没过」——这就是静态时序分析(STA)。想看与芯片设计通用的 slack 原理,可对照 STA 报告解读,本篇专注 Vivado/Quartus 的报告读数与 FPGA 特性。
本文要回答的问题
- 不写测试向量、不仿真,工具凭什么说「时序收敛」?
- setup / hold 两种检查在算什么?launch 沿和 capture 沿怎么对?
- Timing Summary 里的 WNS / WHS / TNS / THS / TPWS 分别是什么,负了怎么办?
- 一条违例路径,怎么用
report_timing看出是「逻辑太深」还是「布线太长」? - FPGA 的 STA 和流片那套 STA 差在哪?
- launch/capture 沿、CPPR、时钟偏斜与不确定度在一条具体路径报告里如何逐项找到?
- 四个路径分组(reg-reg、in-reg、reg-out、in-out)的约束义务分别是什么?
- 互时钟路径(同源分频、异步、相移时钟)如何被分析,哪些报红是假违例?
- 怎样写一条 report_timing 命令精确取出最差的 N 条路径、按组过滤、导出给团队讨论?
- setup/hold 联合收敛时,加一级寄存器为什么可能让 hold 变好也可能变坏?
- 签核视角下多角点(corner)、ODC/伪路径、跨层次名字、增量实现如何影响 STA 结论?
一、STA 在干什么:把所有路径的时间「静态」算一遍
仿真(Testbench)是动态的:给一组激励看信号怎么变,但激励不可能覆盖所有路径。STA 反过来,不关心信号取什么值,它把电路看成「寄存器 + 组合逻辑」的图,枚举每条从一个时钟沿采样点到下一个采样点的路径,用单元延迟和布线延迟模型,静态地算出每条路径最坏要花多少时间,再和时钟周期比。
一条时序路径的固定结构:起点(源触发器 CLK 引脚 / 输入端口)→ 组合逻辑云 → 终点(目的触发器 D 引脚 / 输出端口)。

工具知道每级 LUT、每段布线的延迟(FPGA 是预制离散资源,选定器件后延迟基本确定),路径延迟加总就是数据到达时间(arrival time);再按时钟周期和目的端建立时间要求算出数据需求时间(required time)。两者一减:
- slack(裕量)= 需求时间 − 到达时间
- slack ≥ 0:来得及,满足;slack < 0:来不及,违例。
几万条路径全部枚举取最坏值,不需要一个测试向量——这就是它能「静态」保证时序的原因。
二、两种检查:setup 与 hold,两对时钟沿
触发器有两个时间要求,对应两类检查:
| 检查 | 物理含义 | 用哪两个沿 | slack<0 说明 | 直觉 |
|---|---|---|---|---|
| setup(建立) | 数据在采样沿之前必须提前稳定 | launch 沿 → 下一个 capture 沿(隔一周期) | 路径太慢 | 「来得太晚」 |
| hold(保持) | 数据在采样沿之后必须再保持一会儿 | launch 沿 → 同一个 capture 沿 | 路径太快 | 「冲得太早」 |
- setup:第 n 个沿从源 FF 发出数据(launch),第 n+1 个沿在目的 FF 采样(capture),组合逻辑必须在一个周期内传完。
setup slack = 周期 − 数据延迟 − 建立时间 − 时钟歪斜。 - hold:同一个沿既 launch 又 capture,要求这拍数据不能快到在同一沿就窜进目的端。
hold slack = 数据延迟 − 保持时间 − 时钟歪斜。注意 hold 与周期无关——提频不修 hold,降频也躲不开。
关键推论:setup 修「慢」、hold 修「快」,方向相反。加流水线修 setup(路径变短)却可能制造 hold(新寄存器间路径太短)。所以收敛惯例是 setup 先行、hold 后清(见 时序收敛方法)。
三、四个时序路径分组
STA 按起点/终点把路径分四组,Vivado 时序汇总按组统计,报违例先看哪组:
| 分组 | 起点 → 终点 | 约束来源 | 常见问题 |
|---|---|---|---|
| reg-to-reg | FF.CLK → FF.D | 片内时钟 create_clock/generated_clock | 逻辑层级深、高扇出、布线拥塞 |
| pin-to-reg(输入) | 输入端口 → FF.D | 需 set_input_delay 描述片外延迟 | 漏写 input delay、外部时序没查 |
| reg-to-pin(输出) | FF.CLK → 输出端口 | 需 set_output_delay 描述外部要求 | 漏写 output delay、板级未计入 |
| pin-to-pin(纯组合) | 输入端口 → 输出端口 | 无时钟,靠 set_max_delay | 纯组合穿过 FPGA,最易漏约束 |
reg-to-reg 是绝大多数,靠时钟约束即可;两组 IO 路径必须补 input/output delay,否则工具按最宽松处理(写法见 约束实战)。跨时钟域路径不属任何同步组,要用 set_clock_groups/false_path 排除。
四、Timing Summary 精读:WNS / TNS / TPWS
Vivado 实现后 Report Timing Summary 顶部的 Design Timing Summary(示意读数):
| Design Timing Summary |
| WNS(ns) TNS(ns) Failing Endpoints |
| Clock Setup (Worst) -0.342 -2.871 7 |
| WHS(ns) THS(ns) Failing Endpoints |
| Clock Hold (Worst) 0.028 0.000 0 |
| WPWS(ns) TPWS(ns) Failing Endpoints |
| Pulse Width ... ... ... || 指标 | 全称 | 含义 | 判定 |
|---|---|---|---|
| WNS | Worst Negative Slack | 最坏一条 setup 路径裕量 | ≥0 才收敛;负=有路径太慢 |
| TNS | Total Negative Slack | 所有 setup 违例 slack 总和 | 0 最好;越负面越大 |
| WHS | Worst Hold Slack | 最坏一条 hold 路径裕量 | ≥0 才收敛;负=有路径太快 |
| THS | Total Hold Slack | 所有 hold 违例 slack 总和 | 0 最好 |
| TPWS | Total Pulse Width Slack | 时钟脉冲宽度违例总和 | 时钟波形本身的问题 |
| Failing Endpoints | — | 违例终点(D 引脚)数 | 0 才干净 |
读法:
- WNS 看最坏点,TNS 看严重面。WNS −0.03/TNS −0.05(1 条差一点)和 WNS −0.03/TNS −8(几十条都差)是两个量级——前者微调可过,后者要重新权衡频率/架构。
- setup 和 hold 是两张表,都要看。新手常只盯 setup,结果 hold 一片红——FPGA 上 hold 违例同样导致上板随机错。
五、用 report_timing 拆一条违例路径
Timing Summary 只告诉你「几条、最坏多少」,定位靠 report_timing(report_timing -setup -nworst 10,或在汇总里点违例数字下钻)。一条 setup 违例报告核心:
Slack (VIOLATED) : -0.342 ns ← 负,违例 0.342ns
Source: u_alu/result_reg[17]/C (rising_edge)
Destination: u_alu/result_reg[17]/D (rising_edge)
Path Group: clk_100mhz
Data Path Delay: 9.712 ns
Logic Delay: 4.903 ns ← 穿过 6 级 LUT + 1 段进位链
Net Delay: 4.809 ns ← 高扇出控制信号布线绕远
Clock Path Skew: -0.120 ns
Clock Uncertainty: 0.250 ns定位三步:
- 看 Source/Destination 是哪两个寄存器——Vivado 会给 RTL 行号,通常是某个大 MUX、长进位链、跨模块宽比较器。
- 看 Logic Delay vs Net Delay 比例(FPGA STA 最有价值的一步):
- Logic 占大头 → 逻辑太深:RTL 加一级流水线把组合逻辑切两段,或把大 case 拆小。
- Net 占大头 → 布线问题:扇出太高(一个使能带几百负载)→ 逻辑复制(
MAX_FANOUT);或逻辑被布到芯片两端 → 加 Pblock 位置约束就近布局(见 时序收敛方法)。
- 看 Clock Uncertainty/Skew:不确定性大(PLL jitter、跨时钟)吃掉裕量,确认
create_generated_clock有没有漏。
六、FPGA 的 STA 与 ASIC 的三个关键差异
STA 的数学两边一致,但实现介质不同,落地手法差别大:
- 延迟来源不同:FPGA 布线延迟占大头。 ASIC 用连续尺寸标准单元,延迟主要在单元;FPGA 用固定 LUT/FF 和预制可编程布线,互连上的 Net Delay 常占总延迟 50% 以上。所以 FPGA 收敛里「布得近、降扇出」权重极高,这也是 Net Delay 比例要单独看的原因。
- 修法不同:没有调尺寸,靠打拍和重布。 ASIC 能给关键路径换强驱动单元(sizing)、做精细时钟树综合(CTS);FPGA 资源离散固定,工具能做的是换布局位置、换布线路径、自动插延迟修 hold,设计师最有力的武器是加流水线寄存器切短组合逻辑(retiming)。
- 时钟网络不同:全局时钟网、歪斜小。 FPGA 有专用全局时钟树(BUFG),时钟到各 FF 的歪斜被控制得很小,hold 问题相对 ASIC 少;但跨时钟域、门控时钟、用普通布线走时钟都会破坏这一优势——所以 FPGA 强约束「时钟走 BUFG、别用逻辑门控时钟」。
七、一条报告逐行读:到达时间与需求时间
真正吃透 STA,要会把一条路径的完整报告逐行翻译。报告通常分四块:第一块给结论(Slack、Source/Destination Clock、Path Group);第二块是 Source Clock Path,从主时钟定义点(晶振管脚)经缓冲/PLL 直到源寄存器时钟脚,每经过一个缓冲就有单元延迟和网络延迟两行;第三块是 Data Path,从源寄存器 Q 经若干级 LUT/进位链/网络到目的 D;第四块是 Destination Clock Path 和要求时间。建立检查时数据到达时间等于源时钟路径延迟 + Tco + 数据路径延迟;数据需求时间等于捕获沿时刻 + 目的时钟路径延迟 − 建立时间 − 不确定度。注意偏斜不是独立一行的魔术数字,它就是两条时钟路径相减的结果。
报告里常见的几个附加项:Clock Pessimism Removal(CPPR,时钟悲观去除)/ Common Path Pessimism Removal:launch 和 capture 时钟在分支前共享一段路径,建立分析时这段被算了两次且方向相反,工具把重复悲观量加回来,看到这一行不要紧张。Clock Uncertainty:包含用户 set_clock_uncertainty、jitter 模型、PLL 误差的总和。Clock Latency(Source/Network):源延迟是板级或显式声明的延迟,网络延迟是工具布线后算出来的。把一次报告对着 时序报告入门 的公式手抄一遍,胜过读十篇二手解释。
八、四类路径分组的检查义务
STA 按端点把路径分组,每组都有明确的约束责任。reg-to-reg(同时钟):create_clock 正确就自动覆盖,占路径数 90% 以上,优化主力在这里。reg-to-reg(互时钟):若时钟同源(PLL 输出、整数分频),工具按相位关系分析;若异步,必须 set_clock_groups 物理隔离,否则大量假违例会逼工具做无意义优化。input-to-reg:工具对端口外的世界一无所知,必须用 set_input_delay 描述外部器件 Tco 加板级走线相对哪个时钟、在什么时刻稳定;不写等于默认零延迟,报告的绿色毫无意义。reg-to-output:set_output_delay 描述下游器件建立要求和板级走线。input-to-output(纯组合穿片):少见但存在,如 FPGA 只做电平转换组合逻辑,要用 set_input_delay 加 create_clock 或 max_delay 明确意图。
报告里还应检查两类「隐藏路径」:到 set/reset 恢复/移除时间的检查(recovery/removal,本质是异步复位的建立保持)、门控时钟检查(clock gating setup/hold,FPGA 里出现多半是误用门控)。这些检查在 Timing Summary 的 Design Timing 小节里,新手最常整页漏掉。
九、互时钟分析:同源、异步与相移
理解工具怎么处理时钟关系,才能判断报红的真伪。同源同步:两个时钟来自同一 MMCM,周期成整数比(如 100M 与 50M),工具知道沿的时间关系,按最小公共周期分析,默认 100M→50M 有 10ns 要求、反方向 10ns 要求(采样更稀疏的方向更宽松,具体看沿对齐)。同步但相移:如 RGMII 的 90 度相移时钟,要求时间会自动加减相位,这正是 MMCM 移相能简化板级时序的原理。异步:两个独立晶振,沿关系在数学上不存在,任何具体周期要求都是伪命题——正确动作是 set_clock_groups -asynchronous 切开 STA,同时电路上保证同步器/异步 FIFO。
容易混淆的是「逻辑分频时钟」:用寄存器翻转造一个 50MHz 时钟,工具能通过 generated clock 约束认识它,但它走通用布线、偏斜大,正确做法不是补约束而是改成时钟使能(见 同步设计原则)。判断一条互时钟违例是真是假,先看 report_clock_interaction 里两时钟的关系标注(timed/ignored/unconstrained),再决定动作。
十、report_timing 的实用姿势
GUI 点选适合看单条,脚本化才能工程化。几个高频用法:report_timing -setup -max_paths 20 -nworst 5 -sort_by slack -file setup_worst.rpt 导出每组最差五条;-from [get_pins .../C] -to [get_pins .../D] 精确限定两点查一段链路;-group clk_100mhz 只看某时钟组;-delay_type max/min 分别对应 setup/hold;-path_type full_clock_expanded 展开完整时钟路径用于追偏斜;report_clock_timing -type summary 看时钟网络本身。团队协作时把违例报告连同 checkpoints 归档(配合 版本管理),评审时打开同一份 dcp 才能复现同样的数字。
读图技巧:在 Schematic 视图里把最差路径高亮,观察它是否横跨芯片;在 Device 视图看路径 flyline(飞线),物理距离一目了然;如果最差十条终点集中在同一模块,问题在结构;散布全片且 net delay 高,问题在拥塞和高扇出。
十一、setup 与 hold 的联合收敛
加一级流水线看似只改善 setup,实际会同时改变 hold 版图:被切开的长路径不再存在(setup 改善),但新寄存器到紧邻旧寄存器之间可能出现只有几十皮秒逻辑的极短路径(hold 风险);同时新寄存器的时钟偏斜若不利,也会引入问题。FPGA 布线器会自动在 hold 违例路径上插入 LUT1 延迟单元或绕线,但这是用布线资源换正确性,hold 修复多了会造成局部拥塞反噬 setup。正确节奏:①先保证时钟结构干净(全部走 BUFG、异步域切分);②大动作改结构收敛 setup;③让工具在每个阶段自动清 hold;④布线后两边同时为零才签核。绝不能「setup 绿了就上板,hold 以后再说」——hold 违例在任何频率都存在,而且会随温度电压漂移(见 仿真对上板挂)。
十二、签核意识:什么时候报告才算数
「我电脑上 Timing met」不等于可交付。签核前确认:用的是布线后(post-route)报告而非综合后估计;所有时钟都有定义,Check Timing 无 unconstrained/no-clock 项;所有 IO 有真实板级延迟,不确定时按保守值;异步域既有时钟组约束又有 CDC 结构报告清零;多角点要求(若项目规定慢角快角或电压角)都跑过;去掉 ILA/调试核后重新实现并复签(调试核改变拥塞);结果可复现——固定 directive 多跑两三次,偶发绿不算绿。进阶项目还会用独立签核工具复核关键时钟和接口。STA 的结论本质是「在约束准确描述真实系统的前提下,最坏路径满足要求」,约束是意图、报告是回执,两边都要负责——这正是 约束实战 和 时序收敛方法 两篇要继续展开的内容。最后强调一个学习 STA 的方法:不要只在报告变红时才打开它。挑一个已经收敛的工程,随便选十条绿色路径,把 Source Clock、Data Arrival、Required Time 每一行数字用公式自己验算一遍,再改变一个约束(比如把周期收紧 10%)重跑,观察哪些数字变了、哪些没变。做过几次这种「绿色路径解剖」后,报告对你就不再是一堆神秘数字,而是一张你能逐行读懂的电路时间账单——这是从「会看 Timing met 绿灯」到「真正理解时序」最直接的路径。STA 是 FPGA 工程师职业生涯里使用频率最高的分析工具之一,值得在还没有项目压力时就练到条件反射。再补一个进阶视角:随着设计进入 UltraScale 等新器件和高速接口,STA 的内容还会扩展到跨裸片(SSI)路径、收发器恢复时钟、源同步接口的延迟校准等场景,但分析的原子仍然是本文这些东西——起点、终点、时钟沿、到达时间、需求时间。把这五个概念练到看任何报告都能下意识拆解,后面所有复杂接口时序都是它们的组合与变形。工具界面会换代、器件家族会更替,STA 的数学和报告读法却是几十年稳定的硬核知识,这正是值得在进阶阶段最先打牢它的原因。最后给一个团队协作的具体建议:设计评审时要求作者不仅给出 Timing met 的截图,还要展示 WNS 的数值余量、最差三条路径的模块归属、未约束路径检查结果。绿灯只是最低门槛,0.01ns 余量和 0.8ns 余量在量产温压范围下的可靠性天差地别。把「报告数字」而不是「通过状态」作为评审语言,团队的时序意识会整体提升一个档次,现场批次性问题的概率也会显著下降——STA 报告不只是工具输出,它是设计质量的量化证书。最后用一句话收束全文:STA 不替你做设计,但它诚实地告诉你设计在最坏情况下跑得通跑不通;学会读它、信它、在约束准确的前提下尊重它的结论,是 FPGA 工程师从「能写功能」到「能签核交付」的分界线。再给一个读报告的细节建议:报告里每一级延迟都标注了元件类型(LUT、CARRY、DSP、BRAM、net),学会按元件类型统计最差路径,你会发现有些模块的瓶颈不是级数多,而是某个 BRAM 输出接了长组合链或跨层级 MUX——这种问题加流水救不了,要改数据组织。STA 报告因此不只是「过没过」的裁判,它还是微架构反馈:长期读它,你会在写 RTL 时就下意识避开那些反复出现在最差路径里的结构,这正是时序收敛最终变成「设计内建」而非「事后补救」的路径。最后给一个完整的读报告训练法:每次实现后,不管红绿,固定花五分钟做三件事——看 Timing Summary 的总览数字、打开最差一条 setup 和一条 hold 路径、记录最差路径所属模块。连续记录十个版本,你会得到一条「瓶颈迁移曲线」:修掉数据通路后,瓶颈可能转到 BRAM 输出,再转到跨模块控制,最后稳定在某条物理上最长的总线上。理解这条曲线,你就理解了真实项目时序收敛的节奏——它从来不是一次通过的检查,而是约束、结构、布局三者反复迭代的过程;STA 报告则是这个迭代过程里唯一不会说谎的导航仪。再给一个进阶建议:当你需要在时序和功能之间做权衡时(比如是否允许某个慢接口路径多周期),先在白板上画时序图证明这个放宽是功能允许的,再写 multicycle 约束,并在 testbench 里用最差相位的激励验证。时序例外本质是在向工具声明功能意图,任何无法用波形证明的例外都不应该存在。养成这个习惯后,你写的约束会成为设计文档的一部分,而不是事后让报告变绿的补丁。最后给一条面试与评审通用的检查问题:面对任何一条时序例外,连续追问三个为什么——为什么这条路径不需要满足完整周期?什么功能机制保证数据不会被提前使用?如果约束写错,最坏的现场现象是什么?三问都能答清楚,这条约束才是可信的;任何一问答不上来,就应该回到结构上重新设计。把这个习惯坚持下去,时序约束会从你和工具之间的博弈,变成设计意图的精确表达。最后做个收束:STA 的能力分三层——入门层能找到 WNS 和最差路径;进阶层能把到达时间、需求时间、偏斜和不确定度逐项拆开,判断是结构问题还是物理问题;高阶层能在写 RTL 之前就预估路径预算,让时序在设计阶段被「设计出来」。本文覆盖了前两层的全部要点,第三层则要靠大量真实项目的报告阅读和微架构迭代积累。把每一次时序收敛都当成一次有数据的实验,这份积累会成为签核工程师最核心的竞争力。最后给一个立刻可用的工作习惯:每次实现结束,除了看红绿,固定把五个数字抄进设计笔记——WNS、TNS、WHS、最差路径所属模块、未约束端点数量。连续记录几个版本后,你对自己设计的时序健康度会形成量化直觉,评审时也能拿数据说话,而不是笼统地说「时序应该没问题」。STA 的价值最终不在那张总览表,而在于它让设计质量第一次变得可以精确测量、持续追踪和团队共享。这正是静态时序分析在整个数字设计流程里不可替代的根本原因。掌握本文的方法,你就拿到了进入时序收敛领域的第一把钥匙;后续的约束实战与收敛方法,都是在这把钥匙打开的门里继续深入。
十三、把 STA 数字接回设计决策:四个实战判据
学会逐行读报告之后,真正的进阶是能从报告数字反推微架构决策,这里给四个可以直接使用的判据。第一个判据看违例路径的延迟构成:如果到达时间里逻辑级数很多、网络延迟占比正常,问题是结构上组合链太长,加流水线寄存器最有效;如果逻辑级数很少而网络延迟占了大头,问题往往是布局拥塞或跨距离连接,此时加流水无用,应该用物理约束把相关逻辑拉近、拆分大扇出的控制信号,或者把共享总线改成点对点连接。第二个判据看 WNS 的量级:几十皮秒的违例先尝试综合和实现策略调整(不同 directive、物理优化),几百皮秒到一纳秒通常要动微架构,超过一个纳秒基本说明时钟周期目标和架构不匹配,要么改架构要么重新谈频率指标。用策略选择掩盖架构问题,会在工具版本升级或设计稍微变大后反复回潮。
第三个判据看违例的分布:几百条违例集中在同一个模块,是局部结构问题,改一处解决一片;违例均匀散布在全设计、每条都只差一点点,通常是时钟约束过紧或全局布线资源紧张,要检查时钟周期是否现实、是否有低优先级逻辑跑在不该跑的高频时钟上。第四个判据看违例路径的端点类型:起点是输入端口、终点是输出端口的是纯接口路径,应该用输入输出延迟约束处理而不是加流水;起点终点都是存储器使能端的,要检查是否误把大块 RAM 的控制逻辑放在了关键路径上;跨层级绕远的路径,常是低层级模块引用了上层信号导致工具无法局部布局。养成读报告先问「延迟构成、违例量级、分布、端点类型」四个问题的习惯,时序收敛就从盲目试策略,变成了有诊断、有处方的工程活动。
最后补一条签核习惯:每次时序收敛后,把最差的五条 setup 和五条 hold 路径导出存档,连同 WNS、TNS、WHS、未约束端点数和使用的策略一起记入版本说明。连续几个版本对比这份记录,你能看到自己的结构改动是否真的在改善物理时序,而不是这一次靠工具运气变绿。时序数字是设计健康度的历史曲线,只看当前一次红绿灯的人,永远在被动救火。
常见坑对照
| 坑 | 现象 | 正确做法 |
|---|---|---|
| 只看 WNS 不看 TNS/分组 | 以为差一点,实际几十条违例 | WNS/TNS/Failing Endpoints 一起看 |
| 跨时钟域报 setup 违例 | Inter Clock 栏一片红 | 先查是否漏 set_clock_groups/false_path |
| 不看 Logic/Net 比例就改 | 逻辑太深却去加位置约束 | Logic 大打拍、Net 大降扇出/就近布局 |
| 忽视 hold 表 | setup 全绿上板仍随机错 | hold 也要为 0;hold 与频率无关,降频没用 |
| IO 路径没约束 | pin-to-reg/pin-to-pin 宽松放过 | 补 set_input_delay/output_delay |
相关与延伸
前置:XDC 约束入门、枢纽页 时序约束与收敛。 进阶:约束实战(generated clock / IO delay / clock groups 怎么写)、时序收敛方法(违例怎么一步步修)。 通用原理(ASIC 视角):STA 报告解读——slack、launch/capture、CPPR 的芯片侧讲法,可与本篇对照。
一句话总结
STA 就是不仿真、把每条「寄存器→组合逻辑→寄存器」路径的最坏时间静态算一遍:setup 查「数据能否一个周期内走完」(隔一个沿,慢了违例),hold 查「数据会不会快到同一沿就窜过去」(同一个沿,快了违例),slack=需求时间−到达时间,负即违例;报告里 WNS 看最坏 setup 点、TNS 看违例面、WHS/THS 管 hold、Failing Endpoints 数违例条数,四组路径里 reg-to-reg 靠时钟约束、两组 IO 必须补 input/output delay;定位用 report_timing 把数据路径拆成 Logic Delay(深→打拍)和 Net Delay(绕→降扇出/就近布局);FPGA 与 ASIC 原理相同但介质不同——布线延迟占大头、资源离散、时钟走专用全局网,所以 FPGA 收敛最有力的武器是打拍切短路径加让工具重新布局布线。