热度 5| |
一、前言
每一个asic芯片项目都是由模拟电路和数字电路组合而成,前面的章节讨论的都是数字电路的仿真和综合,在本章节将会讨论数模混合仿真的问题。本章节讨论的数模混合仿真,仍然是基于前面章节所使用到的UART的RTL代码。然而,由于本人对于模拟电路不是很熟悉,不能自行设计复位及振荡电路。因此,本章节的示例无法在工具软件中进行实际运行,但会把除了模拟网表之外的各类必备文件都交代清楚。说到数模混合仿真,原本cadence IC5141也具备这个功能,网络上也有相应的教程,但问题在于其仿真速度太慢,而且还有各种限制,这导致基于IC5141的数模混合仿真一点都不实用。
二、工具
数模混合仿真的工具很多,VCS+NANOSIM是常用的一对组合。后期NANOSIM升级为了XA,仿真流程没有变化,但是各项配置文件参数有相应的改变。
推荐文档,http://bbs.eetop.cn/thread-556128-1-1.html,该文档介绍了更多的nanosim可以选择的命令。也给出了一个示例,该示例是通过修改官方示例所得。
三、示例
基于VCS+NANOSIM仿真的流程总共分为两类,一个是基于模拟网表为顶层的所谓spice_top流程,另外一个是基于Testbench为顶层verilog_top流程,本章节是基于Testbench为顶层verilog_top流程。
所需文件a,Testbench,b,全部UART的RTL代码,c,vcsAD.init,d,cfg模拟配置文件,e,模拟电路网表,f,makefile启动脚本。所有文件见附件,除了模拟电路网表文件内容不全以外,其余文件内容均齐全(可能还需要修改)。文件结构图如下图,
仿真流程:准备好所需文件,注意文件的依赖关系及路径,在终端运行makefile启动文件即可。
另外有一个官方自带的仿真示例可以参考,路径在安装好的nanosim软件的路径下面:/home5/EDATools/synopsys/ns/E-2010.12/doc/ns/tutorials/nanosim/NS-VCS
官方示例中的run启动文件经过适当修改之后可以运行。
四、附件
Testbench:红色部分为相对原testbench修改的部分,针对模拟电路给的不同的rst_b复位时间长度,还需要修改“b,激励信号“的延迟时间才能运行。
`timescale 1ns/1ns
module tb;
parameter num =
500;
reg [7 : 0] Data_Bus;
reg
Load_XMT_datareg;
reg
Byte_ready;
reg T_byte;
reg
read_not_ready_in;
//reg Clock;
//reg rst_b;
//reg Sample_clk;
wire Clock;
wire rst_b;
wire Sample_clk;
wire serial;
wire
Error1,Error2;
wire [7:0]
RCV_datareg;
wire
read_not_ready_out;
//a,时钟和复位部分
/*
initial
begin
rst_b
= 1;
Sample_clk = 0;
Clock
= 0;
#100;
rst_b
= 0;
#100;
rst_b
= 1;
end
always #(8*num) Clock
= ~Clock;
always #num Sample_clk = ~Sample_clk;
*/
//b,激励产生部分
initial
begin
Data_Bus = 8'b1110_0101;
Load_XMT_datareg = 1'b1;
Byte_ready = 1'b0;
T_byte
= 1'b0;
read_not_ready_in = 1'b0;
//
#(2*8*num);
Load_XMT_datareg = 1'b0;
#(2*8*num);
Byte_ready = 1'b1;
#(2*8*num);
T_byte = 1'b1;
//
#(2*8*num)
Load_XMT_datareg = 1'b1;
Byte_ready = 1'b0;
T_byte = 1'b0;
end
//c,系统监视器
//d,结果比较电路
//e,波形产生函数
//vpd
/*
initial
begin
$vcdplusfile("wave.vpd");
$vcdpluson(1,tb);
end
*/
//fsdb
initial
begin
$fsdbDumpfile("wave.fsdb");
$fsdbDumpvars(0,tb);
end
//g,控制仿真时间
initial
begin
#1000_000;
$finish;
end
//f,待验证的MODULE
//将模拟电路模块示例化,模拟电路与数字电路的接口部分只需要一个复位//信号和两个时钟信号,Sample_clk频率为Clock频率的8倍,具体缘由请查//书籍《Verilog
hdl高级数字设计》
Analog analog(
.Clock(clock)
.Sample_clk(Sample_clk)
.rst_b(rst_b));
UART_XMTR m0(
.Serial_out(serial),
.Data_Bus(Data_Bus),
.Load_XMT_datareg(Load_XMT_datareg),
.Byte_ready(Byte_ready),
.T_byte(T_byte),
.Clock(Clock),
.rst_b(rst_b)
);
UART_RCVR m1(
.RCV_datareg(RCV_datareg),
.read_not_ready_out(read_not_ready_out),
.Error1(Error1),
.Error2(Error2),
.Serial_in(serial),
.read_not_ready_in(read_not_ready_in),
.Sample_clk(Sample_clk),
.rst_b(rst_b)
);
endmodule
全部UART的RTL代码见前文。
vcsAD.init:
use_spice -cell analog;//调用模拟网表中的顶层单元analog
choose nanosim -n analog.spi -C cfg ;//选择仿真的模拟hspice网表analog.spi及模拟仿真配置文件cfg。
bus_format _%d;//设置模拟网表总线表示格式
rmap_file resis_map;
analog.spi:在进行混合仿真前,确保analog.spi可以使用nanosim进行仿真,以排除模拟网表的问题,很多问题的产生都源于模拟网表没有修改好。如何用nanosim仿真模拟网表?简单的直接用启动命令:nanosim -n
analog.spi -C cfg,如何查看波形?观察cfg文件中是设置的fsdb还是vpd。再决定启动verdi还是dve。
.inc
<hspice仿真库文件路径,工艺厂商提供的工艺库中>
<从cadence IC5141中导出的hspice模拟网表文件,并修改相关参数,使其可以用nanosim单独仿真,关于如何导出hspice网表请自行百度>
.global vdd gnd //设定全局电源地
vse vdd gnd vpwl 0 0 5n 5v 1m 5v //添加模拟电源激励
.tran 15n 1m //控制仿真时间为1ms,仿真步进为15ns.
.end//结束标志
cfg:
print_node_v * //打印所有节点电压
print_node_i * //打印所有节点电流
print_node_logic * //打印所有节点逻辑信号
set_print_format for=fsdb //设定打印格式,有fsdb和vpd两种可选,分别对应verdi和dve两种波形查看器的格式
makefile:
all:VCS VERDI
VCS: +ad参数即为调用nanosim进行联合仿真
vcs
+v2k +ad=vcsAD.ini -sverilog -debug_all -P
/usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/novas.tab
/usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/pli.a +vcs+lic+wait -f
uart.f -y ./ +libext+.v -full64 -R
VERDI:
verdi
-f uart.f -ssf wave.fsdb &
uart.f:
/home/Lance/synopsys/uart/nanosim/src/testbench.v
/home/Lance/synopsys/uart/nanosim/src/UART_XMTR.v
/home/Lance/synopsys/uart/nanosim/src/Control_Unit.v
/home/Lance/synopsys/uart/nanosim/src/Datapath_Unit.v
/home/Lance/synopsys/uart/nanosim/src/UART_RCVR.v
/home/Lance/synopsys/uart/nanosim/src/Control_Unit2.v
/home/Lance/synopsys/uart/nanosim/src/Datapath_Unit2.v