JESD204B确定性延迟——为什么你的延迟每次复位都不一样

📅 2026/7/2 7:02:24
JESD204B确定性延迟——为什么你的延迟每次复位都不一样
你终于把JESD204B链路调通了。CGS通过ILAS通过DATA稳定。松了口气开始测多通道同步。结果发现每次复位后通道间的延迟都不一样。有时候差1拍有时候差3拍毫无规律。你加了ILA抓了100次复位发现延迟在0到K×F个octet之间随机跳动。某相控阵雷达项目就因为这个坑8通道ADC每次上电后波束指向都偏了1度查了两周才发现是JESD204B的延迟问题。这不是bug。这是JESD204B的确定性延迟机制没搞对。什么是确定性延迟JESD204B的确定性延迟Deterministic Latency指的是从发送端采样数据到接收端数据可用之间的延迟在每次链路建立后都是固定且可计算的。ADC采样 → [发送端处理] → [SerDes传输] → [接收端处理] → 数据可用↑ ↑└────────── 确定性延迟 固定值 ──────────────┘如果延迟不确定多通道系统的通道间相位就会随机偏移导致多通道ADC采样时刻不对齐波束成形算法失效多板级联系统同步失败核心问题JESD204B的SerDes通路存在不确定的延迟源确定性延迟机制的目的就是消除这些不确定因素。延迟不确定的三个根源根源1SerDes的位对齐延迟不确定SerDes接收端需要做8B/10B解码解码的前提是找到字节边界。这个位对齐comma alignment过程的延迟取决于输入数据的随机状态每次复位后都不同。根源2多帧计数器的初始相位不确定链路建立完成后接收端和发送端的多帧计数器LMFC可能不在同一个相位。你以为是0它可能是7。差几拍延迟就差几个octet。根源3FIFO的读出起点不确定接收端有一个弹性缓冲区FIFO用来吸收lane间的skew。FIFO什么时候开始读如果读出起点不对延迟就不确定。Subclass 1的确定性延迟方案Subclass 1通过SYSREF信号解决以上三个问题。工程提示Subclass 2虽然也能实现单卡内的确定性延迟但不支持多板同步且兼容性差99%的量产项目都会选择Subclass 1。本文聚焦Subclass 1。SYSREF是什么SYSREF是一个全局同步信号由系统时钟源产生分发到所有JESD204B器件。它的作用是为所有器件的LMFC计数器提供统一的起始基准。textSYSREF ──→ ADC (发送端) ──→ LMFC对齐SYSREF ──→ FPGA (接收端) ──→ LMFC对齐SYSREF ──→ DAC (发送端) ──→ LMFC对齐所有器件在SYSREF的有效边沿重置自己的LMFC计数器从而保证所有器件的LMFC相位一致。SYSREF的时序要求这是最容易踩坑的地方。SYSREF必须满足建立/保持时间否则采样到的SYSREF边沿不确定确定性延迟就成了空话。verilog// ✅ SYSREF采样与释放窗口// SYSREF必须相对于器件时钟(device_clk)满足setup/hold时间// 具体数值参考器件数据手册reg sysref_sync_r0, sysref_sync_r1;always (posedge device_clk) beginsysref_sync_r0 sysref_in;sysref_sync_r1 sysref_sync_r0;end// 边沿检测本例为上升沿触发具体极性请参考器件手册wire sysref_posedge sysref_sync_r1 ~sysref_sync_r0;// SYSREF有效时重置LMFC计数器reg [15:0] lmfc_cnt;always (posedge device_clk or negedge rst_n) beginif (!rst_n) beginlmfc_cnt 0;end else if (sysref_posedge) beginlmfc_cnt 0; // 所有器件在SYSREF边沿同步归零end else beginlmfc_cnt lmfc_cnt 1b1;endend⚠️ SYSREF的有效边沿上升沿或下降沿需根据器件手册配置本例为上升沿触发。SYSREF的三个致命坑坑1SYSREF不是周期信号也能用很多人以为SYSREF必须是周期信号。其实JESD204B标准支持三种SYSREF模式模式SYSREF波形适用场景连续周期周期性脉冲最常用多板同步首选单次触发只发一次适合初始化后不再调整延迟的系统窄脉冲单个时钟周期宽度的脉冲适合SYSREF无法持续提供的场景量产经验单次触发模式是最稳定、用得最多的模式只在上电初始化时发送一次SYSREF避免周期SYSREF持续干扰SerDes接收端的CDR锁定。坑2SYSREF频率必须是LMFC频率的整数倍SYSREF的周期必须是多帧长度K×F个octet对应的时钟周期的整数倍。否则SYSREF边沿不会落在LMFC边界上对齐失败。textSYSREF周期 N × LMFC周期 N × K × F × (device_clk周期)如果SYSREF频率不满足这个关系接收端看到的LMFC相位每次SYSREF都不一样确定性延迟变成随机延迟。坑3SYSREF到达各器件的skew必须小于一个LMFC周期SYSREF走线延迟差如果超过一个LMFC周期不同器件的LMFC计数器就不在同一拍归零。PCB设计要求走线长度差 (LMFC周期 × 信号传播速度)例LMFC周期100ns传播速度≈150ps/inch → 最大走线差≈667英寸通常容易满足但当K1, F1时LMFC周期很短约束变紧需要留意。工程裕量实际量产中通常会把SYSREF走线长度差控制在100mil约2.5mm以内远小于LMFC周期要求留足裕量。确定性延迟的计算公式链路建立完成后确定性延迟的值是可计算的text确定性延迟 RBD (K × F) - 1 (单位octet)其中RBDRelease Buffer Delay接收端FIFO的读出延迟单位octet。由ILAS过程中的lane间skew和FIFO深度决定。K × F一个多帧的octet数。注此公式计算的是链路层octet数。实际采样点延迟还需乘以每octet对应的样本数取决于分辨率、通道数等具体可参考IP核手册中的延迟计算章节。实际工程中Xilinx JESD204B IP核会在链路建立后自动计算RBD值通过IP核的状态寄存器读取。verilog// ✅ 读取IP核计算的确定性延迟示例wire [15:0] deterministic_latency;assign deterministic_latency rbd_value (JESD_K * JESD_F) - 1;关键RBD值在每次链路重建后可能不同因为SerDes位对齐延迟随机但只要SYSREF对齐正确确定性延迟的总值在每个器件上都是相同的。常见调试场景场景1单通道延迟不确定症状每次复位后单通道的延迟跳动几个octet。排查清单□ SYSREF是否满足setup/hold时间用示波器测量□ SYSREF频率是否是LMFC频率的整数倍□ 是否配置了Subclass 1Subclass 0没有确定性延迟□ IP核的RBD值是否稳定连续复位10次读RBD寄存器看波动场景2多通道间延迟不一致症状通道间每次复位后相位差不同有时对齐有时偏1~3拍。排查清单□ SYSREF到各通道的走线延迟差是否小于1个LMFC周期□ 各通道的LMFC计数器在SYSREF边沿是否同步归零□ Lane间skew是否超过IP核的自动对齐范围场景3多板间延迟不一致症状板卡A和板卡B的通道间延迟差不稳定。排查清单□ SYSREF到各板的走线延迟差是否满足要求□ 各板的器件时钟是否同源必须同源□ 各板的LMFC周期配置K×F是否完全一致完整的确定性延迟调试流程text1. 确认Subclass 12. 用示波器验证SYSREF相对device_clk的setup/hold时间3. 确认SYSREF频率 N × LMFC频率4. 复位 → 链路建立 → 读RBD寄存器5. 重复步骤4共10次确认确定性延迟值稳定6. 如果不稳定 → 检查SYSREF时序和走线7. 如果稳定 → 多通道/多板测试自检表建议截图保存□ Subclass配置为1不是0也不是2□ SYSREF满足器件时钟的setup/hold时间已用示波器验证□ SYSREF频率是LMFC频率的整数倍□ SYSREF到各器件的走线延迟差 1个LMFC周期工程建议≤100mil□ 所有器件的器件时钟同源□ 所有器件的K×F配置一致□ 链路建立后RBD值稳定连续10次复位波动≤1□ 多通道/多板间延迟差在预期范围内最后确定性延迟调通了你的JESD204B系统才算真正“毕业”。你踩过哪个最诡异的延迟跳变坑评论区聊聊让大家避避坑。