数模混合仿真实例(数字verilog作为顶层)VCS+Xa

数模混合仿真实例(数字verilog作为顶层)VCS+Xa

IC君的第40篇原创文章 (欢迎关注公众号 icstudy)

一年一度的五一劳动节又到了,常常加班不止996的ICer又可以好好休息一下了,首先IC君祝大家劳动节快乐!

大家都知道对于一颗有点复杂度的芯片而言(比如SOC),通常都会包含数字电路和模拟电路。在设计的初期,也许数字模块和模拟模块是分开设计和仿真的。随着项目的推进,需要将这些模块都集成到一起,形成最终tapeout的芯片。

以前也写过一篇文章IC君:新入职IC工程师必备技能——数模混合篇

SOC的很多模块是数模混合信号

如何保证数字电路和模拟电路之间的连接性和协同工作的表现呢?

做仿真呗~

废话,当然要做仿真,要做什么仿真呢?

包含数字电路和模拟电路的数模混合仿真。


数模混合仿真顾名思义包括数字电路仿真和模拟电路仿真。那数字电路仿真和模拟电路仿真又是如何定义的呢?

数字电路的仿真建模:verilog、system verilog、VHDL等等;

模拟电路的仿真建模:spice、verilog-A/AMS、VHDL-AMS、Real/Wreal、行为模型等等.

不同建模类型和spice仿真相比模型精确度与性能的关系

数字电路的仿真是以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三者之一。下面IC君就以VCS+Xa为例,讨论数模混合仿真的过程。


既然数模混合仿真包含数字电路和模拟电路两种仿真,最顶层整合所有模块的仿真属于哪一种呢?数字还是模拟呢?

答案是两者都可以。

以数字verilog为顶层的数模混合仿真环境
以模拟SPICE作为顶层的数模混合仿真环境

具体使用哪种环境要看实际的项目,以数字verilog为顶层的好处是,模拟仿真的结果都转换为数字,后续的验证就变得比较简单,毕竟数字的验证方法学比模拟先进很多。


有时候数字模块仅仅是一个很专用的模块,很复杂而且规模很大,其它都是以模拟模块为主,这时候也可以用模拟SPICE作为顶层来做数模混合仿真。


本来IC君自己辛辛苦苦准备了一个实例,后来发现在在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的内容如下:

文件里面的注释拿掉也没问题,这个模块只是用来定义端口的,实际仿真的时候会调用后面的模拟模块。

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:

第一行是用于设置xa的仿真精度,3是最低的,7是最高的(接近hspice的精度了)。

第二行是设置输出波形的格式,我这边仿真用的是2015的版本,最新的版本可以把模拟部分输出的fsdb 跟数字部分生成的fsdb 合并到一个fsdb里面,这个版本还不行,输出的结果是2个fsdb。


最后给出输出波形和屏幕显示结果:

通过仿真结果可以知道,以模拟方式手工搭出来的4位加法器,在逻辑上没有问题,当然它的覆盖率没有达到100%啊,有过数字验证经验的可以轻松修改这个testbench。从这个例子我们就可以看到以数字作为顶层的数模混合环境的优势,验证变得非常高效。

编辑于 2019-05-01 22:42