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。从这个例子我们就可以看到以数字作为顶层的数模混合环境的优势,验证变得非常高效。

推荐阅读:

相关文章