第04章1 验证与VCS使用.docx
《第04章1 验证与VCS使用.docx》由会员分享,可在线阅读,更多相关《第04章1 验证与VCS使用.docx(30页珍藏版)》请在冰豆网上搜索。
第04章1验证与VCS使用
第四章验证与VCS使用
本章将讲述的内容:
第一节验证
。
什么是验证
。
为什么需要验证
。
验证的重要性
。
如何进行验证
第二节VCS简单使用方法
2.1什么是VCS
2.2VCS可以做什么
2.3怎样进行验证
2.4VCS的工作方式
2.5VCS使用方法举个简单例子
2.6VirSim的图形方式和每个窗口的介绍
附录A.VCS的参数
附录B.virsim简明帮助
附录C.simv简明帮助
第一节验证
当代码编写完之后,怎么确定是正确的呢,代码能不能符合设计要求,能不能完成所需要的功能,这就是验证所要做的工作。
验证在设计中有很重要的地位,从设计流程中可以看到,几乎设计工作每前进一步,都要进行验证。
对验证的要求,大多数人认为只要编译通过之后,能实现功能就可以了,其实决不仅仅这么简单,验证的目的应该是尽量多的找到代码中的错误,不管是编写错误还是功能错误,找出的错误越多,验证工作就做的越好越好。
既然验证这么重要,如何进行验证呢?
对于验证来说,不同等级的验证,它的方法是不一样的。
什么是验证的等级,从设计流程(下图)可以看到,验证可以大致分为单独子模块验证、功能模块验证、系统顶级验证。
。
单独子模块验证,需要做的工作是验证它的功能和逻辑是否符合设计要求
。
功能模块验证,需要验证这个模块的功能可不可以满足要求,是否会有非法数据或不
该有的输出,错误的状态等。
。
系统顶级验证,更关注于系统整体的行为方式,模块间的联系和通讯,总线信号,数
据流路径是否满足设计要求,数据处理或时序正确与否等。
验证需要一个支持的平台,这就是test_bench,在这个测试平台上,有激励信号产生器、被测模块、响应分析和监测器,(下图)
激励与控制:
输入端口设置,测试向量,测试模式设置,同步。
响应分析器和监测器:
可以及时监控输出信号变化,可以判断输出信号是正确、合法、错误、非法等等。
Stimulus
&
Control
Monitor
&
Analyzer
Module
testbench可以用verilog描述语言搭建,也可以用C语言编写,如果用C语言编写,还需要相关的编译器并和与verilog的接口。
第二节VCS的简单使用方法
2.1什么是VCS
VCS的全称是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;
initialbegin
sum=0;
carry=0;
end
always@(posedgeclk)begin
temp=in1+in2;
sum=temp;
if(temp>15)
carry=1;
else
carry=0;
end
endmodule
然后再根据这个模块写一个测试模块,也称之为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;
initialbegin
clk_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);
end
always
begin
#50clk_reg=~clk_reg;
end
always@(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;
end
endmodule
最简单的仿真,只要运行vcsfilename即可,filename可以有很多个,
比如上面的例子:
vcstop.vadd4.v
然后,如果没有发现编译错误,将会出现VCS的说明和一些信息,接下来的就是它的执行情况,翻译top.v和add4.v,可以自动发现顶层模块,如果定义了timescale将显示用的timescale信息,如果没有,就显示NoTimeScalespecified。
然后将产生一个名为simv的可执行文件,这个就是模拟仿真文件。
下面是运行结果:
Parsingdesignfile'top.v'
Parsingdesignfile'add4.v'
TopLevelModules:
top
NoTimeScalespecified
1of2uniquemodulestogenerate
1of1modulesdone
Invokingloader...
simvgenerationsuccessfullycompleted
下面我们来运行一下这个simv可执行文件,
simv
结果将显示:
ChronologicVCSsimulatorcopyright1991-2001
ContainsSynopsysproprietaryinformation.
Compilerversion6.0;Runtimeversion6.0;Jan815:
372002
0nowataclockposedge,theoperationis:
:
0+0=0andcarryis0
150nowataclockposedge,theoperationis:
:
1+1=2andcarryis0
250nowataclockposedge,theoperationis:
:
2+2=4andcarryis0
350nowataclockposedge,theoperationis:
:
3+3=6andcarryis0
450nowataclockposedge,theoperationis:
:
4+4=8andcarryis0
550nowataclockposedge,theoperationis:
:
5+5=10andcarryis0
650nowataclockposedge,theoperationis:
:
6+6=12andcarryis0
750nowataclockposedge,theoperationis:
:
7+7=14andcarryis0
850nowataclockposedge,theoperationis:
:
8+8=0andcarryis1
950nowataclockposedge,theoperationis:
:
9+9=2andcarryis1
1050nowataclockposedge,theoperationis:
:
10+10=4andcarryis1
1150nowataclockposedge,theoperationis:
:
11+11=6andcarryis1
1250nowataclockposedge,theoperationis:
:
12+12=8andcarryis1
1350nowataclockposedge,theoperationis:
:
13+13=10andcarryis1
1450nowataclockposedge,theoperationis:
:
14+14=12andcarryis1
1550nowataclockposedge,theoperationis:
:
15+15=14andcarryis1
1650nowataclockposedge,theoperationis:
:
0+0=0andcarryis0
1750nowataclockposedge,theoperationis:
:
1+1=2andcarryis0
1850nowataclockposedge,theoperationis:
:
2+2=4andcarryis0
1950nowataclockposedge,theoperationis:
:
3+3=6andcarryis0
2050nowataclockposedge,theoperationis:
:
4+4=8andcarryis0
2150nowataclockposedge,theoperationis:
:
5+5=10andcarryis0
2250nowataclockposedge,theoperationis:
:
6+6=12andcarryis0
2350nowataclockposedge,theoperationis:
:
7+7=14andcarryis0
2450nowataclockposedge,theoperationis:
:
8+8=0andcarryis1
…………(略)
$finishatsimulationtime160001
VCSSimulationReport
Time:
160001
CPUTime:
0.100seconds;Datastructuresize:
0.0Mb
TueJan815:
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+的文件中。
这种图形化的调试系统可以支持三种基本的调试方式:
波形、结构和代码。
这几种方式可以同时地使用。
支持标准Verilog的所有函数、语法、系统调用和编程语言接口(PLI,ProgrammingLanguageInterface)。
Virsim是一个多窗口调试系统,可以允许用户根据需要打开很多个调试窗口。
VirSim可以有两种方式运行:
交互模式(interactivemode)和后处理模式(post-processingmode)。
第一种模式允许实时的控制仿真的进行,允许在模拟的过程中改变寄存器的值或者设置,这些改变会实时地影响到模拟的结果。
第二种模式先输出用户指定选择的信号及其变化过程到一个文件中,然后可以用VirSim来分析这个文件。
该文件是VCD+类型的,VCD+文件是一种二进制的格式,里面记录了VCS模拟的结果,和信号的变化历史等信息。
下面这就是VirSim的主窗口:
VirSim是一个整体集成包,有六个相互有关联关系的工具,主要的工具就是交互环境interactive窗口,还有可以查看模块结构的hierarchy窗口,查看源代码的source窗口,查看逻辑连接的logic窗口,查看波形状况的有waveform窗口,查看寄存器、变量等的register窗口。
通过点击VirSim主窗口的按钮可以打开这几个窗口,也可以在这几个窗口里面通过菜单或者快捷键打开其他的窗口。
2.6.2interactive窗口
下面这个是interactive窗口,可以看到,模拟刚开始先停在0时刻。
在interactive窗口,在这个窗口中,可以进行随时的交互式的控制,随时监控电路的模拟状况。
如果已经写了输入信号序列,如果在testbench中写了$stop,可以执行到这个硬断点。
这里说明几种调试中的断点类型:
硬断点,是调用了verilog的系统函数$stop的这类断点;软断点,是在交互环境中用tbreak命令产生的断点;信号变化断点,是在模拟过程中定义了敏感信号,当这个信号一旦有变化,就会中断模拟过程。
设置合适的断点是调试的技巧和重要的手段。
2.6.3hierarchy窗口
点击主窗口中的hierarchy按钮打开hierarchy窗口,在这个窗口中系统会用不同的颜色来表示设计的层次结构,可以表示出来的有:
模块、任务、函数、有名块、信号、寄存器、线网、输入输出等。
这个窗口可以认为是一个查看器(brower),用户可以用鼠标把需要查看的对象拖动到其他相应的窗口中,后面会讲述到怎么拖动和如何查看。
这个窗口有三个区域,结构查看区域、搜索区域、选择区域,如下图所示。
(1)结构查看区域:
在这里可以查看设计中的各个模块层次结构,选择、拖拉,这个区域提供两种查看方式:
单级(onelevel)和多级(multilevel)。
点击菜单的display可以切换。
在单级方式下可以依次地打开每一级,在此区域中只显示当前的模块下属的子模块。
如下所示,根模块是top,下面只有一个子模块uar,在uar的下面有五个子模块,下面三幅图是依次打开三级模块:
如果在多级方式下,就会在这个区域里面显示多级结构,这样结构化更明显,但是如果设计太复杂,会显得比较杂乱,显示的情况如下所示。
两种方式各有优劣。
在这个窗口中,可以定义一些书签(bookmark),比如在一个模块上点右键,然后选择createbookmark,然后点击
,就可以看到增加了一个刚才所添加的模块的项,这样的方法在模块比较复杂的时候很方便就可以到所要查看的模块了。
(2)搜索区域:
在这个区域里面,可以寻找符合指定样式的信号或者模块名。
搜索的范围有三种,所有(All)、子模块(children)、当前所选模块(selected)。
搜索到的会在搜索区域中显示出来。
可以用*匹配所有字符,用?
可以匹配一个字符
(3)选择区域,在这里,有一个过滤器,可以指定显示哪些的信号或者端口名。
用*可以匹配所有字符,用?
可以匹配一个字符。
这里有个选择框
,S表示的是信号(signal),P表示的是端口(port),表示显示的包含信号还是端口或者都包括。
总之在这个hierarchy窗口中可以查看模块的层次结构,还可以查看到每个层次的寄存器、变量、线、输入输出端口等。
这个窗口中的内容有的可以拖动到其他的窗口中,比如,打开waveform窗口,在hierarchy窗口,把想要查看的变量选中,然后点add或者用鼠标中键拖到waveform窗口中,因为virsims启动的时候电路模拟是停在0时刻的,所以看到waveform现在的值都还是X。
如果把其他的窗口也打开了,比如把模块或者信号拖到source窗口,就会显示包含这个模块或者信号的代码文件;把模块或者信号或者端口拖到logic窗口,就可以显示出连接状况;把信号或者寄存器拖到register窗口中,可以显示出这个信号或者寄存器的值以及他的变化情况。
这样就可以提供了很多种方便而有力的调试和监测方式
2.6.4waveform窗口
这个窗口可以显示每个信号的波形状况。
可以提供指针来指明时刻,可以定义标签来定义断点,用表达式可以指定和跟踪模拟中的事件。
还可以允许用户定义表达式、信号组、断点组。
这几种方式提供了方便又强大的手段来控制仿真模拟。
waveform窗口是基于时间线的,可以查看波形,也可以进行即时模拟,让电路运行到某一个信号发生变化然后暂停,也可以一直运行到预先定义的硬断点。
比如某个选中信号,然后再在波形上点右键按住不放,选nextedge,或者敲击键盘的n键,即运行到这个信号的下一个变化沿。
如果我们点击一下interactive窗口的
,模拟就会一直执行下去,直到硬断点或者以前设置过了的断点处,同时,看到waveform窗口的波形已经出来了。
因为注意到在top.v中没有设置硬断点,所以会一直执行到结束。
可以看到,每一个时钟上升沿的时候,sum=in1+in2,carry为进位输出。
下面介绍几个比较有用的功能,信号分组,标记和断点分组
(1)信号分组,可以把几个信号定义成一个组,方法是选择几个信号,然后选择菜单
edit->Group,可以定义一个新的组名,再点击add就创建了一个新的组。
也可以把信号加入到原来已经存在的的组中,还可以更改组名。
定义好了组之后,在waveform窗口中有一个
按钮,按下这个按钮,就可以看到所有的组,可以很快的查看需要的信号。
(2)标记,marker是一个时间标签,可以定义一个时刻的别名。
在波形图上,在需要加入marker的时刻点击鼠标左键,然后选择菜单edit->Makers,在弹出的对话框中填写一个名字然后点add,这时候可以看到波形图上有一条线,线上是marker名,如图所示:
(3)断点,breakpoint是定义的一套基于表达式搜索的集合,当表达式成立的时候,VirSim就会暂停下来。
断点可以进行分组,这样可以方便的控制模拟的进行。
2.6.5logic窗口
下面看看logic窗口,把信号,或者模块用中键从hierarchy窗口拖到logic窗口中,就可以看的电路的拓扑结构,可以顺着信号线查看他的连接,当模块结构比较复杂的时候,这种方法很方便就可以检查到是否有连接错误。
在这个窗口中,有个很方便的功能,就是信号变化软中断,如果选中了某一个信号线或者寄存器,在模拟开始或者任何一种暂停状态下,点击绿色的
,就会模拟到这个信号的下一个变化时刻,并且暂停下来;倘若没有选择信号,点击红色的
,就模拟运行到当前视图上的任意一个信号发生变化的时候暂停模拟。
两种方式中,waveform窗口也会同步变化。
这样就给了很方便的方式随时监测信号的变化和电路工作方式。
2.6.6source窗口
下面再来打开source窗口,把信号或者模块从hierarchy窗口拖到这里,就马上可以看到相关的源代码了。
VCS还提供单步执行的调试方式,这需要在运行VCS的时候加上选项-line:
vcs–RI–linefilename
下面显示的是source窗口的样子,
这样,在source窗口中,点击黄色的
,就可以单步执行,可以看到,每一步执行的是哪一条语句,同时,如果打开了waveform、logic、register窗口,还可以看到信号也是即时变化的。
在source窗口中,可以直接定义断点,在行的前面点击一下,就会有个红色的圆点,这样很方便就设置了一个断点。
如果设置了断点,可以看到红色的按钮
,按下这个按钮,将执行到断点的位置。
断点可以设置很多个。
2.6.7register窗口
下面打开register窗口,在hierachy中选择几个信号或者寄存器,用中键拖到这个窗口中,上面有个红色的
按钮,按下这个按钮,可以让模拟执行到选定的这些信号中的任意一个发生变化,并且会红色高亮显示出来。
在这个窗口中,还可以自己画一些辅助图形,比如把信号编组然后放在一起,用矩形括起来,并加上一个标签,这在当模块复杂,需要监视的信号很多的情况下是很方便的。
这些辅助也可以被存储下来,下一次模拟的时候可以方便地直接调用出来。
这几个窗口之间的关系是相互关联的,他们的关联关系都是通过
关联起来的