如何编写testbench的总结.doc_第1页
如何编写testbench的总结.doc_第2页
如何编写testbench的总结.doc_第3页
如何编写testbench的总结.doc_第4页
如何编写testbench的总结.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何编写testbench的总结(非常实用的总结)1激励的设置相应于被测试模块的输入激励设置为reg型,输出相应设置为wire类型,双向端口inout在测试中需要进行处理。方法1:为双向端口设置中间变量inout_reg作为该inout的输出寄存,inout口在testbench中要定义为wire型变量,然后用输出使能控制传输方向。eg:inout0:0bi_dir_port;wire0:0bi_dir_port;reg0:0bi_dir_port_reg;regbi_dir_port_oe;assignbi_dir_port=bi_dir_port_oe?bi_dir_port_reg:1bz;用bi_dir_port_oe控制端口数据方向,并利用中间变量寄存器改变其值。等于两个模块之间用inout双向口互连。往端口写(就是往模块里面输入)方法2:使用force和release语句,这种方法不能准确反映双向端口的信号变化,但这种方法可以反映块内信号的变化。具体如示:moduletest();wire data_inout;reg data_reg;reg link;#xx;/延时forcedata_inout=1bx;/强制作为输入端口.#xx;release data_inout;/释放输入端口endmodule从文本文件中读取和写入向量1)读取文本文件:用$readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh用于读取十六进制文件。例如:reg7:0mem1:256/a8-bit,256-word定义存储器meminitial$readmemh(mem.data,mem)/ 将.dat文件读入寄存器mem中initial$readmemh(mem.data,mem,128,1)/ 参数为寄存器加载数据的地址始终2)输出文本文件:打开输出文件用?$fopen例如:integerout_file;/out_file是一个文件描述,需要定义为integer类型out_file=$fopen(cpu.data);/cpu.data是需要打开的文件,也就是最终的输出文本设计中的信号值可以通过$fmonitor,$fdisplay,2.Verilog和Ncverilog命令使用库文件或库目录ex).ncverilog-frun.f-vlib/lib.v-ylib2+libext+.v/一般编译文件在run.f中, 库文件在lib.v中,lib2目录中的.v文件系统自动搜索使用库文件或库目录,只编译需要的模块而不必全部编译3VerilogTestbench信号记录的系统任务:1).SHM数据库可以记录在设计仿真过程中信号的变化. 它只在probes有效的时间内记录你setprobeon的信号的变化.ex).$shm_open(waves.shm);/打开波形数据库$shm_probe(top,AS);/setprobeontop,第二个参数:A-signalsofthespecificscropeS-Portsofthespecifiedscopeandbelow,excludinglibrarycellsC-Portsofthespecifiedscopeandbelow,includinglibrarycellsAS-Signalsofthespecifiedscopeandbelow,excludinglibrarycellsAC-Signalsofthespecifiedscopeandbelow,includinglibrarycells还有一个M,表示当前scope的memories,可以跟上面的结合使用,AMAMSAMC什么都不加表示当前scope的ports;$shm_close/关闭数据库2).VCD数据库也可以记录在设计仿真过程中信号的变化. 它只记录你选择的信号的变化.ex).$dumpfile(filename);/打开数据库$dumpvars(1,top.u1);/scope=top.u1,depth=1第一个参数表示深度, 为0时记录所有深度; 第二个参数表示scope,省略时表当前的scope.$dumpvars;/depth=allscope=all$dumpvars(0);/depth=allscope=current$dumpvars(1,top.u1);/depth=1scope=top.u1$dumpoff/暂停记录数据改变,信号变化不写入库文件中$dumpon/重新恢复记录3).Debussyfsdb数据库也可以记录信号的变化,它的优势是可以跟debussy结合,方便调试.如果要在ncverilog仿真时,记录信号, 首先要设置debussy:a.setenvLD_LIBRARY_PATH LD_LIBRARY_PATH(pathfordebpli.sofile(/share/PLI/nc_xl/nc_loadpli1)b.whileinvokingncverilogusethe+ncloadpli1option.ncverilog-frun.f+debug+ncloadpli1=debpli:deb_PLIPtrfsdb数据库文件的记录方法,是使用$fsdbDumpfile和$fsdbDumpvars系统函数,使用方法参见VCD注意: 在用ncverilog的时候,为了正确地记录波形,要使用参数:+access+rw, 否则没有读写权限在记录信号或者波形时需要指出被记录信号的路径,如:tb.module.u1.clk.关于信号记录的系统任务的说明:在testbench中使用信号记录的系统任务,就可以将自己需要的部分的结果以及波形文件记录下来(可采用sigalscan工具查看),适用于对较大的系统进行仿真,速度快,优于全局仿真。使用简单,在testbench中添加:initialbegin$shm_open(waves.shm);$shm_probe(要记录信号的路径“,”AS“);10000$shm_close;即可。4.ncverilog编译的顺序:ncverilogfile1file2.有时候这些文件存在依存关系,如在file2中要用到在file1中定义的变量,这时候就要注意其编译的顺序是从后到前,就先编译file2然后才是file2.5.信号的强制赋值force首先, force语句只能在过程语句中出现,即要在initial 或者always 中间. 去除force 用release 语句.initialbeginforcesig1=1b1;.;releasesig1;endforce可以对wire赋值,这时整个net都被赋值; 也可以对reg赋值.6加载测试向量时,避免在时钟的上下沿变化为了模拟真实器件的行为,加载测试向量时,避免在时钟的上下沿变化,而是在时钟的上升沿延时一个时间单位后,加载的测试向量发生变化。如:assign#5c=ab(posedgeclk)#(0.1*cycle)A=1;*/testbench的波形输出moduletop;.initialbegin$dumpfile(./top.vcd);/存储波形的文件名和路径,一般是.vcd格式.$dumpvars(1,top);/存储top这一层的所有信号数据$dumpvars(2,top.u1);/存储top.u1之下两层的所有数据信号(包含top.u1这一层)$dumpvars(3,top.u2);/存储top.u2之下三层的所有数据信号(包含top.u2这一层)$dumpvars(0,top.u3);/存储top.u3之下所有层的所有数据信号endendmodule/产生随机数,seed是种子$random(seed);ex:dinY)=0.2;(B*-Y)=0.3;(C*-Y)=0.1;endspecifyendmodule/时间刻度timescale 单位时间/时间精确度/文件I/O1.打开文件integerfile_id;file_id=fopen(file_path/file_name);2.写入文件/$fmonitor只要有变化就一直记录$fmonitor(file_id,%format_char,parameter);eg fmonitor(file_id,%m:%tin1=%do1=%h,$time,in1,o1);/$fwrite需要触发条件才记录$fwrite(file_id,%format_char,parameter);/$fdisplay需要触发条件才记录$fdisplay(file_id,%format_char,parameter);$fstrobe();3.读取文件integerfile_id;file_id=$fread(file_path/file_name,r);4.关闭文件$fclose(fjile_id);5.由文件设定存储器初值$readmemh(file_name,memory_name);/初始化数据为十六进制$readmemb(file_name,memory_name);/初始化数据为二进制/仿真控制$finish(parameter);/parameter=0,1,2$stop(parameter);/读入SDF文件$sdf_annotate(sdf_file_name,module_instance,scale_factors);/module_instance:sdf文件所对应的instance名./scale_factors:针对timmingdelay中的最小延时min,典型延迟typ,最大延时max调整延迟参数/generate语句,在Verilog-2001中定义.用于表达重复性动作/必须事先声明genvar类型变量作为generate循环的指标eg:genvari;generatefor(i=0;i4;i=i+1)beginassign=din=i%2;endendgenerate/资源共享always(AorBorCorD)sum=sel?(A+B) C+D);/上面例子使用两个加法器和一个MUX,面积大/下面例子使用一个加法器和两个MUX,面积小always(AorBorCorD)begintmp1=sel?A:C;tmp2=sel?B ;endalways(tmp1ortmp2)sum=tmp1+tmp2;*模板:moduletestbench;/定义一个没有输入输出的modulereg/将DUT的输入定义为reg类型wire/将DUT的输出定义为wire类型/在这里例化DUTinitialbegin/在这里添加激励(可以有多个这样的结构)endalways/通常在这里定义时钟信号initial/在这里添加比较语句(可选)endinitial/在这里添加输出语句(在屏幕上显示仿真结果)endendmodule一下介绍一些书写Testbench的技巧:1.如果激励中有一些重复的项目,可以考虑将这些语句编写成一个task,这样会给书写和仿真带来很大方便。例如,一个存储器的testbench的激励可以包含write,read等task。2.如果DUT中包含双向信号(inout),在编写testbench时要注意。需要一个reg变量来表示其输入,还需要一个wire变量表示其输出。3.如果initial块语句过于复杂,可以考虑将其分为互补相干的几个部分,用数个initial块来描述。在仿真时,这些initial块会并发运行。这样方便阅读和修改。4.每个testbench都最好包含$stop语句,用以指明仿真何时结束。最后提供一个简单的示例(转自Xilinx文档):DUT:moduleshift_reg(clock,reset,load,sel,data,shiftreg);inputclock;inputreset;inputload;input1:0sel;input4:0data;output4:0shiftreg;reg4:0shiftreg;always(posedgeclock)beginif(reset)shiftreg=0;elseif(load)shiftreg=data;elsecase(sel)2b00:shiftreg=shiftreg;2b01:shiftreg=shiftreg1;default:shiftreg=shiftreg;endcaseendendmoduleTestbench:moduletestbench;/declaretestbenchnameregclock;regload;regreset;/declaration of signalswire4:0shiftreg;reg4:0data;reg1:0sel;/instantiation of the shift_reg design belowshift_regdut(.clock(clock),.load(load),.reset(reset),.shiftreg(shiftreg),.data(data),.sel(sel);/this process block sets up the free running clockinitialbeginclock=0;forever#50clock=clock;endinitialbegin/this process block specifies the stimulus.reset=1;data=5b00000;load=0;sel=2b00;#200reset=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论