4. eDP 时序参数概述:时钟域划分、数据通道时序、建立时间与保持时间的基础概念

各位好,咱们这章来聊聊 eDP 时序里最基础但也是最容易踩坑的地方。说实话,我刚入行那会儿,总觉得时序就是看看 datasheet 上的几个数字,后来被链路训练搞得焦头烂额,才发现这些基础概念没吃透,后面代码根本跑不通。

eDP 的时序说白了就三件事:时钟怎么分家、数据怎么走、以及芯片内部怎么判断信号对不对。咱们一个一个说。

4.1 时钟域划分:为什么要把一个时钟拆成好几个?

在 eDP 源端(Source)内部,至少得有三个时钟域:

  • 像素时钟域(Pixel Clock Domain):处理来自显卡的并行 RGB 数据,频率由分辨率和刷新率决定。比如 1920×1080@60Hz ≈ 148.5MHz。
  • 链路时钟域(Link Clock Domain):eDP 主链路(Main Link)上实际跑串行数据的参考时钟。常见值 162MHz、270MHz、540MHz 等。
  • 辅助时钟域(Aux Clock Domain):AUX 通道的时钟,通常来自独立的晶振或 PLL,频率 1MHz 左右。

我亲自见过一个项目,工程师把像素时钟和链路时钟混到一个 PLL 里,结果频率切换时 lock 丢失,画面直接闪黑。记住:不同时钟域之间必须用同步器或 FIFO 做隔离。

注意:eDP 的 Training Pattern 是在链路时钟域里产生的,但训练后的参数(比如均衡系数)却要跨时钟域传递给像素时钟域。处理不好就会导致训练结果无法生效——我曾经为这个 bug 调了三天。

4.2 数据通道时序:每个 Lane 都是一个小世界

主链路有 4 个 Lane(通道),每个 Lane 都是一个高速串行差分对。关键时序参数有哪些?我习惯列成一张表,方便查:

参数 符号 典型值(1.62Gbps/lane) 说明
比特率 BR 1.62 Gbps 每 lane 每秒传输的比特数
单位间隔 UI 617 ps 每比特占用时间 = 1/BR
抖动(总抖动) TJ ≤ 0.3 UI 包括随机抖动 + 确定性抖动
Lane-to-Lane Skew LLS ≤ 2 UI 不同 lane 之间的相位差
数据到时钟的偏移 T_data2clk ± 0.5 UI 以源时钟为参考

你想想看,如果 Lane 0 和 Lane 1 之间差了 3 个 UI,接收端去对齐眼图时得额外吃掉多少 margin?这就是为什么链路训练里要测 skew,还要做 deskew。

避坑经验:我曾经遇到一个案子,PCB 上四对差分线没做等长,结果 Lane 2 比别的 lane 长了 12mm,换算成时间差约 60ps。对于 1.62Gbps 的 UI=617ps 来说,这 60ps 还不到 0.1UI,但加上了收发器的内部延迟后,skew 直接超了 0.5UI。最后不得不改板。

4.3 建立时间与保持时间:芯片内部的“开门关窗”

这两种时序约束,本质上定义的是 数据在时钟边沿前后必须稳定的时间窗口。我习惯用一个比喻:时钟边沿就像一扇快门,建立时间是快门打开前数据必须到位的提前量,保持时间是快门关闭后数据还得再撑一会儿的最短时长。

在 eDP Source 芯片内部,像素时钟域和链路时钟域之间往往有一个跨时钟域 FIFO。这个 FIFO 的读、写指针分别由两个时钟控制,如果建立/保持时间不满足,FIFO 就会读到“半生不熟”的数据,产生 metastability。

那 eDP 链路训练里啥时候会用到建立/保持时间?举个例子:训练时 Receiver 会发送 训练结果寄存器(比如 EQ 系数、gain 值),Source 需要用 AUX 时钟去采集这些值。AUX 时钟频率低(1MHz),但芯片内部走线可能有延迟。

// 伪代码示例:AUX 读取训练结果
always @(posedge aux_clk or negedge aux_rst_n) begin
  if (!aux_rst_n)
    eq_gain <= 4'h0;
  else if (aux_read_en)
    // 需要确保 data_valid 在 aux_clk 上升沿前后满足 setup/hold
    eq_gain <= aux_data_in[3:0];  
end
我的小技巧:遇到 setup/hold 违例时,不要直接加 buffer 插 delay。先看 STA 报告里是哪个路径的延迟过大,很可能是扇出太高或者跨电压域。我曾经试过在综合时加 set_max_fanout 4,setup slack 反而变差了——因为插了太多 buffer 让路径变长。

4.4 时序参数与链路训练的关系全览

说了这么多,它们怎么串起来的?我画了一张图,把时钟域、数据通道、建立/保持时间的关系理清楚。

eDP 时序参数关系图 eDP 时序参数关系图 像素时钟域 Pixel Clock ~148.5MHz 链路时钟域 Link Clock 162/270/540MHz AUX 时钟域 AUX Clock ~1MHz FIFO (同步器) FIFO 数据通道 Lane 0 (串行) Lane 1 Lane 2 Lane 3 建立时间 (Setup) & 保持时间 (Hold) 定义数据在时钟边沿前后必须稳定的最小时间窗口 训练结果(EQ/Gain)通过 AUX 通道写回 Source AUX 写事务

图中箭头指向很清晰:像素数据经过 FIFO 同步到链路时钟域,再分发给 4 个 Lane;而链路训练的反馈(扰动后调整的 EQ 系数)则通过 AUX 时钟域写回。建立/保持时间约束控制着所有这些跨时钟域采样的正确性。

核心思路:链路训练本质上是在找一组时序参数(均衡系数、去加重、相位偏移等),使得接收端能在建立/保持时间不违例的前提下可靠采样。训练失败往往不是因为算法不行,而是底层时序 margin 根本不够。

4.5 总结记忆点

  • 时钟域划分:像素时钟、链路时钟、AUX 时钟,必须用同步器分开。
  • 数据通道时序:关注 UI、抖动、skew 三个参数,skew 超标会直接导致链路训练失败。
  • 建立/保持时间:这是芯片内部的门槛,训练必须以不踩这个门槛为前提。
  • 熟记典型表格:1.62Gbps 下 UI=617ps,LLS≤2UI,TJ≤0.3UI——这些数字在写约束文件时会反复用到。