数模混合仿真实例(数字verilog作为顶层)VCS+XA
大家都知道对于一颗有点复杂度的芯片而言(比如SOC),通常都会包含数字电路和模拟电路。在设计的初期,也许数字模块和模拟模块是分开设计和仿真的。随着项目的推进,需要将这些模块都集成到一起,形成最终tapeout的芯片。
如何保证数字电路和模拟电路之间的连接性和协同工作的表现呢?做仿真呗~
废话,当然要做仿真,要做什么仿真呢?包含数字电路和模拟电路的数模混合仿真。
数模混合仿真顾名思义包括数字电路仿真和模拟电路仿真。那数字电路仿真和模拟电路仿真又是如何定义的呢?
- 数字电路的仿真建模:verilog、system verilog、VHDL等等;
- 模拟电路的仿真建模:spice、verilog-A/AMS、VHDL-AMS、Real/Wreal、行为模型等等.
数字电路的仿真是以verilog为代表的,模拟电路的仿真有多种选择,最终数模混合有多种方式。这篇文章重点讨论verilog和spice的数模混合仿真方法。
- 常用的支持verilog的仿真器:VCS (synopsys), NC verilog/irun (cadence) , modesim(mentor)等等;
- 常用的支持spice的仿真器 :hspice (synopsys), Xa (synopsys), hsim(synopsys), finesim(synopsys), spectre(cadence)等等;
- hspice针对的是模块级的仿真,通常用于规模很小的电路,精度很高但速度非常慢。
- Xa,hsim,finesim可以作为快速spice的仿真工具,速度上比hspice快很多,损失一点点精度。数模混合设计电路通常是中小规模的,一般都是选择快速spice仿真工具,hspice根本仿真不动啊。
所以最常见的数模混合仿真选择是VCS与Xa、hsim、finesim三者之一。下面就以VCS+Xa为例,讨论数模混合仿真的过程。
既然数模混合仿真包含数字电路和模拟电路两种仿真,最顶层整合所有模块的仿真属于哪一种呢?数字还是模拟呢?答案是两者都可以。具体使用哪种环境要看实际的项目,以数字verilog为顶层的好处是,模拟仿真的结果都转换为数字,后续的验证就变得比较简单,毕竟数字的验证方法学比模拟先进很多。
有时候数字模块仅仅是一个很专用的模块,很复杂而且规模很大,其它都是以模拟模块为主,这时候也可以用模拟SPICE作为顶层来做数模混合仿真。
本来准备了一个实例,后来发现在Xa的安装目录$Xa_install_dir/doc/tutorials/mixed_signal/XA-VCS下面有准备好的实例。这个实例是以数字verilog仿真作为顶层,唯一的缺点是有些配置太简单了,IC君在它的基础上再加了一些复杂的配置。
这个实例的目的是验证一个4位加法器,这个加法器是用手工搭出来电路(模拟电路的实现方式)。在这个实例里面我们需要准备如下文件:
- adder.v Verilog 4位加法器的定义,其实只需要module名和端口定义;
- testbench.v仿真环境的顶层文件,用Verilog描述;
- addr4.spi4位加法器的SPICE网表文件,作为模拟模块;
- cmos35.mod工艺库文件,spice仿真时需要的;
- vcsAD.init:数模混合信号的控制文件;
- cfgxa(CustomSim)的配置文件;
- run_xa_vcs混合仿真编译和仿真的脚本
在shell命令窗口,输入run_xa_vcs 回车即可看到整个仿真过程和结果。打开run_xa_vcs,里面的内容如下:
/bin/rm -rf csrc simv* *.vcd *.fsdb*
vcs -full64 -ad=vcsAD.init testbench.v adder.v -l comp.log -debug_pp -o simv
simv +COMPARE -l sim.log
- 第一行内容是删除一些临时文件,第三行是执行编译结果,最重要的是第二行。
- 第二行是VCS 编译的命令,里面加入了数模混合信号的控制文件vcsAD.init,顶层的testbench.v和adder.v。
- testbench.v的内容如下:
注意这儿的timescale的精度定义要小心,要比模拟模块的时间精度要小。举个例子假如你在这边设置一个 1ns/1ns, 模拟模块的门延迟只有几十ps,这样信号在数字和模拟接口之间处理的时候,相位就会发生错乱。
- adder.v的内容如下:
`timescale 1ns/10fs
module add4(a, b, cin, s, count);
input [3:0] a;
input [3:0] b;
input cin;
output [3:0] s;
output count;
assign {count, s} = a + b + cin;
endmodule
- 文件里面的注释拿掉也没问题,这个模块只是用来定义端口的,实际仿真的时候会调用后面的模拟模块。
- vcsAD.init的具体内容如下:
第1行的意思是调用xa作为模拟电路的仿真器,模拟电路的网表文件为addr4.spi,调用xa的配置文件cfg。
第2行的意思把addr4这个模块用spice来仿真。
第3-5行定义了信号从数字到模拟接口的定义:
信号从数字模块传到模拟模块,上升和下降时间都为100ps,延迟300ps,逻辑0转换为高电压3.3,逻辑1转换为低电压0,对应接口信号的名称。
- d2a的详细语法如下:
第6-7行定义了信号从模拟到数字接口的定义:
信号从模拟模块传到数字模块,电压低于0.6v的时候转换为逻辑0,电压高于2.7v的时候转换为逻辑1,对应接口信号的名称。
a2d的详细语法如下:
第8行不重要,告诉工具在spice网表里面哪些是总线端口,比如a_3 a_2 a_1 a_0作为总线a[3:0],在对应的verilog仿真文件里面就可以用a作为总线端口。
在这个文件里面,我们还可以加一些其它的配置,比如信号的驱动强度等等。
addr4.spi这个文件跟我们通常的spice仿真文件很类似,里面会调用网表(可以用virtuoso生成)和工艺库,还有一些测量meas语句:
- 再来看一下xa(CustomSim)的配置文件cfg:
set_sim_level 3
set_waveform_option -format fsdb -file merge
- 第一行是用于设置xa的仿真精度,3是最低的,7是最高的(接近hspice的精度了)。
- 第二行是设置输出波形的格式,我这边仿真用的是2015的版本,最新的版本可以把模拟部分输出的fsdb 跟数字部分生成的fsdb 合并到一个fsdb里面,这个版本还不行,输出的结果是2个fsdb。
最后给出输出波形和屏幕显示结果:
通过仿真结果可以知道,以模拟方式手工搭出来的4位加法器,在逻辑上没有问题,当然它的覆盖率没有达到100%啊,有过数字验证经验的可以轻松修改这个testbench。从这个例子我们就可以看到以数字作为顶层的数模混合环境的优势,验证变得非常高效。