尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

数字芯片时序设计实战:从建立/保持时间违例到STA签核全解析

数字芯片时序设计实战:从建立/保持时间违例到STA签核全解析 1. 从一道“简单”的时序题说起为什么我的设计跑不快最近在带新人做数字芯片设计验证发现一个挺有意思的现象。很多刚入行的朋友对RTL编码、仿真验证这些上手很快但一碰到“时序”问题尤其是静态时序分析STA相关的概念就容易犯迷糊。他们往往能写出功能正确的代码但综合出来的电路要么跑不到目标频率要么在布局布线后出现一堆时序违例最后不得不返工非常影响项目进度。我记得有一次一个同事拿着一个简单的触发器链设计来找我说综合报告显示建立时间Setup Time违例了但他觉得自己的逻辑很简单不应该有问题。他给的例子大致是这样的一个时钟驱动了三级寄存器寄存器之间就是直接连线。他的疑问很典型“这不就是三个D触发器串起来吗时钟周期给够了为什么还会违例”这个问题看似简单却触及了STA最核心的几个概念时钟定义、时序路径、以及延迟的计算。如果连这个基础场景都理不清面对更复杂的时钟域交叉、多周期路径、虚假路径时就更无从下手了。所以我觉得有必要结合一些具体的“例题”把STA里那些书本上看着枯燥、但实际工作中天天要打交道的概念用咱们工程师的大白话捋清楚。这篇文章我就打算用几个从易到难的场景拆解STA到底在看什么以及我们该怎么看。2. 基本功拆解一条时序路径的“体检报告”到底说了啥静态时序分析顾名思义就是在不跑仿真、不给激励的情况下纯粹基于网表、单元库和时序约束对电路中所有可能的时序路径进行检查看它们是否满足建立时间和保持时间的要求。它的输出就是一份“体检报告”告诉你哪条路径“不健康”违例。要读懂这份报告首先得明白它检查的“路径”是什么以及评判标准“建立/保持时间”又是怎么用的。2.1 核心概念时序路径的起点与终点一条完整的时序路径必须包含四个要素起点时序路径开始的地方。通常是时钟端口触发器的CK端或输入端口。终点时序路径结束的地方。通常是数据端口触发器的D端或输出端口。时钟控制起点和终点的时钟信号。对于寄存器到寄存器的路径起点和终点通常由同一个时钟或有时序关系的时钟控制。组合逻辑位于起点和终点之间的所有逻辑门和连线。最常见的路径是寄存器到寄存器的路径。我们就以最开始那个三级触发器链为例看看工具是怎么分析其中从第一级寄存器FF1到第二级寄存器FF2这条路径的。CLK ---| FF1 |---[组合逻辑]---| FF2 | |____| |____| D1 D2这里假设组合逻辑就是一段线网实际上可能包含缓冲器起点时钟CLK到达FF1的CK端更精确地说是CLK的跳变启动FF1的Q端变化。终点FF2的D端数据必须在CLK跳变前稳定在D端。时钟同一个CLK。组合逻辑FF1的Q端到FF2的D端之间的连线及可能的缓冲。2.2 评判标准建立时间与保持时间的“时间窗”这是时序检查的黄金法则。每个时序元件主要是触发器都有两个关键参数建立时间Tsu在时钟有效沿如上升沿到来之前数据输入端D必须保持稳定的最短时间。保持时间Th在时钟有效沿到来之后数据输入端D必须继续保持不变的最短时间。你可以把时钟沿想象成一扇正在关闭的门数据是你要送进去的快递。建立时间要求你在门关上前提前至少Tsu时间把快递递到门口并拿稳。保持时间要求你在门关上后手还要在门口保持至少Th时间确保快递不会被门夹到或弹出来。对于一条路径STA工具会进行两种检查建立时间检查确保数据从起点出发后经过路径上的所有延迟能提前足够早地到达终点满足终点的Tsu。保持时间检查确保数据从起点出发后经过路径上的所有延迟不会太快到达终点以至于“冲掉”了前一个时钟周期的数据破坏了终点的Th。2.3 延迟的构成数据来晚了怪谁路径上的延迟是导致违例的直接原因。延迟主要分两部分单元延迟Cell Delay逻辑门与门、或门、触发器等本身的延迟。这取决于单元的驱动能力、输入信号转换时间、输出负载等因素。单元库.lib文件里以查找表的形式提供了各种条件下的延迟值。线延迟Net Delay / Wire Delay信号在金属连线上传输的延迟。在综合阶段线延迟通常根据扇出和连线长度模型估算在布局布线后则根据实际的物理布线长度和RC参数精确计算。回到那个三级触发器链的例子。假设时钟周期是10nsCLK到FF1 CK端的延迟时钟延迟是1nsFF1的CK到Q延迟触发器内部延迟是0.5nsFF1 Q到FF2 D的线延迟是8nsCLK到FF2 CK端的延迟是1.2nsFF2的建立时间Tsu是0.3ns。那么数据到达FF2 D端的时间 时钟源延迟 FF1的CK-Q延迟 路径线延迟 1ns 0.5ns 8ns 9.5ns。 时钟到达FF2 CK端的时间 时钟源延迟 FF2的时钟延迟 1ns 1.2ns 2.2ns相对于时钟源。建立时间检查要求数据到达时间 ≤ 时钟到达时间 时钟周期 - Tsu。 即9.5ns ≤ 2.2ns 10ns - 0.3ns 11.9ns。这个条件是满足的有2.4ns的裕量Slack。但是如果线延迟不是8ns而是9ns呢数据到达时间就变成了10.5ns大于要求的11.9ns就会产生-1.4ns的建立时间违例。这就是为什么“看起来简单”的路径也会违例——线延迟可能远超你的想象尤其是在工艺节点较小、布线拥挤或驱动能力不足的情况下。注意在实际项目中我们经常会遇到时钟树还没构建时的“理想时钟”情况以及布局布线后的“传播时钟”情况。理想时钟下工具假设时钟瞬间到达所有寄存器延迟为0或很小此时违例可能不多。一旦进行时钟树综合CTS时钟网络被插入缓冲器时钟到各寄存器的延迟变得各不相同且不可忽略很多隐藏的时序问题就会暴露出来。所以中期和后期的时序签核至关重要。3. 实战场景一如何解决这道“简单”的建立时间违例题我们深入分析一下同事遇到的那个问题。假设目标时钟周期是2ns频率500MHz在布局布线后工具报告了从FF1到FF2的路径存在建立时间违例裕量Slack为-0.2ns。报告摘要可能类似这样Path Group: CLK Path Type: max (Setup) Endpoint: FF2/D (rising edge-triggered flip-flop) Beginpoint: FF1/CP (rising edge-triggered flip-flop) Launch Clock: CLK rising Latch Clock: CLK rising Required Time: 1.85ns Arrival Time: 2.05ns Slack: -0.20ns (VIOLATED)这份报告告诉我们数据到达比要求的时间晚了0.2ns。我们的任务是找出这0.2ns的延迟是从哪里“偷走”的并把它“抢回来”。3.1 分解延迟定位瓶颈我们需要查看详细的时序报告它会列出路径上每一个节点的延迟贡献。一个简化的分解可能如下延迟项延迟值说明时钟路径延迟 (Launch)0.6ns从时钟源到FF1/CK的延迟FF1 CK-Q 延迟0.15ns触发器内部传播延迟组合逻辑/线延迟1.3ns从FF1/Q到FF2/D的所有延迟数据到达时间总和2.05ns0.6 0.15 1.3时钟路径延迟 (Latch)0.55ns从时钟源到FF2/CK的延迟时钟周期2.0nsFF2 建立时间 (Tsu)0.1ns要求到达时间1.85ns0.55 2.0 - 0.1时序裕量 (Slack)-0.20ns1.85 - 2.05从表格可以清晰看出组合逻辑/线延迟1.3ns是最大的贡献者占总数据路径延迟的绝大部分。时钟路径延迟也有影响但两者相差不大0.6ns vs 0.55ns这不是主要矛盾。3.2 解决方案与选型理由面对建立时间违例我们有一系列从设计到物理实现的优化手段选择哪种取决于违例程度、设计阶段和面积功耗预算。方案A优化组合逻辑首选既然瓶颈在组合逻辑/连线最直接的方法是减少这部分延迟。操作检查FF1和FF2之间的网表。如果中间有复杂的逻辑尝试逻辑优化Logic Flattening、重定时Retiming或插入流水线。如果只是长连线可以插入缓冲器Buffer Insertion在长连线上插入一个或多个缓冲器将长线分段驱动减少每段线的RC延迟和末端单元的输入电容负载。这是后端工具如ICC2/Innovus的常用优化手段。增大驱动器的尺寸将FF1的输出驱动器换成一个驱动能力更强的单元使其能更快地对负载电容包括连线和FF2的输入电容充电。理由这是从根源上解决问题效果直接。优化组合逻辑还能降低动态功耗。在设计的早期RTL或综合阶段就应考虑逻辑划分避免过长的组合路径。方案B调整时钟树谨慎使用通过调整时钟路径延迟来“创造”更多时间。操作让数据发射端FF1的时钟来得稍晚一些增加Launch Clock Latency或者让数据捕获端FF2的时钟来得稍早一些减少Latch Clock Latency。这可以通过在时钟树上插入延迟单元Delay Cell或调整时钟缓冲器的大小/位置来实现。理由这相当于人为地改变了时钟相位关系。这种方法需要极其谨慎因为它会影响所有共享该时钟路径的寄存器可能解决了一条路径的违例却导致其他路径出现保持时间违例或新的建立时间违例。通常只在少数关键路径、且其他方法无效时由后端工程师在时钟树综合CTS阶段进行微调。方案C降低时钟频率最后手段操作如果设计允许将时钟周期从2ns放宽到2.2ns或更大。理由这是最简单的办法但意味着性能下降。在项目初期确定时钟目标时需要留有一定的时序裕量比如10%-20%以应对后端实现的延迟不确定性。如果签核时裕量不足可能需要重新评估性能指标。针对本例由于是简单的触发器链逻辑无法再优化所以**方案A中的“插入缓冲器”或“增大驱动器”**是最可行的。我们可以让后端工具尝试这些优化并关注是否会引起其他问题如拥塞、功耗增加。实操心得看时序报告时一定要养成先看“最差裕量路径Worst Slack Path”的习惯并重点分析其数据路径延迟和时钟路径延迟的构成。如果数据路径延迟占比过高比如超过周期的70%那优化重点就在逻辑和连线上如果时钟偏差Clock Skew即Launch和Latch时钟延迟之差很大且为负值捕获时钟比发射时钟早到很多那可能是时钟树没做好需要检查CTS策略。另外不要只盯着一条路径修工具修复一条路径可能会恶化相邻路径修复后要做增量时序分析Incremental STA确认整体效果。4. 实战场景二当保持时间违例来袭——数据来得“太快”也是错解决了建立时间问题我们经常会遇到另一个“孪生兄弟”——保持时间违例。如果说建立时间违例是担心数据“迟到”那么保持时间违例就是担心数据“早退”。它发生在同一个时钟沿检查的是当前周期发射的数据不能太快到达而覆盖了前一个周期还需要被锁存的数据。让我们构造一个场景一个时钟分频电路用触发器实现2分频。按道理Q输出每周期翻转一次似乎很安全。但在某些条件下它也可能出现保持时间违例。CLK ---| FF |---- Q (反馈回 D) |___|假设时钟周期为2ns。在时钟上升沿FF捕获D端的数据经过CK-Q延迟假设0.1nsQ端输出新值。这个新值通过一根非常短、延迟几乎为0的连线直接反馈到了D端。那么在同一个时钟上升沿之后D端的数据几乎立刻就改变了。保持时间检查关注的是前一个时钟周期n-1周期发射的数据在n周期的时钟沿之后必须在D端保持稳定至少Th时间。 在这个例子里n-1周期发射的数据即上一个Q值在n周期时钟沿后D端几乎瞬间就被n周期新产生的Q值覆盖了。如果触发器的保持时间Th大于这个“瞬间”比如Th0.05ns而数据变化在0.01ns内发生那么就会发生保持时间违例。工具会报告数据在时钟沿后保持稳定的时间不足Th。4.1 为什么会出现保持时间违例保持时间违例的根本原因是数据路径延迟太短。常见于直接反馈路径如上例Q到D的路径极短。时钟偏差Clock Skew不利如果捕获触发器的时钟比发射触发器的时钟晚到很多大的正Skew对于发射触发器来说数据在下一个周期很早就发出了但对于捕获触发器它的时钟还没到当前周期的数据需要保持更久这加剧了保持时间压力。注意时钟偏差对建立时间和保持时间的影响是相反的正Skew有利于建立时间给数据更多时间传输但不利于保持时间要求前一个数据保持更久。工艺角Corner变化在芯片制造中晶体管速度会因工艺、电压、温度PVT变化而不同。我们通常在“最坏情况Worst Case慢速”下检查建立时间因为延迟大容易迟到在“最好情况Best Case快速”下检查保持时间因为延迟小数据到得快容易早退。在Best Case下单元和连线延迟最小数据跑得飞快最容易引发保持时间违例。4.2 修复保持时间违例的“刹车”艺术修复保持时间违例的思路与建立时间相反我们需要给数据路径“增加延迟”让数据慢点到达。方案A插入延迟单元Delay Cell / Buffer操作在数据路径上插入一个或多个专用的延迟单元本质上是几个串联的反相器或缓冲器。这些单元几乎没有逻辑功能主要作用就是引入固定的传播延迟。理由这是最直接、最常用的方法。后端工具在修复保持时间违例时会自动在数据路径上插入这些“刹车片”。需要注意的是插入的延迟单元会增加面积和功耗也可能对建立时间产生微小影响因为路径总延迟增加了但通常影响很小。方案B调整时钟树利用时钟偏差操作与修复建立时间相反我们可以尝试减小捕获路径的时钟延迟或增加发射路径的时钟延迟从而减小正Skew或制造负Skew让捕获时钟相对更早到来缩短数据需要保持的时间窗口。理由这同样需要全局考量因为调整时钟树是牵一发而动全身的。通常由时钟树综合工具在优化时钟偏差时一并考虑。方案C更换速度更慢的单元操作将路径上的某个逻辑门或触发器替换为驱动能力更弱、延迟更大的同类单元。理由增加单元延迟。但这可能不是最优选择因为它会影响该单元驱动其他路径的性能且可选单元有限。对于分频器例子标准的做法就是在反馈路径Q到D上插入一个小的缓冲器链人为增加一点延迟确保在时钟沿后D端的数据能稳定足够长的时间以满足Th。注意事项保持时间违例是必须修复的否则电路功能在硅片上会直接出错。而建立时间违例可能只意味着电路最高工作频率达不到预期在低频下或许还能工作。修复保持时间违例所增加的延迟通常不会恶化建立时间因为在最坏工艺角下这些插入的延迟单元本身的延迟也会变大。修复工作一般在布局布线后进行签核Sign-offSTA时重点处理。工具通常提供“修复保持时间违例”的选项可以自动插入延迟单元。5. 进阶挑战多周期路径与虚假路径——告诉工具“别瞎算”在实际设计中并非所有路径都需要在一个时钟周期内完成。有些逻辑运算本来就需要多个时钟周期比如一个复杂的乘法器。如果我们不告诉STA工具这个特殊情况工具会傻傻地按单周期去检查结果肯定是疯狂的建立时间违例。这时就需要用到**多周期路径Multicycle Path, MCP**约束。5.1 多周期路径MCP约束详解假设我们有一个32位乘法器其流水线设计使得结果在3个时钟周期后才有效。从乘法器输入寄存器FF_A到结果输出寄存器FF_B的路径就是一个典型的多周期路径。如果不加约束工具认为数据从FF_A发出后必须在下一个CLK上升沿前到达FF_B的D端。这显然不可能会导致巨大的违例。我们需要使用SDCSynopsys Design Constraints命令来告诉工具set_multicycle_path 3 -setup -from [get_pins FF_A/CP] -to [get_pins FF_B/D] set_multicycle_path 2 -hold -from [get_pins FF_A/CP] -to [get_pins FF_B/D]-setup 3告诉工具建立时间检查的周期数放宽到3。即数据从FF_A发出后可以在第3个时钟沿而不是第1个之前到达FF_B。这样允许的路径延迟时间就变成了3 * Tclk - Tsu。-hold 2这是与多周期建立时间约束配套的保持时间约束。它的含义是保持时间检查的参考点要向前移动n-1个周期。对于3周期建立时间路径默认的保持时间检查会非常严格检查数据是否在第一个时钟沿后就改变了。设置-hold 2意味着保持时间检查参考的是发射沿前第2个周期的沿这更符合多周期路径的实际行为确保在FF_B捕获数据时来自FF_A的正确数据即3个周期前发射的那个已经稳定而不会被中间周期发射的错误数据干扰。理解关键多周期路径约束的本质是重新定义发射沿和捕获沿的关系。默认是发射沿为n捕获沿为n1。-setup N把捕获沿改为 nN。-hold N把保持时间检查的发射沿改为 n-N。5.2 虚假路径False Path约束彻底“无视”某些路径比多周期路径更“彻底”的是虚假路径。它指的是那些在电路实际正常工作模式下信号永远不会传播的路径或者其时序要求不需要检查的路径。常见的例子包括测试逻辑路径扫描链Scan Chain上的路径只在测试模式下使用功能模式下无效。跨时钟域路径两个完全异步的时钟域之间的数据路径。它们的时序无法用同步时钟的周期来衡量需要通过同步器如两级触发器来处理其同步器之前的路径应设为虚假路径。上电复位路径只在上电或复位时生效的路径。故意忽略的路径某些具有特殊设计保证的路径。设置虚假路径的命令很简单set_false_path -from [get_clocks CLK_A] -to [get_clocks CLK_B]这条命令告诉STA工具所有从CLK_A时钟域出发到CLK_B时钟域结束的路径都不需要进行时序分析。使用虚假路径的陷阱必须绝对确信这条路径在功能上确实无需时序检查。如果误设了虚假路径可能导致真正的时序问题被掩盖造成芯片流片后失效。例如如果两个时钟域实际上是相关的比如同源但分频它们之间的路径就需要用set_clock_groups或set_max_delay来约束而不是简单地设为虚假路径。经验之谈约束SDC是STA的灵魂也是最容易出错的地方。多周期路径和虚假路径的约束尤其需要谨慎。我的建议是充分理解设计意图和架构师、设计工程师确认哪些路径是多周期的周期数是多少。约束文档化为每一条非常规约束MCP, False Path添加注释说明原因。交叉验证约束写完后用STA工具报告检查被约束的路径是否按预期被排除或放宽了检查。同时也要检查是否无意中约束了不该约束的路径。同步器路径处理对于异步时钟域交叉CDC路径标准的做法是将同步器第一级触发器的D端路径设为虚假路径因为亚稳态无法用时序保证而同步器内部两级触发器之间及其后的路径仍需进行严格的时序检查以确保同步器本身的可靠性。6. 从理论到签核一个完整STA流程的踩坑实录理解了概念和单一场景的解决方法我们还需要把它们串起来放到一个真实的项目流程中去看。这里我分享一次从综合后到布局布线后时序签核的经历其中遇到的坑很有代表性。项目背景一个中等规模的数字处理模块目标频率300MHz周期3.33ns采用28nm工艺。综合后使用理想时钟的时序报告看起来很美建立时间裕量有0.8ns。但进入布局布线阶段后问题开始涌现。第一坑理想时钟 vs. 传播时钟综合阶段我们通常使用set_ideal_network或set_clock_latency设定一个理想的时钟延迟比如0.1ns。这时时钟树不存在时钟偏差Skew也为0或很小。时序报告乐观。 布局布线后工具进行了时钟树综合CTS生成了真实的时钟网络。这时时钟到各个寄存器的延迟各不相同可能从0.3ns到0.8ns不等时钟偏差也出现了。我们使用set_propagated_clock将时钟设置为传播模式工具根据实际布线计算时钟延迟。问题切换后原先裕量0.8ns的路径因为捕获时钟延迟增加比如从0.1ns变成0.7ns导致要求时间提前裕量可能直接变成-0.2ns。许多路径的建立时间违例暴露出来。教训综合阶段不能过于乐观。可以在SDC中给时钟网络设置一个合理的估计延迟和偏差例如set_clock_latency 0.5 [get_clocks CLK];set_clock_uncertainty 0.2 [get_clocks CLK]让综合工具在优化逻辑时就把这部分“预算”考虑进去这样综合出的网表更接近后端实际情况。第二坑互连延迟模型的偏差综合阶段线延迟是根据扇出和单元位置估算的Wire Load Model。这个模型在模块较小、布局规整时还算准确但当模块变大或布局稀疏/拥挤时估算误差很大。 布局布线后工具根据实际的金属层、布线长度、宽度、间距计算精确的RC参数从而得到更真实的线延迟。问题一条在综合阶段报告延迟为0.5ns的net在布局布线后实际延迟可能达到1.2ns直接导致建立时间违例。教训对于高性能设计不能依赖粗糙的线负载模型。应该在综合后尽快进行物理综合或带有布局信息的综合让工具基于初步的布局位置来估算线延迟准确性会高很多。第三坑修复保持时间违例引发的连锁反应布局布线后工具自动修复了大量保持时间违例主要方法是在数据路径上插入延迟单元Buffer。问题这些插入的Buffer增加了数据路径的延迟虽然解决了保持时间问题但轻微恶化了某些边际路径的建立时间。同时新增的Buffer占用了额外的布线资源可能加剧局部拥塞Congestion而拥塞又会导致绕线变长线延迟进一步增加形成恶性循环。教训修复时序违例要有全局观。修复一条路径后必须做增量时序分析看是否影响了其他路径。关注拥塞报告。高拥塞区域是时序的“重灾区”。可能需要通过调整布局、优化模块形状、增加布线通道等手段来缓解拥塞。保持时间修复可以分步进行。先修复最严重的违例然后重新评估建立时间和拥塞再决定下一步修复策略。第四坑不同工艺角Corner下的时序闭合我们通常在WCWorst-Case工艺角慢速晶体管高电压低温不对通常是高温下检查建立时间在BCBest-Case工艺角快速晶体管低电压低温下检查保持时间。但芯片需要同时在多种条件下工作。问题在WC Corner下修复了建立时间违例的优化比如增大驱动器、插入Buffer在BC Corner下可能会因为延迟变小而不足以修复保持时间违例甚至可能因为插入的Buffer导致新的保持时间问题。反之亦然。教训必须进行多角多模MCMM分析。工具需要同时加载多个工艺角、电压、温度PVT条件下的单元库和RC参数文件并在一次运行中检查所有场景下的时序。最终的签核Sign-off必须保证在所有指定的工艺角下建立时间和保持时间都满足要求裕量为正。这常常需要在不同Corner之间进行折衷优化。最终签核经过几轮迭代优化——包括调整布局、优化时钟树、手动指导关键路径布线、微调约束——我们最终在WCSS, 0.9V, 125C和BCFF, 1.1V, -40C两个关键工艺角下都实现了正的建立时间和保持时间裕量0.05ns完成了时序闭合。这个过程让我深刻体会到STA不是一个孤立的分析步骤而是贯穿整个物理实现流程的、与逻辑设计、布局、布线、功耗分析紧密互动的活动。每一个决策都可能产生连锁反应。作为设计者或验证者我们不仅要会看报告更要理解数据背后的物理意义以及工具优化策略的局限性这样才能在出现问题时做出最有效的干预。
返回列表