集成电路设计

建立时间与保持时间(setup & hold time)

想象你在旋转的旋转木马上递一张纸条给朋友——你得在他们转过来之前就把纸条稳稳地举好,转过去之后还得再举一会儿,否则交接就会失手。触发器在时钟边沿上抓取数据,道理完全一样。它的数据输入在时钟跳变的那一刻不能正在变化;它需要一个安静的窗口,让数值在边沿之前稳定保持一小段时间(建立时间),并在边沿之后再稳定保持一小段时间(保持时间)。

更精确地说,建立时间是数据必须在有效时钟边沿到来之前就已稳定下来的最短时长,保持时间则是边沿过去之后数据必须维持不动的最短时长。两者合起来,在边沿周围圈出一小块禁飞区,在这段时间里输入不得变动。这些数值非常小——在现代工艺中往往只有几十皮秒,保持时间甚至可能略为负值——它们源自负责捕获并锁存数值的采样单元的内部延迟。

一旦越过任一边界,触发器可能锁存到错误的逻辑电平,更糟的是,会半途卡在 0 与 1 之间,进入亚稳态——一种不稳定的平衡,要花上不可预测的时间才会朝某一侧倒下,这可能把坏数据一路传播到下游。让每一条路径都落在这两个边界之内,正是静态时序分析所检查的内容。建立检查是最大延迟测试:数据必须足够早地到达,因此它给时钟频率定下了上限。保持检查是最小延迟测试:数据不能到得太早,以致赛跑般窜过去、被它所发出的那同一个边沿误捕获——而关键在于,它根本不取决于时钟周期。两项检查各自剩下的回旋余地就是时序余量(slack)。

always @(posedge clk)
  q <= d;   // d must be stable around this edge in silicon

在 HDL 模型里,这项要求是隐含的——你只是描述了寄存器,时序则由工具事后去保证。RTL 对皮秒只字未提;建立与保持是物理约束,由 STA 在综合后的网表上校验,而不是这行代码的仿真所能看到的东西。

建立违例通常可以靠放慢时钟来解决,保持违例却不行——保持失败是单个时钟周期之内的一场赛跑,与频率无关,所以放慢时钟毫无帮助。补救之道是给跑得太快的数据路径添加延迟(通常是插入缓冲器)。正是这种不对称,让保持违例成为两者中更令人头疼的一个:你没法只靠把时钟调慢就逃脱它。

又称
setup/holdsetup time and hold timedata-valid windowtiming window建立时间与保持时间建立時間與保持時間