这是在利用 Verilog-A 搭建系统仿真 model 时遇到的问题,这里记录一下。
在下面的 Verilog-A 代码片断中,定义 mvar 为实数类型的变量,并对其赋值:
real mvar;
mvar=2/3*9.0;
这里最后得到的 mvar=9.0 而不是6.0。
原因在于 Verilog-A 代码中的 2/3 这部分,由于是两个整数相除,得到是最近的整数,即为1。
而这一部分的运算并不会因为 mvar 的数据类型而发生改变。
这是在利用 Verilog-A 搭建系统仿真 model 时遇到的问题,这里记录一下。
在下面的 Verilog-A 代码片断中,定义 mvar 为实数类型的变量,并对其赋值:
real mvar;
mvar=2/3*9.0;
这里最后得到的 mvar=9.0 而不是6.0。
原因在于 Verilog-A 代码中的 2/3 这部分,由于是两个整数相除,得到是最近的整数,即为1。
而这一部分的运算并不会因为 mvar 的数据类型而发生改变。
在 Cadence ADE 中有很多方法可以实现数据的采样,例如在 tran 分析中设置 strobe period 或是利用 calculator 中的 函数实现 re-sample。这里介绍一下利用 verilog-A model 来实现的数据采样,这种方法的一个优点是可以直接将采样数据保存到文件(而不用像前两种方法需要用再利用 calculator print 到文件)以方便后续分析。
具体的 Verilog-A 实现如下,主要是利用的 Verilog-A 中的文件相关命令 fopen,fstrobe 和 fclose。注意最后保存的文件 data_save.txt 是在仿真路径下面的 netlist 目录下而不是 psf 目录下。
// VerilogA for Model_HL, data_sample, veriloga `include "constants.vams" `include "disciplines.vams" module data_sample(clk,in,out); input clk, in; output out; electrical clk, in, out; parameter real vth=1.5; integer out_file; real sig_out; analog begin @(initial_step) begin out_file=$fopen("date_save.txt"); end @(cross(V(clk)-vth, 1)) begin sig_out=V(in); $fstrobe(out_file, "%f", sig_out); end @(final_step) begin $fclose(out_file); end V(out) <+ sig_out; end endmodule
关于PFD (鉴频鉴相器)的模型,一般在 Matlab 的 simulink 环境下比较容易实现,因为搭建 PFD 主要的模块都能在 simulink 的库中找到,直接按照电路一样搭建就可以了。在这里,我们主要关心的是基于 Verilog-A 的方法的实现, 以希望在之后的电路设计中方便实现的模型和实际电路的切换。
继续阅读
这里把利用 verilog-a 模型实现迟滞比较器的方法记录一下。
关于迟滞比较器,在实际的模型的构建中主要是考虑利用 @cross 语句来确定不同的翻转点, 这里需要注意的是初态的设置以保证翻转的触发。具体的 verilog-a model 描述如下
继续阅读
在 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 代码如下:
继续阅读