在 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 上找到.
博主
1 我仿真出来的jee和jcc不存在1.4倍的关系,确定你的关系式是正确的?
2 pll中的抖动性能指标是jee吧?
谢谢
谢谢提醒,应该是 cycle-jitter 而不是 cycle-to-cycle jitter,具体你可以去看上面提到参考的文章
楼主
dt = jitter*$rdist_normal(seed,0,1); // add jitter
这个语句中的seed变量有什么用?
就是控制产生的随机数的,实际都是伪随机嘛