3. 测量原理

要测量Timing Skew,核心就是测时间间隔。你想想看,两路信号的边缘差了多少皮秒?本质就是问:一个起始事件和一个终止事件之间,经过了多少时间。

我个人习惯把时间间隔测量分成两条技术路线:一条是计数器法,简单粗暴;另一条是TDC(时间数字转换器),精细但复杂。很多新手上来就想用TDC,觉得精度高就一定好。但我在项目里吃过亏——高精度的TDC功耗大、面积大,对低速系统完全是浪费。所以先搞明白两种方法各自的脾气,再选型才靠谱。

计数器直接测量法——最朴素的思路

说白了就是拿个高频时钟去数。启动信号来了,计数器开始跑;停止信号来了,计数器停下。读到的计数值乘以时钟周期,就是时间间隔。

// 伪代码示意,别直接照搬
counter = 0
when start_rising:
    counter = 0
    counter_enable = 1
    while counter_enable:
        counter += 1  // 每个时钟上升沿计数
        wait for clk_rising
when stop_rising:
    time_interval = counter * T_clk
    counter_enable = 0

好处很明显:结构简单,动态范围随便你扩展,测个毫秒级不成问题。坏处呢?精度被时钟周期死死卡住。你拿100 MHz时钟测,最小分辨力就是10 ns。放到Timing Skew场景里,我们经常要测几十皮秒的偏差,这完全不够用。

我刚开始做SerDes时试过这种办法,测出来的skew全是10 ns的整数倍,和示波器一比差了一个数量级。后来领导说:“你拿尺子量纳米级的东西?” 嗯,从那以后我就没在精密场合直接用计数器了。

TDC——把时间“量化”成数字

TDC的思路是把时间间隔转换成可量化的物理量,再用数字电路读出。最经典的两种实现:抽头延迟线法和游标法。

抽头延迟线 TDC

一条延迟链,每个缓冲器的延迟大概几十皮秒。启动信号沿着链传播,停止信号瞬间锁存所有抽头位置。锁存结果就是“温度计码”,解码后得到时间值。

  • 优点:结构规整,转换时间短(一个周期内搞定)
  • 缺点:受工艺和环境影响大,每个抽头延迟不一致(DNL问题)

我记得在某个65 nm项目中,抽头延迟线的INL能到0.5 LSB,但不同芯片之间偏差很大。后来我加了一段校准电路,每次上电先测一段已知时间间隔,再反推真实的延迟值。

游标法 TDC

两条延迟链,一条快一点,一条慢一点。利用差拍原理,把微小时间差“放大”成可计数的节拍数。你想想看,快链每级延迟 \(\tau_1\),慢链每级延迟 \(\tau_2\),那么等效分辨力就是 \(\tau_2 - \tau_1\),可以实现亚门级精度。

我曾经在一个多通道TDC项目里试过游标法。理论上能做到1 ps精度,但实际上两条链的匹配非常难,温度一跑就偏移。最后不得不挂一个锁相环来动态校准。

TDC与计数器——核心对比

维度 计数器法 TDC(抽头延迟线/游标)
分辨力 时钟周期(典型ns级) 门延迟(典型ps ~ sub-ps)
最大量程 非常宽(取决于计数器位数) 受限(延迟链长度,通常几十ns)
结构复杂度 低(几个寄存器+计数器) 高(延迟链+锁存树+编码器)
功耗/面积 都很小 随精度指数增长
校准需求 几乎不需要 强烈需要(PVT补偿)
典型应用 低速skew测量,频率较低场合 高速串行接口、时间数字转换前端

这张表我在做选型时反复看过。说到底,没有“更好”的方案,只有“更合适”的方案。如果你只需要验证百兆级的Skew,一个50 ps精度的TDC纯属浪费。反过来,要是测26 Gbps的PAM4信号,计数器根本不配出现在玩具箱里。

两段式混合——实用折中

我见过很多工业级的TDC芯片(比如ACAM、ScioSense的),内部其实都用了粗计数+细TDC的混合结构。粗计数用计数器覆盖大动态范围(比如几微秒),细TDC只补足亚周期部分。示例如下:

// 两段式测量流程
粗测:计数器测量整数倍时钟周期   →  分辨力 T_clk(比如10 ns)
细测:TDC测量起始/停止边沿与最近时钟沿的微小间隔   →  分辨力 10 ps
结果 = 粗测值 + (T_clk - t_start_TDC) + t_stop_TDC

避坑提示:注意起始和停止的TDC测量结果是“反向”的,公式别漏了。

这种混搭既保证了皮秒级精度,又把动态范围做到毫秒级。我在下面画了一张流程图,把两种测量路径以及混合思路串起来了。

时间间隔测量方法体系 Start / Stop 事件 计数器直接测量 分辨力 = 时钟周期 量程宽,结构简单 TDC 精细测量 分辨力 = 门延迟(ps级) 量程受限,需校准 两段式混合 粗计数 + 细TDC 最终时间间隔

嗯,这里要注意:混合架构虽然好用,但两个TDC的延迟偏差会直接影响最终精度。我曾经在一个12 b TDC项目里,因为忽略了两边延迟链的匹配,最终INL跳了3个LSB。后来给两个TDC做了对称布局,并在版图里加了一组虚拟延迟单元才压下来。

一点个人经验总结

  • 项目前期:先算好你需要的分辨力和动态范围,别盲目上TDC。用计数器+内插(比如DLL多相时钟)在很多场景下已经够用。
  • 校准不能省:TDC天生对PVT敏感。我习惯每次上电后先自动校准一下TDC的延迟值,或者跑一段已知时间间隔(比如系统时钟的半周期)来反推。
  • 噪声考虑:计数器法受时钟抖动影响大,TDC受电源噪声和热噪声影响大。你想想看,一个10 ps的缓冲器,电源上100 mV的纹波就能让它偏差2~3 ps。所以电源完整性设计一定要跟上。

好了,这一章就把时间间隔测量的两种基本路子讲清楚了。下回我们聊具体怎么用这些方法去测Timing Skew,包括怎么连电路、怎么处理死区、怎么折算分辨率。