尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深入解析D触发器的建立与保持时间:数字电路时序设计核心原理

深入解析D触发器的建立与保持时间:数字电路时序设计核心原理 1. 从一次“诡异”的时序故障说起几年前我在调试一块自己设计的FPGA板卡时遇到了一个至今记忆犹新的问题。板子上有一个状态机负责控制几个外设的交互逻辑。在实验室里用示波器和逻辑分析仪抓取信号一切看起来都完美无缺时序波形干净利落逻辑功能完全符合预期。然而当我把这块板子拿到一个温度稍高的环境或者仅仅是把核心电压稍微调低一点点整个系统就开始出现间歇性的、完全随机的错误。状态机偶尔会跳转到错误的状态读取的数据时不时出现几个比特的翻转。最让人头疼的是这个错误无法稳定复现它就像幽灵一样时隐时现。当时的我像大多数初学者一样第一反应是去检查代码逻辑、电源完整性、信号完整性。折腾了几天排除了所有明显的硬件问题后我的一位资深同事看了一眼我的设计问了一句“你的时钟约束加了吗建立时间和保持时间违例查过没有” 我这才恍然大悟原来问题的根源不在“功能”是否正确而在于“时序”是否满足。那个幽灵般的错误正是数字电路世界里最基础的两位“门神”——建立时间Setup Time和保持时间Hold Time——在向我发出警告。它们不是D触发器独有的但D触发器作为时序逻辑电路最核心、最基础的存储单元是理解这两个概念最直观的载体。今天我们就来彻底拆解一下为什么D触发器乃至所有同步时序电路都必须严格遵守这两个看似苛刻的时间要求。简单来说你可以把D触发器想象成一个在时钟命令下工作的、极其严格的“数据采样员”。建立时间Tsu是要求数据在时钟命令通常是上升沿到来之前必须提前多久在门口准备好并保持稳定保持时间Th是要求数据在时钟命令发出之后还必须继续在门口保持稳定多久不能立刻离开。如果数据早退或者晚到这位采样员就可能采错样导致系统功能出错。这不是设计者的故意刁难而是由触发器内部晶体管级的物理结构和工作原理决定的是数字电路从模拟物理世界走向抽象逻辑世界必须跨越的一道鸿沟。2. 深入D触发器内部物理世界的延迟游戏要理解为什么需要建立和保持时间我们必须暂时放下理想的逻辑门模型深入到D触发器的晶体管级实现通常基于CMOS工艺去看一看。一个典型的边沿触发D触发器其核心通常由两个电平敏感的D锁存器D Latch主从级联构成这就是所谓的“主从D触发器”。每一个锁存器内部又是由传输门Transmission Gate和反相器Inverter构成的反锁存结构。2.1 主从结构的内部时钟舞蹈我们以正边沿触发D触发器为例。当时钟CLK为低电平时“主”锁存器打开像一扇门一样允许输入数据D进入并被暂存而“从”锁存器关闭保持它之前存储的值输出到Q。当时钟CLK从低电平跳变到高电平上升沿的瞬间一系列复杂的物理事件依次发生主锁存器关门CLK变高首先导致主锁存器的传输门关闭切断D端输入通路。但请注意电信号的跳变不是瞬间完成的它有一个上升时间。在CLK电压达到反相器翻转阈值之前主锁存器可能处于一个“半开半闭”的不确定状态。从锁存器开门几乎同时实际上有极短的延迟CLK变高使得从锁存器的传输门打开。此时主锁存器里刚刚锁住的那个数据值需要通过从锁存器的传输门再经过一两个反相器最终传递到输出Q端。这个传递过程每一步都伴随着延迟晶体管开关的延迟、信号通过导线寄生RC的延迟、电容充电放电的延迟。这些延迟的总和决定了从时钟沿到来到输出Q稳定反映出新数据所需的时间这就是触发器的时钟到输出延迟Tco或Clk-to-Q Delay。2.2 建立时间给数据一个“刹车距离”现在我们聚焦于“主锁存器关门”这个动作。假设在时钟上升沿到来的t0时刻我们期望主锁存器能完美地锁住t0时刻D端的数据。但由于物理延迟的存在这是不可能的。内部路径延迟数据D从输入引脚进入需要经过输入缓冲器、可能的多路选择器最终到达主锁存器的数据输入端比如一个传输门的源极。这条路径有延迟。锁存器关闭延迟时钟信号CLK到达主锁存器的传输门控制端驱动传输门内的MOS管从导通变为截止这个过程也需要时间。在传输门完全关闭之前如果D端数据还在变化那么这个变化就有可能“溜进”正在关闭的主锁存器污染本应被锁存的值。因此为了保证在时钟沿t0时刻主锁存器最终锁存到的是我们想要的、正确的数据就必须要求数据D在时钟沿到来之前的一个时间窗口内提前保持稳定。这个时间窗口就是建立时间Tsu。它本质上是给内部数据路径和时钟控制路径的延迟留出余量确保当时钟命令“关门”的指令最终生效时正确的数据已经“坐稳”在锁存器里了。你可以把它类比成赛车进站维修区通道数据路径长度固定你必须提前刹车数据稳定才能在维修区入口时钟沿关闭时让赛车数据准确停在维修区内锁存器。注意Tsu是触发器本身的一个固有属性由芯片制造工艺、内部晶体管尺寸和电路结构决定。设计者无法改变只能在系统设计时予以满足。2.3 保持时间防止新旧数据“打架”理解了建立时间保持时间就相对好理解了。时钟沿过后主锁存器门关上了数据不是应该立刻安全了吗为什么还需要保持关键在于时钟信号的跳变和数据的传输都存在偏差Skew和抖动Jitter。我们设想一个最坏的情况由于布线长度不同到达触发器CLK端的时钟边沿和到达触发器D端的数据变化在时间上存在微小的差异。假设D端的新数据对应下一个时钟周期要锁存的值来得太早。在时钟上升沿刚刚过去主锁存器的传输门还没有完全、彻底地关死由于时钟路径延迟和晶体管关断延迟的那个极短的时间内如果新数据已经冲到了D端它就有可能“挤开”还没关严的门缝冲进主锁存器覆盖掉刚刚锁存的、本属于上一个时钟周期的旧数据。这就会导致锁存了错误的数据即“新数据过早到达破坏了旧数据”。为了防止这种情况就需要保持时间Th。它要求数据D在时钟沿到来之后还必须继续保持稳定一段时间。这段时间是为了确保主锁存器的门已经百分之百地、可靠地关闭新数据再怎么“心急”也进不来了从而保证了上一个时钟周期数据的完整性。继续用赛车进站的比喻保持时间就是要求赛车在维修区入口关闭后还不能立刻猛踩油门冲出去必须再等待一下确保入口的门闩已经完全落下锁死避免与后续来车发生碰撞。实操心得在高速数字电路设计中保持时间违例Hold Violation有时比建立时间违例Setup Violation更棘手。建立时间违例可以通过降低时钟频率来缓解属于“性能”问题而保持时间违例是即使时钟停着不动也可能发生的属于“功能正确性”问题必须通过优化布局布线、插入缓冲器Buffer来增加数据路径延迟等方式来解决。3. 从触发器到系统时序收敛的核心逻辑单个触发器的Tsu和Th要求是数字电路时序分析的基石。当我们把成千上万个触发器用组合逻辑电路连接起来构成一个庞大的同步系统如CPU、FPGA逻辑时这两个参数就衍生出了整个“时序收敛”的设计哲学。3.1 建立时间与最长路径考虑一个最简单的场景两个寄存器Reg1和Reg2之间有一段组合逻辑。Reg1在Clk上升沿输出数据Q1数据经过组合逻辑产生延迟Tcomb后到达Reg2的D2输入端。Reg2在下一个Clk上升沿采样D2。为了让Reg2能正确采样D2必须在Reg2的时钟沿到来之前满足其建立时间Tsu。这就导出了著名的建立时间约束不等式Tclk Tco(Reg1) Tcomb Tsu(Reg2) Tskew其中Tclk时钟周期。TcoReg1的时钟到输出延迟。Tcomb组合逻辑延迟包括线延迟。TsuReg2的建立时间。Tskew时钟偏移Reg2的时钟沿可能比Reg1的晚到取正值时为最坏情况。这个不等式的含义是从Reg1发出数据到Reg2采样数据这条路径上的总延迟必须小于一个时钟周期减去建立时间余量。它定义了电路能正常工作的最高时钟频率。Tcomb越大能跑的频率就越低。这就是为什么我们要优化关键路径组合逻辑延迟最长的路径的逻辑级数或者采用流水线Pipeline插入中间寄存器来切割长路径。3.2 保持时间与最短路径同样对于Reg1和Reg2保持时间约束关注的是同一个时钟沿。Reg1在Clk上升沿输出新数据Q1_new这个新数据经过组合逻辑传播到Reg2的D2端。但是Reg2在同一个Clk上升沿采样的是D2的旧值由Reg1上一个时钟周期的输出Q1_old决定。为了防止Q1_new过快地传播到D2在Reg2的保持时间窗口内破坏了本应被采样的Q1_old值就需要满足保持时间约束不等式Tco(Reg1) Tcomb(min) Th(Reg2) Tskew其中Tcomb(min)组合逻辑的最小延迟最快路径。ThReg2的保持时间。Tskew时钟偏移这里如果Reg2的时钟早于Reg1会使问题恶化。这个不等式的含义是数据从Reg1发出后其最早到达Reg2D端的时间必须晚于Reg2的保持时间要求。它定义了一条路径的最小延迟下限。如果组合逻辑太短比如两个寄存器直接背靠背连接就可能违反保持时间。解决方法是插入延迟单元Buffer来增加最小路径延迟。3.3 静态时序分析机器的严格审查在现代EDA电子设计自动化工具中静态时序分析STA工具就是基于上述原理对设计中的所有时序路径进行穷举检查。它会考虑各种工艺角Process Corner、电压、温度PVT下的延迟变化找出所有可能违反建立时间和保持时间的路径。建立时间检查Setup Check在最大延迟慢速工艺、低电压、高温条件下进行检查最长路径。保持时间检查Hold Check在最小延迟快速工艺、高电压、低温条件下进行检查最短路径。只有同时通过了这两种检查设计才被认为是“时序收敛”的才能保证在指定的工作条件下功能正确。我文章开头提到的那个幽灵般的错误正是在高温导致延迟变化和电压波动下某些路径的时序余量不足从“勉强满足”变成了“轻微违反”从而引发了随机故障。4. 超越基础高级场景与设计考量理解了基本原理我们再看一些更深入或相关的场景这能帮助我们在实际设计中更好地驾驭时序。4.1 时钟偏移与时钟抖动的影响前面公式中多次出现的Tskew时钟偏移和未明确写出的Tjitter时钟抖动是时序分析中的关键变量。时钟偏移指时钟信号到达不同触发器时钟端的时间差异。主要由时钟树布线长度不一致引起。好的时钟树综合CTS目标是使偏移最小化。偏移会同时影响建立和保持时间余量具体是恶化还是改善取决于偏移的方向。时钟抖动指时钟边沿实际到达时间相对于理想时间的随机偏差。它主要影响建立时间因为抖动相当于缩短了有效的时钟周期。对于高速设计需要一个低抖动的时钟源和良好的电源滤波。注意事项在FPGA设计中工具会自动构建时钟树来最小化偏移。但在板级设计时连接到FPGA或ASIC的外部时钟信号其布线必须作为传输线处理保证阻抗匹配以减少反射和抖动否则会严重侵蚀系统时序余量。4.2 异步信号与亚稳态如果数据D的变化与时钟CLK的边沿严格同步那么满足Tsu和Th就能保证采样正确。但现实中存在大量异步信号比如来自另一个时钟域的信号、复位信号、按键输入等。这些信号的变化与本地时钟边沿的关系是完全随机的。当异步信号在非常接近时钟边沿的时间点发生变化使得D端电压处于逻辑“0”和“1”之间的不稳定状态即不满足建立或保持时间时触发器就会进入一种可怕的亚稳态Metastability状态。其输出Q会在一个较长时间内远大于Tco处于中间电平或者产生不可预测的振荡最终随机稳定到“0”或“1”。更糟糕的是这个亚稳态可能像瘟疫一样在后级电路中传播导致系统级故障。解决亚稳态的标准方法是使用同步器Synchronizer最常见的是两级D触发器串联。第一级触发器同步级负责“承受”亚稳态第二级触发器在第一个触发器输出稳定或大概率稳定后再采样从而将亚稳态发生的概率降低到系统可接受的水平。当然这引入了至少一个时钟周期的同步延迟。4.3 不同触发器与接口的时序参数Tsu和Th的概念无处不在复杂触发器带异步置位/复位Set/Reset的触发器这些异步信号也有自己的恢复时间Recovery Time和移除时间Removal Time要求其原理与建立/保持时间类似。存储器接口如SRAM、SDRAM、DDR。芯片的数据手册里会明确给出相对于时钟的Tds数据建立时间和Tdh数据保持时间控制器必须满足这些要求才能正确读写。高速串行接口如SPI, I2C, UART虽然速率较低但同样有时序要求。I2C协议规范中就定义了t_{SU;DAT}数据建立时间和t_{HD;DAT}数据保持时间。更高速的接口如GMII、SGMII、DDRx内存接口其时序要求更为严苛需要精确的PCB布线长度匹配和严格的时序分析。5. 设计实践如何满足与验证时序要求理论最终要服务于实践。作为设计者我们如何确保自己的电路满足这些时序要求呢5.1 前端设计代码风格与结构良好的硬件描述语言HDL代码风格是好的时序的基础。同步设计尽量使用单一的全局时钟对所有寄存器进行同步操作。避免使用门控时钟Clock Gating除非必要且经过仔细分析。关键路径优化对于复杂的组合逻辑如大位宽加法器、乘法器、复杂译码器考虑进行流水线划分插入中间寄存器将长路径切短。注意扇出一个信号驱动过多的负载高扇出会导致延迟增大和转换时间变慢工具可能难以优化。可以通过复制寄存器Register Duplication来降低扇出。异步处理对跨时钟域信号必须使用同步器。复位信号如果异步释放也需要同步处理。5.2 后端实现与约束在ASIC或FPGA的实现阶段时序约束是指导工具的“法律文件”。创建时钟使用create_clock命令正确定义时钟的周期、占空比和源头。输入/输出延迟使用set_input_delay和set_output_delay来约束端口信号与外部器件的时序关系。时序例外对于异步路径、多周期路径使用set_false_path、set_multicycle_path等命令进行正确约束避免工具在不必要的路径上过度优化。布局布线对于保持时间违例工具通常会自动插入缓冲器。对于建立时间违例工具会尝试优化布局让逻辑更靠近和使用更快的布线资源。5.3 验证与调试手段静态时序分析报告这是最核心的验证手段。必须仔细阅读建立时间和保持时间的违例报告Violation Report分析违例路径判断是约束不当、逻辑结构问题还是布局布线问题。门级仿真在布局布线后提取包含实际延迟信息的SDF文件进行反标仿真可以动态地验证时序尤其有助于发现异步路径和复杂交互中的问题。片上调试对于FPGA可以利用内置的逻辑分析仪如Xilinx的ILA Intel的SignalTap抓取实际运行时的信号观察是否有毛刺、信号是否在期望的时钟沿稳定。我最初调试那个幽灵故障时最终就是通过ILA抓取到在特定条件下某个关键信号在时钟沿附近存在微小的抖动从而定位到时序问题。示波器/逻辑分析仪测量对于板级信号特别是时钟、高速接口信号测量其实际波形、建立保持时间余量、抖动等参数是最终验证的“金标准”。回顾我那个板卡故障根本原因是在布局布线后没有进行严谨的时序约束和STA分析工具在优化面积和功耗时无意中使某些路径的延迟处于临界状态。在环境变化温度、电压导致器件特性漂移时这些临界路径就发生了时序违例。加上故障是随机的所以表现为间歇性错误。在添加了正确的时序约束并让工具重新进行时序驱动的布局布线后问题彻底消失。所以为什么D触发器需要建立时间和保持时间因为它们是连接理想的数字抽象与模拟的物理现实之间的桥梁规则。遵守它们你的电路才能在硅晶的海洋里稳定航行忽视它们你的设计就可能在现实的波涛中无声倾覆。这不是一个可选项而是数字电路设计者必须刻在骨子里的第一定律。
返回列表