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

             数模混合仿真实例(数字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位加法器,这个加法器是用手工搭出来电路(模拟电路的实现方式)。在这个实例里面我们需要准备如下文件:

  1. adder.v Verilog 4位加法器的定义,其实只需要module名和端口定义;
  2. testbench.v仿真环境的顶层文件,用Verilog描述;
  3. addr4.spi4位加法器的SPICE网表文件,作为模拟模块;
  4. cmos35.mod工艺库文件,spice仿真时需要的;
  5. vcsAD.init:数模混合信号的控制文件;
  6. cfgxa(CustomSim)的配置文件;
  7. 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。从这个例子我们就可以看到以数字作为顶层的数模混合环境的优势,验证变得非常高效。

  • 16
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值