CDC跨时钟域处理(3)建立时间(Setup Time) 保持时间(Hold Time)

发布时间:2026/7/14 4:29:58

CDC跨时钟域处理(3)建立时间(Setup Time) 保持时间(Hold Time) 建立时间和保持时间都是器件的固有属性不能通过Designer来优化想优化这两个指标需要更换器件得加钱一、基础定义触发器固有参数1.建立时间Tsu触发器时钟有效沿上升沿到来之前D 端数据必须稳定不变的最小时间。物理意义给触发器内部主锁存器足够时间完成电平采样若窗口内数据跳变会产生亚稳态采样结果不可预测。通俗理解数据要提前就位等时钟来。2. 保持时间Th触发器时钟有效沿到来之后D 端数据必须继续稳定不变的最小时间。物理意义锁存器完成数据捕获前不能被新数据覆盖若数据提前跳变当前周期数据直接丢失。通俗理解时钟来了之后数据还要多稳住一会儿。也就是说在时钟有效沿到来的前后有一个窗口期edge - Tsuedge Th在这个窗口内被采样信号严禁变化否则会导致时序违例。二、静态时序分析中有四种常见的时序路径1. Reg2Reg寄存器到寄存器这是芯片内部的核心路径从上游寄存器的时钟端触发到下游寄存器的数据输入端被捕获。分析类型Setup建立时间和 Hold保持时间检查。约束受时钟周期、时钟偏斜、时钟不确定性等影响。核心地位这是决定芯片能否跑到目标频率的关键路径。2. Reg2Out寄存器到输出端口数据从内部寄存器出发穿过输出逻辑最终要到达外部管脚。分析类型Setup 和 Hold 检查。关键约束set_output_delay。这个命令模拟了片外下游器件的建立/保持时间要求和走线延迟。目标确保数据在外部器件采样的时钟沿前后能保持稳定。3. In2Reg输入端口到寄存器外部信号从芯片管脚进入被内部的第一级寄存器捕获。分析类型Setup 和 Hold 检查。关键约束set_input_delay。它模拟了片外上游器件的数据输出延迟和板级走线延迟。目标确保外部数据能满足内部寄存器的时序要求。4. In2Out输入端口到输出端口这是一种纯组合逻辑路径信号穿越芯片但不经过任何寄存器。三、Setup检查和hold检查1.时序分析中的常用术语 源时钟Source Clock/Launch Clock也称为发起时钟 目的时钟Destination Clock/Capture Clock也称为捕获时钟 发起沿launch edge,源时钟产生数据的有效时钟沿 捕获沿capture edge,目的时钟捕获数据的有效时钟沿T_setup建立时间T_skew时钟偏斜源时钟到达不同的触发器会有不同的延时时间相邻两个触发器间的延时T_coc就是clko就是output就是从clk edge到来到触发器Q输出所需要的时间T_data/T_comb/T_net组合逻辑需要使用的时间最容易优化的地方_Slack裕量也可以说是余量代表满足了当前建立保持时间要求之后还剩下多少时间Slack0代表可以满足时序要求。2.Setup检查1找容易出现问题的地方时序引擎会找出发起时钟和捕获时钟的最小公共周期然后在最小公共周期内找到所有发起时钟沿和捕获时钟沿的所有可能的情况并在所有可能的情况中挑选出最小的建立时间需求大于0从而确定了Launch edge和Capture edge。人话找到最可能出现setup违例的那条路最容易出问题的都满足了其他的肯定也满足了。2计算允许数据传输的最大时间人话为了成功地锁存数据它最晚必须什么时候到达Data Required Time 时钟捕获沿到达时间 - 时钟不确定性 - 建立时间时钟捕获沿到达时间 捕获时钟延时 捕获时钟一个周期人话Caputure Clock相对于Source Clock存在一个路径延时T_clk2_capture。Launch Clock相对于Source Clock也存在一个路径延时T_clk1_launch通常T_clk2_capture - T_clk1_launch T_skew。也就是在相对于Source edgeCaputure edge在T_capture T_clk2_capture这个时候才会发出dege而T_setup要求在Caputure edge之前保持数据稳定而T_uncertainty表示这个时间内时钟用不了可以理解为坏掉了无论setup还是hold都是减去T_uncertainty。因此Data Required Time (Setup) T_capture T_clk2_capture - T_setup - T_uncertainty3计算实际数据到达时间人话数据信号从发射寄存器出发历经千辛万苦最终到达捕获寄存器的数据输入端时到底用了多长时间Data Arrival Time T_launch T_clk1_launch T_co T_data基准点时钟源发射沿一切从 0ns 开始。注意建立时间分析用的是最早的那个发射沿理想时刻记为T_launch通常是 0。时钟到达发射寄存器 T_clk1_launch这是时钟源到发射寄存器时钟引脚的时钟路径延迟。时钟信号走到这里发射寄存器才被“激活”。寄存器输出响应 T_co时钟沿到达发射寄存器后它不会立刻在 Q 端送出数据存在一个固有延迟即时钟到输出延迟 (T_co)。Q 端数据在这个时刻才真正开始变化。组合逻辑和走线传播 T_data这是数据路径的核心——从发射寄存器 Q 端穿过所有组合逻辑和连线最终到达捕获寄存器 D 端的数据路径延迟。4计算setup的裕量Setup_Slack data required time - data arrival time。若setup_slack 0 也就是说信号在允许的时间范围内到达了所以满足建立时间要求。同理若setup_slack 0则信号没有在允许的时间范围内到达建立时间违例。Setup_Slack T_Capture – T_Launch T_clk2_capture – T_clk1_launch- Setup time - clk uncertainty – datapathT_Capture – T_Launch通常为一个period一般是大于0。T_clk2_capture – T_clk1_launch通常是clk_skew可能大于0也可能小于0。Setup time 和 clk uncertainty由器件本身决定不能被designer优化。datapath delay是组合逻辑的路径长度也就是说组合逻辑长度越长越可能产生建立时间违例。并且只有这个是designer可以通过代码来进行优化的。5优化Setup_Slack1. 缩小 Data Arrival Time优化组合逻辑延迟 (T_data) 这是数字前端工程师的发力点插入流水线拆分组合逻辑结构例如111拆分为1121。插入寄存器寄存器一定程度上可以理解为时序缓冲器刷新器插一个寄存器就可以理解为组合逻辑长度归0重新计算组合逻辑延迟个人理解仅供参考。减小发射时钟路径延迟 (T_clk2_launch)这貌似是数字中后端工程师的发力点。手动调整给发射寄存器换一个时钟树延迟更短的时钟端。有用偏斜在时钟树综合 (CTS) 阶段故意让这段时钟路径延迟更小把压力甩给下游。2. 增大 Data Required Time降低时钟频率增大 T_capture最简单粗暴但往往也是最后的手段容易被PM和老板FK。直接影响T_capture变大Data Required Time直接从公式上增加给数据多了一个周期的时间。代价系统性能下降。增大捕获时钟路径延迟 (T_clk2_capture)让捕获时钟沿晚一点到达等于给数据多留了时间。手动调整给捕获寄存器换一个时钟树延迟更长的时钟端。有用偏斜CTS 时故意增加这段延迟把压力转移走。注意风险极高。这条路径的建立时间满足了但很可能把下游路径的保持时间 (Hold) 搞违例或者把上一条路径的建立时间搞得更差。必须全局评估。所以最靠谱的setup_slack优化方式就是修改组合逻辑的时间。3.hold检查hold和setup逻辑完全相反。Setup是怕数据跑的太慢了capture edge到了数据还没到。hold是怕数据跑的太快了数据还没有锁存起来就跑过了。1找到最大的保持时间需求根据所有的建立时间需求找到所有的保持时间需求并从保持时间需求可正可负中找到最大的保持时间需求。人话找到最可能出现hold违例的那条路最容易出问题的都满足了其他的肯定也满足了。2计算数据的需要时间Data Required Time (Hold) T_clk2 T_clk2_capture T_hold T_uncertaintyData Required Time 下一个新的数据需要在这个时间之后到达不然会把我当前采样的数据冲掉了。基准点同一捕获沿有很多资料说setup分析的是捕获沿的事情hold分析的是发射沿的事情。与 Setup 使用“下一个”捕获沿不同Hold 分析的是和发射沿同一个时钟周期的捕获沿。理想到达时刻T_capture通常是0ns因为和发射沿同时从时钟源出发。但是个人认为捕获沿更容易分析。时钟延迟 T_clk2_capture时钟源发出的这个沿需要经过时钟网络延迟才能物理到达捕获寄存器的时钟引脚。寄存器要求 T_hold这是工艺特性。T_hold要求时钟沿到达后数据仍需稳定保持一段时间。所以这个要求会延迟新数据允许到达的时间。安全裕量 T_uncertainty和 Setup 不同这里的 Uncertainty 是加上的。因为我们要防止的是时钟或数据来得太慢导致过早的数据冲垮老数据所以让时钟来得“更晚”是更悲观的情况。新数据绝对不可以在Data Required Time这个时间点之前发生变化也就是旧的数据必须保持到这个是时间点之后。3计算数据的到达时间Data Arrival Time (Hold) Tclk1 T_clk1_launch T_co T_data和建立时间一样只是多走了一个clk。4计算hold的裕量Hold up slack Data Arrival time - Data Require timeHoldup Slack Tco Tdata -Th - T_uncertainty- T_skew所以T_uncertainty对于hold_slack和setup_slack来说都是减都会影响我们的时序收敛不是个好东西。在这里Tdata是正的也就是说组合逻辑路径延时越长对保持时间越好与setup相反所以setup和hold处于权衡的状态找到一个平衡点满足两个Slack即可。5优化hold_slack1.快路径插入缓冲器增大Tdata拉长数据到达时间后端的兄弟可以插入Buffer来一定程度上解决这个问题。2.优化时钟树减小正时钟偏斜后端的兄弟一定程度上解决这个问题。3.缩短发射端Tco选用速度更快的寄存器,更换器件得加钱​​​​​​​参考OpenFPGA【干货】八小时超长视频教你掌握FPGA时序约束大佬非常详细的讲述了时序约束相关内容十分推荐

相关新闻