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测量结果是“反向”的,公式别漏了。
这种混搭既保证了皮秒级精度,又把动态范围做到毫秒级。我在下面画了一张流程图,把两种测量路径以及混合思路串起来了。
嗯,这里要注意:混合架构虽然好用,但两个TDC的延迟偏差会直接影响最终精度。我曾经在一个12 b TDC项目里,因为忽略了两边延迟链的匹配,最终INL跳了3个LSB。后来给两个TDC做了对称布局,并在版图里加了一组虚拟延迟单元才压下来。
一点个人经验总结
- 项目前期:先算好你需要的分辨力和动态范围,别盲目上TDC。用计数器+内插(比如DLL多相时钟)在很多场景下已经够用。
- 校准不能省:TDC天生对PVT敏感。我习惯每次上电后先自动校准一下TDC的延迟值,或者跑一段已知时间间隔(比如系统时钟的半周期)来反推。
- 噪声考虑:计数器法受时钟抖动影响大,TDC受电源噪声和热噪声影响大。你想想看,一个10 ps的缓冲器,电源上100 mV的纹波就能让它偏差2~3 ps。所以电源完整性设计一定要跟上。
好了,这一章就把时间间隔测量的两种基本路子讲清楚了。下回我们聊具体怎么用这些方法去测Timing Skew,包括怎么连电路、怎么处理死区、怎么折算分辨率。