标签归档:Verilog-A

Verilog-A 中运算时由数据类型而来的一个问题

这是在利用 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 实现数据采样

在 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 的 Verilog-A model

关于PFD (鉴频鉴相器)的模型,一般在 Matlab 的 simulink 环境下比较容易实现,因为搭建 PFD 主要的模块都能在 simulink 的库中找到,直接按照电路一样搭建就可以了。在这里,我们主要关心的是基于 Verilog-A 的方法的实现, 以希望在之后的电路设计中方便实现的模型和实际电路的切换。
继续阅读

迟滞比较器的 Verilog-A model

这里把利用 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 代码如下:
继续阅读