关于抖动时钟的模型


在 IC 设计(如 ADC 电路等)中,有时候要考虑时钟抖动(clock jitter)的影响,通过在设计初期加入带有抖动的时钟模型可以较快的判定其影响。

关于 clock jitter 具体的仿真模型,J.Baker 的混合信号书中提到的方法是利用 spice 中的 SFFM 模型,即单频率频率调制源(Single-Frequency-Frequency-Modulation):
SFFM (Vo Va ...)
也即为如下的函数:
Vsffm(t)=Vo+Va*sin[2*pi*Fc*t+MDI*sin(2*pi*Fs*t)]
在这里,调制率 MDI 决定了峰峰值相位偏移,即 2*MDI=2*pi*dt/Ts=2*pi*dt*Fs, (Ts=1/Fs)
故而,可以简单的认为 peak-peak jitter:dt=MDI/(pi*Fs)
在得到此抖动的正弦信号后,通过理想判决器(比较器)可以将其转换为我们所需的抖动时钟信号

这种方法的问题主要在于:得到的 clock jitter并非随机;J.baker 也在书中也提出通过设置 Fs 与仿真时间来使其更接近实际情况。

事实上,通过 Verilog-A 工具可以更容易的仿真时钟抖动的影响,一个简单的想法是利用 verilog-A 中的 transition 语句在 delay 中引入随机(利用 $rdist_normal 函数),可参考的部分 Verilog-A 代码如下:

analog begin
@(initial_step) seed = -311;
@(cross(V(in) - vth, 1, ttol)) begin // positive edge
n = 1;
dt = jitter*$rdist_normal(seed,0,1); // add jitter
end;
@(cross(V(in) - vth,-1, ttol)) begin // negetive edge
n = 0;
dt = jitter*$rdist_normal(seed,0,1); // add jitter
end
V(out) <+ transition(n ? vh : vl, td+dt, tt);
end

在上面描述中,输入理想时钟的跳变沿加入 delay+jitter 后再输出,需要注意的是,此处的 jitter 为 edge-edge jitter (jee), 若给定的为 cycle-cycle jitter (jcc),则需加以转换(jcc=1.414*jee)。应是对于 synchronous jitter,可以认为 cycle jitter =1.414*Jee.

同样也可以将时钟发生的部分一并纳入 Verilog-A 描述中,部分代码如下:

analog begin
@(initial_step) begin
accSeed = 286; //seed for accumulating jitter
syncSeed = -459; //seed for synchronous jitter
accSD = acc_jitter*`M_SQRT1_2;
syncSD = sync_jitter;
next = 0.5/freq + $abstime;
end
@(timer(next + dt)) begin
n = !n;
dT = accSD*$rdist_normal(accSeed,0,1);
dt = syncSD*$rdist_normal(syncSeed,0,1);
next = next + 0.5/freq + dT;
end
V(out) <+ transition(n ? vh : vl, 0, tt);
end

这里利用了 @(timer()) 和 $abstime 函数来实现时钟的输出, 具体关于 accumulating jitter 和 synchronous jitter 可以参见 Designer‘s Guide 上的 这篇 paper,上面的完整代码亦可以 Designer‘s Guide 上找到.


版权声明: 本站文章版权所有,转载须以超链接形式标明文章原始出处和版权信息。

关于抖动时钟的模型》上有4条评论

      1. 星速

        楼主
        dt = jitter*$rdist_normal(seed,0,1); // add jitter
        这个语句中的seed变量有什么用?

        回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注