如何编写TestbenchPPT课件_第1页
如何编写TestbenchPPT课件_第2页
如何编写TestbenchPPT课件_第3页
如何编写TestbenchPPT课件_第4页
如何编写TestbenchPPT课件_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

.,1,预备知识1,模块例化方法1-位置映射,REG4,moduleREG4(d,clk,clr,q,qb);.endmodule,moduleDFF(d,clk,rst,q,qb);inputd,clk,rst;outputq,qb;regq,qb;always(posedgeclkornegedgerst)beginif(!rst)beginq=1b0;qb=1b1;endelsebeginq=d;q=d;endendendmodule,.,2,REG4,moduleDFF(d,clk,rst,q,qb);.endmodulemoduleREG4(d,clk,clr,q,qb);input3:0d;inputclk,clr;output3:0q,qb;DFFd0(d0,clk,clr,q0,qb0);DFFd0(d1,clk,clr,q1,qb1);DFFd0(d2,clk,clr,q2,qb2);DFFd0(d3,clk,clr,q3,qb3);endmodule,位置映射(续),.,3,模块例化-位置映射的说明,可以将模块的实例通过端口连接起来构成一个大的系统或原件,1,2,3,在上面的例子中,REG4有模块DFF的四个实例。注意,每个实例都有自己的名字(d0,d1,d2,d3),实例名是每个对象唯一标记,通过标记可以查看每个实例的内部,实例中端口的次序与模块定义的次序相同(位置映射)模块实例化与调用程序不同,每个实例都是模块的一个完全的拷贝,相互独立,并行,.,4,预备知识1,模块例化方法2-名称映射,d,clk,clr,q,qb,4,4,4,d0,d3,DFF,DFF,REG4,moduleDFF(d,clk,rst,q,qb);.endmodulemoduleREG4(d,clk,clr,q,qb);input3:0d;inputclk,clr;output3:0q,qb;DFFd0(.d(d0),.clk(clk),.rst(clr),q(q0),qb(qb0);DFFd1(.d(d1),.clk(clk),.rst(clr),q(q1),qb(qb1);DFFd2(.d(d2),.clk(clk),.rst(clr),q(q2),qb(qb2);DFFd3(.d(d3),.clk(clk),.rst(clr),q(q3),qb(qb3);endmodule,名称映射的语法:.内部信号(外部信号),.,5,modulecomp(o1,o2,i1,i2);outputo1,o2;inputi1,i2;.endmodulemoduletest;compc1(Q,R,J,K);/位置映射compc2(.i2(K),.o1(Q),.o2(R,.i1(J);/名称映射compc3(Q,J,K);/输出端口o2没有连接compc4(.i1(J),.o1(Q);/输入端口i2,输出端口o2没有连接endmodule,输出端口没有连接时,通常会产生warning,没有连接的输入端口初始化值为x.要特别注意可能会引起芯片内电路逻辑出错!,预备知识1,模块例化方法的注意事项1,.,6,预备知识1,模块例化方法的注意事项2,modulecomp(o1,o2,i1,i2);outputo1,o2;inputi1,i2;.endmodulemoduletest;endmodule,模块实例化时实例必须有一个名字,使用位置映射时,端口次序与模块的说明相同,使用名称映射时,端口次序与位置无关,1,2,3,compc1(Q,R,J,K);/error!unnamedinstancecompc2(.i2(K),.o1(Q),.o2(R,.i1(J);/error!unnamedinstance,.,7,预备知识2,简单延时#n,modulemuxtwo(out,a,b,sl);outputout;inputa,b,sl;regout;always(sloraorb)if(!sl)#10out=a;/从a到out延时10个时间单位else#12out=b/从b到out延时12个时间单位endmodule,moduletb_clock_gen(clk);outputclk;regclk;parameterCYCLE=20;initialclk=0;always#(CYCLE/2)clk=clk;endmodule,在测试模块中常常使用简单延时(#延时)来施加不同数值的激励。或在行为模型中模拟实际延时,.,8,预备知识2,简单延时#n,延时#n与连续赋值一起使用,wireout;assign#1out=in1|in2;,regout;always(in1orin2)out=#1in1|in2;,regout;always(posedgeclk)out=#1in1|in2;,延时#n与过程块内阻塞赋值一起使用,延时#n与过程块内非阻塞赋值一起使用,例如,如果在时刻5,信号的in1值发生变化,则在时刻6(5+1),右端表达式重新运算的结果被赋予左边信号out,经过1个单位时间延时,右边表达式新结果被赋给左边目标,注意:在时钟上升沿后发生动作,.,9,预备知识3,timescale,timescale1ns10ps/Alltimeunitsareinmultiplesof1/nanosecondmoduleMUX2_1(out,a,b,sel);outputout;inputa,b,sel;not#1not1(sel_,sel);and#2and1(a1,a,sel);and#2and2(b1,b,sel);or#1or1(out,a1,b1);endmodule,timescale说明仿真时间单位及精度,格式:timescale/,如:timescale1ns/100ps,time_unit:延时或时间的测量单位,timescale必须在模块之前出现,time_precision:延时值超出精度要先舍入后使用,.,10,预备知识3,timescale,time_precision不能大于time_unit,time_precision和time_unit的表示方法:integerunit_string,Integer:可以是1,10,100,unit_string:可以是s(second),ms(millisecond),us(microsecnd),ns(nanosecond),ps(picosecond),fs(femtosecond),以上integer和unit_string可以是任意组合,若time_unit与precision_unit差别很大将严重影响仿真速度,若说明一个timescale1s/1ps,则仿真器在1秒内要扫描其事件序列1012次,而timescale1s/1ms则只需扫描103次,1,2,3,precision的时间单位应尽量与设计的实际精度相同,如果没有timescale说明将使用缺省值,一般是ns,precision是仿真器的仿真时间步,1,2,3,.,11,将响应输出与期望值进行比较,测试的目的,2路选择器电路,被测试器件DUT是一个二选一多路器,测试装置(testfixture/testbench)提供测试激励及验证机制,测试模块的三要素,1,2,产生激励(输入信号波形),将输入激励加入到测试模块并收集其输出响应,.,12,测试模块的编写,施加激励方式,产生激励并加到设计有多种方法,一些常用的方法有:,1,从一个initial块中施加线性激励,从一个循环或always块施加激励,记录一个仿真过程,然后在另一个仿真中回放施加激励,从一个向量或整数数组施加激励,方法,.,13,测试模块的编写,常见输入波形产生,通常需要两类波形,具有重复模式的波形,例如:时钟波形,一组确定值的波形,如输入的图像数据,1,2,确定值序列产生方法initial语句阻塞赋值语句外延时,1,initialbeginReset=0;#100Reset=1;#80Reset=0;#30Reset=1;end,产生确定值序列的最佳方法是使用Initial语句,210,180,100,Reset,.,14,测试模块的编写,常见输入波形产生,确定值序列产生方法initial语句阻塞赋值语句内延时,1,initialbeginReset=0;Reset=#1001;Reset=#800;Reset=#301;end,语句内时延也能够按如下实例产生波形,.,15,测试模块的编写,常见输入波形产生,确定值序列产生方法initial语句非阻塞赋值语句,1,如果使用绝对时延,可用带有语句内时延的非阻塞性过程性赋值,initialbeginReset=0;Reset=#1001;Reset=#1800;Reset=#2101;end,三种形式波形一致,.,16,测试模块的编写,常见输入波形产生,重复值序列产生方法always语句,2,如:常用时钟信号的激励产生方法,regclk_A;parameterCLK_PER=10;initialclk_A=0;always#(CLK_PER/2)clk_A=clk_A;,.,17,timescale1ns/100psmoduleprocedure_reg(clk,rst,a,c);inputclk,rst,a;outputc;regc;regb;always(posedgeclkornegedgerst)/always(rstora)if(!rst)b=0;elseb=a;always(posedgeclkornegedgerst)/always(rstorb)if(!rst)c=1;elsec=b;endmodule,源代码,.,18,timescale1ns/100psmoduletest_procedu_reg;regclk_test,rst_test,a_test;wirec_test;procedure_regu1(.clk(clk_test),.rst(rst_test),.a(a_test),.c(c_test);initialbeginrst_test=1;clk_test=0;#10rst_test=0;#10rst_test=1;#100a_test=0;#200a_test=1;#100a_test=0;#200a_test=1;#100a_test=0;endalways#50clk_test=clk_test;endmodule,测试代码,.,19,测试模块的编写,完整实例1,过程块敏感量为(posedgeclkornegedgerst)时的仿真波形,.,20,.,21,.,22,.,23,问题1:,timescale1ns/100psmoduleprocedure_reg(clk,rst,a,c);inputclk,rst,a;outputc;regc;regb;always(posedgeclkornegedgerst)/always(rstora)if(!rst)b=0;elseb=a;/always(posedgeclkornegedgerst)always(rstorb)if(!rst)c=1;elsec=b;endmodule,?仿真波形是怎么样,电路图又是怎么样,.,24,测试模块的编写,完整实例1,问题1的电路图,.,25,问题2:,timescale1ns/100psmoduleprocedure_reg(clk,rst,a,c);inputclk,rst,a;outputc;regc;regb;/always(posedgeclkornegedgerst)always(rstora)if(!rst)b=0;elseb=a;always(posedgeclkornegedgerst)/always(rstorb)if(!rst)c=1;elsec=b;endmodule,?仿真波形是怎么样,电路图又是怎么样,.,26,问题2的电路图,.,27,设计要求,用verilogHDL语言实现16进制计数器,写出其测试模块,画出用D触发器实现的16进制计数器的电路原理图,1,2,.,28,16进制计数器verilog的实现,modulecounter(count,clk,rst,initial_value);inputclk,rst;input3:0initial_value;output3:0count;reg3:0count;always(posedgeclkorposedgerst)beginif(rst)count=initial_value;elsebeginif(count=4b1111)count=4b0000;elsecount=count+4b0001;endendendmodule,always过程块,条件的两分支,.,29,测试模块的编写,完整实例2-计数器及其测试模块,moduletest_counter;regclk,rst;reg3:0initial_value;counterdut(count,clk,rst,initial_value);/clockgeneratorinitialclk=0;always#50clk=clk;/initial_valuegeneratorinitialinitial_value=4b1010;/rstgeneratorinitialbeginrst=0;#5rst=1;#4rst=0;#50000$stop;endendmodule,16进制计数器测试模块testbench,.,30,RTL视图,.,31,Verilog源代码,modules2p(rst,clk,s2p_en,data_in,data_out,data_out_valid);/端口定义inputrst,clk,s2p_en,data_in;output3:0data_out;outputdata_out_valid;/数据类型声明reg3:0data_out;regdata_out_valid;reg1:0counter;,未完待续,.,32,Verilog源代码,always(posedgeclkornegedgerst)beginif(!rst)counter=2b00;elsebeginif(counter=2b11)counter=2b00;elsecounter=counter+2b01;endend,always(posedgeclkornegedgerst)beginif(!rst)data_out=4h0;elsebeginif(s2p_en)begindata_out0=data_in;data_out3:1=data_out2:0;endelsedata_out=4h0;endend,.,33,Verilog源代码,always(posedgeclkornegedgerst)beginif(!rst)data_out_valid=1b0;elsebeginif(counter=2b11)endendendmodule,.,34,测试模块的编写,完整实例3-串转并及其测试模块,Testbench,moduletestbench_sp;regrst1,clk1;regs2p_en1;regdata_in1;wire3:0data_out1;wiredata_out_valid1;initialbeginrst1=1;clk1=0;s2p_en1=1b0;#5rst1=0;#3rst1=1;#5s2p_en1=1b1;end,always#50clk1=clk1;s2pserial2parallel(.rst(rst1),.clk(clk1),.s2p_en(s2p_en1),.data_in(data_in1),.data_out(data_out1),.data_out_valid(data_out_valid1);,模块的调用,.,35,initialbegin#40data_in1=1;#100data_in1=0;#100data_in1=1;#100data_in1=1;#100data_in1=0;#100data_in1=0;#100data_in1=1;#100data_in1=0;,#100data_in1=1;#100data_in1=1;#100data_in1=1;#100data_in1=1;#100data_in1=0;#100data_in1=1;#100data_in1=0;#100data_in1=1;endendmodule,Testbench,.,36,波形仿真图,.,37,moduleAdder1Bit(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;assignsum=(ab)cin;assigncout=(aendmodule,.,38,moduleAdder3Bit(first,second,carry_in,sum_out,carry_out);input2:0first,second;inputcarry_in;output2:0sum_out;outputcarry_out;wire1:0car_temp;/通过例化1位加法器形成3位加法器/moduleAdder1Bit(a,b,cin,sum,cout);Adder1BitA1(.a(first0),.b(second0),.cin(carry_in),.sum(sum_out0),.cout(car_temp0);Adder1BitA2(.a(first1),.b(second1),.cin(car_temp0),.sum(sum_out1),.cout(car_temp1);Adder1BitA3(.a(first2),.b(second2),.cin(car_temp1),.sum(sum_out2),.cout(carry_out);endmodule,采用模块例化的方法,.,39,预备知识1,系统任务及函数,使用方式$,$符号指示这是系统任务和函数,用在测试中,常见的系统函数,显示/监视信号值($display,$monitor),停止仿真$stop,结束仿真$finish,1,2,3,.,40,预备知识2,存储器,两个需了解的知识,在仿真时模拟内存使用,不能用这种方式来实现芯片中实际的内存(工艺)!,在实际芯片制造时,ROM、RAM都会采用特殊工艺,但是由于仿真目的需要,需定义存储器接口,reg3:0Mymem31:0,例1,parameterADDR_DP=16,WD_SZ=8;regWD_SZ-1:0RamparaADDR_DP-1:0,2,说明:Rampara是存储器,是16个8位寄存器组来模拟实际的存储单元,.,41,reg7:0MyMem31:0,reg31:0data_bffer,regserialMem31:0,1,2,3,MyMem是存储器,是32个8位寄存器来模拟实际存储单元,其宽度为8,深度为32,1,而data_buffer只是32位寄存器,2,而serialMem是宽度为1深度为32的存储器,3,说明,举例,.,42,reg31:0xrom1:0,一个存储器赋值不能在一条赋值语句中完成,例,Xrom=32hA,32h8;,error,可以对存储器的一个字赋值,Xrom0=32hA;,Xrom1=32h8,1,2,right,1,2,说明,.,43,

温馨提示

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

评论

0/150

提交评论