如何编写testbench的总结.doc

上传人:j****9 文档编号:3195969 上传时间:2019-05-25 格式:DOC 页数:8 大小:24.45KB
下载 相关 举报
如何编写testbench的总结.doc_第1页
第1页 / 共8页
如何编写testbench的总结.doc_第2页
第2页 / 共8页
如何编写testbench的总结.doc_第3页
第3页 / 共8页
如何编写testbench的总结.doc_第4页
第4页 / 共8页
如何编写testbench的总结.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、如何编写 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_

2、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从文本文件中读取

3、和写入向量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 是一个文件描述,需要定义为

4、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 文件系统自动搜索使用库文件或库目录,只编译需要的模块而不必全部编译3 VerilogTestbench 信号记录的系统任务:1).SHM 数据库可以记录在设计仿

5、真过程中信号的变化. 它只在 probes 有效的时间内记录你setprobeon 的信号的变化 .ex).$shm_open(“waves.shm“);/打开波形数据库$shm_probe(top,“AS“);/setprobeon“top“,第二个参数:A-signalsofthespecificscropeS-Portsofthespecifiedscopeandbelow,excludinglibrarycellsC-Portsofthespecifiedscopeandbelow,includinglibrarycellsAS-Signalsofthespecifiedscopean

6、dbelow,excludinglibrarycellsAC-Signalsofthespecifiedscopeandbelow,includinglibrarycells还有一个 M,表示当前 scope 的 memories,可以跟上面的结合使用 ,“AM“AMS“AMC“什么都不加表示当前 scope 的 ports;$shm_close/关闭数据库2).VCD 数据库也可以记录在设计仿真过程中信号的变化. 它只记录你选择的信号的变化.ex).$dumpfile(“filename“);/打开数据库$dumpvars(1,top.u1);/scope=top.u1,depth=1第一个

7、参数表示深度, 为 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.sete

8、nvLD_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“, 否则没

9、有读写权限在记录信号或者波形时需要指出被记录信号的路径,如:tb.module.u1.clk.关于信号记录的系统任务的说明:在 testbench 中使用信号记录的系统任务,就可以将自己需要的部分的结果以及波形文件记录下来(可采用 sigalscan 工具查看) ,适用于对较大的系统进行仿真,速度快,优于全局仿真。使用简单,在 testbench 中添加:initialbegin$shm_open(“waves.shm“);$shm_probe(“要记录信号的路径“, ”AS“) ;10000$shm_close;即可。4.ncverilog 编译的顺序 :ncverilogfile1file

10、2.有时候这些文件存在依存关系,如在 file2 中要用到在 file1 中定义的变量,这时候就要注意其编译的顺序是从后到前,就先编译 file2 然后才是 file2.5.信号的强制赋值 force首先, force 语句只能在过程语句中出现,即要在 initial 或者 always 中间. 去除 force 用release 语句.initialbeginforcesig1=1b1;.;releasesig1;endforce 可以对 wire 赋值,这时整个 net 都被赋值; 也可以对 reg 赋值.6 加载测试向量时,避免在时钟的上下沿变化为了模拟真实器件的行为,加载测试向量时,避

11、免在时钟的上下沿变化,而是在时钟的上升沿延时一个时间单位后,加载的测试向量发生变化。如: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 之下三层

12、的所有数据信号(包含 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,“%for

13、mat_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.由文

14、件设定存储器初值$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

15、 中的最小延时 min,典型延迟 typ,最大延时 max 调整延迟参数/generate 语句,在 Verilog-2001 中定义.用于表达重复性动作/必须事先声明 genvar 类型变量作为 generate 循环的指标eg:genvari;generatefor(i=0;i1;default:shiftreg=shiftreg;endcaseendendmoduleTestbench:moduletestbench;/declaretestbenchnameregclock;regload;regreset;/declaration of signalswire4:0shiftreg;

16、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

17、 stimulus.reset=1;data=5b00000;load=0;sel=2b00;#200reset=0;load=1;#200data=5b00001;#100sel=2b01;load=0;#200sel=2b10;#1000$stop;endinitialbegin/this process block pipes the ASCII results to the/terminal or text editor$timeformat(-9,1,“ns“,12);$display(“TimeClkRstLdSftRgDataSel“);$monitor(“%t%b%b%b%b%b%b“,$realtime,clock,reset,load,shiftreg,data,sel);endendmodule

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。