第四章验证与VCS使用本章将讲述的内容:节第一验证。什么是验证。为什么需要验证。验证的重要性。如何进行验证第二节VCS简单使用方法2.1什么是VCS2.2VCS可以做什么2.3怎样进行验证2.4VCS的工作方式2.5VCS使用方法举个简单例子2.6VirSim的图形方式和每个窗口的介绍附录A.VCS的参数附录B.virsim简明帮助附录C.simv简明帮助第一节验证当代码编写完之后,怎么确定是正确的呢,代码能不能符合设计要求,能不能完成所需要的功能,这就是验证所要做的工作。验证在设计中有很重要的地位,从设计流程中可以看到,几乎设计工作每前进一步,都要进行验证。对验证的要求,大多数人认为只要编译通过之后,能实现功能就可以了,其实决不仅仅这么简单,验证的目的应该是尽量多的找到代码中的错误,不管是编写错误还是功能错误,找出的错误越多,验证工作就做的越好越好。既然验证这么重要,如何进行验证呢?对于验证来说,不同等级的验证,它的方法是不一样的。什么是验证的等级,从设计流程(下图)可以看到,验证可以大致分为单独子模块验证、功能模块验证、系统顶级验证。。单独子模块验证,需要做的工作是验证它的功能和逻辑是否符合设计要求。功能模块验证,需要验证这个模块的功能可不可以满足要求,是否会有非法数据或不该有的输出,错误的状态等。。系统顶级验证,更关注于系统整体的行为方式,模块间的联系和通讯,总线信号,数据流路径是否满足设计要求,数据处理或时序正确与否等。验证需要一个支持的平台,这就是test_bench,在这个测试平台上,有激励信号产生器、被测模块、响应分析和监测器,(下图)激励与控制:输入端口设置,测试向量,测试模式设置,同步。响应分析器和监测器:可以及时监控输出信号变化,可以判断输出信号是正确、合法、错误、非法等等。ModuleStimulus&ControlMonitor&Analyzertestbench可以用verilog描述语言搭建,也可以用C语言编写,如果用C语言编写,还需要相关的编译器并和与verilog的接口。节第二VCS的简单使用方法2.1什么是VCSVCS的全称是VerilogCompileSimulator,是Synopsys公司的强有力的电路仿真工具,可以进行电路的时序模拟。2.2VCS的工作方式VCS运行首先把输入的verilog源文件编译,然后生成可执行的模拟文件,也可以生成VCD或者VCD+记录文件。然后运行这个可执行的文件,可以进行调试与分析;或者查看生成的VCD或者VCD+记录文件。还生成了一些供分析和查看的文件,以便于调试。2.3怎样进行仿真和验证仿真测试一个模块的大致步骤如下:(1)首先需要编写好模块的verilog代码。(2)搭建testbench,充分了解被测模块的特性,编写测试向量,输入端口的激励,编写响应分析和监测部分。(3)运行VCS进行模拟,查看输出或者波形。(4)若发现错误,分析错误类型和原因,修改代码或者修正测试方法,直到符合测试要求。2.4VCS的运行方式VCS的运行方式有两种,一种是交互模式(interactivemode),一种是批处理模式(batchmode),两种方式各有优劣,具体用在不同的情况下。在测试小模块或者底层模块,情况不太复杂的时候,而又需要很详细信息的时候,可以采用交互模式,交互性能更好,显示更直观;当进行复杂测试而关注于整体性能,而不必去查看每个信号的时候,只需要查看所需要关心的信号即可,这种情况可以用批处理模式。2.5VCS简单使用例子下面用一个简单的例子来说明如何使用VCS这是个四位全加器的verilog代码,存储为add4.v,moduleaddr4(clk,in1,in2,sum,carry);output[3:0]sum;outputcarry;inputclk;input[3:0]in1,in2;reg[3:0]sum;regcarry;integertemp;initialbeginsum=0;carry=0;endalways@(posedgeclk)begintemp=in1+in2;sum=temp;if(temp15)carry=1;elsecarry=0;endendmodule然后再根据这个模块写一个测试模块,也称之为testbench,存为top.v,moduletop;regclk_reg;reg[3:0]in1_reg,in2_reg;wire[3:0]sum;wirecarry;addr4a4(clk_reg,in1_reg,in2_reg,sum,carry);parameterd=100;initialbeginclk_reg=0;in1_reg=0;in2_reg=0;repeat(16*100)begin#din1_reg=in1_reg+1;in2_reg=in2_reg+1;//$display($stime,,in1_reg+%din2_reg+%d=sum%dcarryis%d,in1_reg,in2_reg,sum,carry);//$display($stime,,%b+%b=%bandcarryis%b,in1_reg,in2_reg,sum,carry);end//$strobe($stime,,in1_reg%bin2_reg%bsum%bcarry%b,in1_reg,in2_reg,sum,carry);#1$finish(2);endalwaysbegin#50clk_reg=~clk_reg;endalways@(sum)begin//$display($stime,,in1_reg+%din2_reg+%d=sum%dcarry_regis%d,in1_reg,in2_reg,sum,carry_reg);$display($stime,,nowataclockposedge,theoperationis::%d+%d=%dandcarryis%d,in1_reg,in2_reg,sum,carry);//$stop;endendmodule最简单的仿真,只要运行vcsfilename即可,filename可以有很多个,比如上面的例子:vcstop.vadd4.v然后,如果没有发现编译错误,将会出现VCS的说明和一些信息,接下来的就是它的执行情况,翻译top.v和add4.v,可以自动发现顶层模块,如果定义了timescale将显示用的timescale信息,如果没有,就显示NoTimeScalespecified。然后将产生一个名为simv的可执行文件,这个就是模拟仿真文件。下面是运行结果:Parsingdesignfile'top.v'Parsingdesignfile'add4.v'TopLevelModules:topNoTimeScalespecified1of2uniquemodulestogenerate1of1modulesdoneInvokingloader...simvgenerationsuccessfullycompleted下面我们来运行一下这个simv可执行文件,simvcr结果将显示:ChronologicVCSsimulatorcopyright1991-2001ContainsSynopsysproprietaryinformation.Compilerversion6.0;Runtimeversion6.0;Jan815:3720020nowataclockposedge,theoperationis::0+0=0andcarryis0150nowataclockposedge,theoperationis::1+1=2andcarryis0250nowataclockposedge,theoperationis::2+2=4andcarryis0350nowataclockposedge,theoperationis::3+3=6andcarryis0450nowataclockposedge,theoperationis::4+4=8andcarryis0550nowataclockposedge,theoperationis::5+5=10andcarryis0650nowataclockposedge,theoperationis::6+6=12andcarryis0750nowataclockposedge,theoperationis::7+7=14andcarryis0850nowataclockposedge,theoperationis::8+8=0andcarryis1950nowataclockposedge,theoperationis::9+9=2andcarryis11050nowataclockposedge,theoperationis::10+10=4andcarryis11150nowataclockposedge,theoperationis::11+11=6andcarryis11250nowataclockposedge,theoperationis::12+12=8andcarryis11350nowataclockposedge,theoperationis::13+13=10andcarryis11450nowataclockposedge,theoperationis::14+14=12andcarryis11550nowataclockposedge,theoperationis::15+15=14andcarryis11650nowataclockposedge,theoperationis::0+0=0andcarryis01750nowataclockposedge,theoperationis::1+1=2andcarryis01850nowataclockposedge,theoperationis::2+2=4andcarryis01950nowataclockposedge,theoperationis::3+3=6andcarryis02050nowataclockposedge,theoperationis::4+4=8andcarryis02150nowataclockposedge,theoperationis::5+5=10andcarryis02250nowataclockposedge,theoperationis::6+6=12andcarryis02350nowataclockposedge,theoperationis::7+7=14andcarryis02450nowataclockposedge,theoperationis::8+8=0andcarryis1…………(略)$finishatsimulationtime160001VCSSimulationReportTime:160001CPUTime:0.100seconds;Datastructuresize:0.0MbTueJan815:37:312002验证输出的这些信息,就可以发现,模块的设计是正确的,满足和全加器的设计要求。注意到top.v文件中的注释掉的几行,也可以用其他方式显示,特殊情况需要特殊处理。2.6图形方式的VCS下面用图形方式启动VCS,可以进行更方便的控制和监测,运行VCS–RItop.vadd4.v(-RI的选项就是打开交互式图形界面,是指RunInteractive)运行上面的命令会打开VirSim主程序,Interactive窗口会自动打开。2.6.1VirSim概况Virsim是基于OSF/Motif的图形化仿真调试系统,Virsim可以和VCS、EPICpowermill以及Timemill一起协同工作。利用Virsim与VCS交互式的工作方式可以在模拟的过程中显示仿真结果,结果可以存到一种叫做VCD+的文件中。这种图形化的调试系统可以支持三种基本的调试方式:波形、结构