转载[连载]PCIE 关键技术一elastic buffer前言在高速数据传输协议中PCI Express PCIe作为一种广泛使用的接口标准其高效的数据传输能力依赖于复杂的时钟管理和缓冲技术其中弹性缓冲区elastic buffer是PCIe系统中不可或缺的一部分它在解决时钟域差异和数据传输同步问题上发挥着关键的作用。什么是弹性缓冲区弹性缓冲区是一种用于处理不同时钟域之间频率和相位差异的先进先出FIFO缓冲器它位于接收端RX的本地时钟域与恢复时钟域之间通过插入/删除特定的符号如SKPskip order set来调整数据流的传输频率从而实现时钟同步。弹性缓冲区的工作原理弹性缓冲区的核心功能是通过动态调整缓冲区的数据量来补偿时钟频率和相位的差异具体来说当本地时钟域的频率低于恢复时钟域时弹性缓冲区会检测到数据进入速度过快并从缓冲区中删除一些SKP符号以减缓数据流反之当本地时钟的频率高于恢复时钟的时候缓冲区会插入SKP符号以增加数据流的速度。弹性缓冲区的设计电路如图所示弹性缓冲器包含7个单元并且具有两个时钟域a本地时钟域buffer的输出时钟用于为其所有内部门电路提供时钟信号并传输数据b恢复时钟域buffer的输入时钟用于锁存输入数据。input detect unit 检测输入数据是否为SKP并根据测试结果提供SKP删除操作的指令write pointer control unit 写指针的二进制和格雷码由写指针控制单元生成写指针的二进制码用于选择数据写入的存储地址并在与读指针同步后生成SKP删除操作的指令同样写指针的格雷码同步到本地时钟域并与读指针的格雷码进行比较然后单元生成空标志。read pointer control unit读指针控制的作用是生成读指针的二进制码和gray code读指针的二进制码是数据读取的存储单元的地址并在与同步的写指针比较后生成SKP添加的请求标志读指针的gray code同步到恢复时钟域并与写指针的gray code进行比较然后生成满标志。out detect control unit输出检测和控制单元确定从存储单元读取的数据是SKP字符还是END字符然后生成相应的符号此外它还根据检测结果输出数据。synchronous unit同步单元的功能是将写指针和读指针的gray code同步到本地时钟域和恢复时钟域。threshold monitor阈值监控单元计算FIFO中的有效数据并决定是否产生SKP添加或删除请求。弹性缓冲区的深度计算弹性缓冲区的深度cover最worse case由maxpayload size和读写时钟最大偏差决定。SRNS最大的时钟偏差是600ppm即1666个cycle有一个时钟周期漂移SRIS最大的时钟偏差是5600ppm即178个cycle有一个时钟周期漂移。【ppm 600 → 每 1,000,000 个周期漂移 600 个周期设 N 为漂移 1 个周期所需的周期数比例关系 600/1,000,0001/N解得 N1,000,000/600 ≈ 1666.67】需要考虑发送SKP的最大间隔1180-1538 symbol time【协议定死的】和lane的数量Link_width因此worst-case 的周期漂移个数计算如下【最小值1180 Symbol Times目的防止弹性缓冲溢出或下溢。解释在两个时钟偏差最大的 SRNS 系统中如果发送端太久不发送 SKP接收端的弹性缓冲因为时钟频率不一致累积的误差就会超过缓冲深度导致数据丢失或读取错误。协议计算得出在最坏频偏下最多只能容忍约 1180 个 Symbol 的时间不发送 SKP。因此发送端必须至少每 1180 个 Symbol 发送一次 SKP或者说不能比这个间隔更久。最大值1538 Symbol Times目的限制 SKP 的频率保证带宽效率并给接收端留出处理时间。解释SKP 是开销发得太频繁会浪费带宽。同时接收端的弹性缓冲逻辑需要一个稳定的节奏来调整。协议规定发送端最多可以间隔 1538 个 Symbol 发送一次 SKP。】max_payload_size4K overhead 28byte对于SRNS max_symbol shifted 4对于SRISmax_symbols shifted 40Snps 的32G phy elastic buffer 深度为88大多数弹性缓冲区采用“半满方法” half-full method进行设计这种方法通过保持缓冲器在半满状态来优化数据传输效率。