EndThankyou!!!!?如何编写Testbench测试模块的编写完整实例3-串转并及其测试模块Verilog源代码a lways@(posedgeclkornegedgerst)beginif(!rst) counter<=2''b00;elsebeginif(coun ter==2''b11)counter<=2''b00;else counter<=counter+2''b01;endendalways@(pos edgeclkornegedgerst)beginif(!rst)d ata_out<=4''h0;elsebeginif(s2p _en)begindata_out[0]<=data_in ;data_out[3:1]<=data_out[2:0]; endelsedata_out<=4''h0;e ndend?如何编写Testbench测试模块的编写完整实例3-串转并及其测试模块Verilog源代码alw ays@(posedgeclkornegedgerst)beginif(!rst) data_out_valid<=1''b0;else beginif((counter==2''b11)&&s2p_en) data_out_valid<=1''b1;el sedata_out_valid<=1''b0;e ndendendmodule?如何编写Testbench测试模块的编写完整实例3-串转并及其测试模块T estbenchmoduletestbench_sp;regrst1,clk1;regs2p_en1; regdata_in1;wire[3:0]data_out1;wiredata_out_ valid1;initialbeginrst1=1;clk1=0; s2p_en1=1''b0;#5rst1=0;#3rst1=1; #5s2p_en1=1''b1;endalways#50clk1=~clk1;s2ps erial2parallel(.rst(rst1),.clk(clk1),.s2p_en(s2p_en1),.data_in(da ta_in1),.data_out(data_out1),.data_out_valid(data_out_valid1)); 模块的调用?如何编写Testbench测试模块的编写完整实例3-串转并及其测试模块initialbeg in#40data_in1=1;#100data_in1=0;#10 0data_in1=1;#100data_in1=1;#100data_in1= 0;#100data_in1=0;#100data_in1=1;#10 0data_in1=0;#100data_in1=1;#100dat a_in1=1;#100data_in1=1;#100data_in1=1; #100data_in1=0;#100data_in1=1;#100dat a_in1=0;#100data_in1=1;endendmoduleTestbench? 如何编写Testbench测试模块的编写完整实例3-串转并及其测试模块波形仿真图?如何编写Testbench测试模块的编 写完整实例4-3位全加器的设计及其测试模块1位全加器的verilog程序moduleAdder1Bit(a,b,cin,s um,cout);inputa,b,cin;outputsum,cout;ass ignsum=(a^b)^cin;assigncout=(a&cin)|(b&cin)|(a&b); //assign{cout,sum}=a+b+cin;endmodule?如何编写Testbench 测试模块的编写完整实例4-3位全加器的设计及其测试模块3位全加器的verilog程序moduleAdder3Bit(fi rst,second,carry_in,sum_out,carry_ out);input[2:0]first,second;inputcar ry_in;output[2:0]sum_out;outputcarry_out;wire [1:0]car_temp;//通过例化1位加法器形成3位加法器//moduleAdder1Bit(a,b,c in,sum,cout);Adder1BitA1(.a(first[0]),.b(second[0]),.cin(carr y_in),.sum(sum_out[0]),.cout(car_temp[0]));Add er1BitA2(.a(first[1]),.b(second[1]),.cin(car_temp[0]), .sum(sum_out[1]),.cout(car_temp[1]));Adder1BitA3(.a(fir st[2]),.b(second[2]),.cin(car_temp[1]),.sum(sum_o ut[2]),.cout(carry_out));endmodule采用模块例化的方法?如何编写Testbench测试模块 的编写完整实例4-3位全加器的设计及其测试模块Testbench编写预备知识1系统任务及函数使用方式$er>$符号指示这是系统任务和函数,用在测试中常见的系统函数显示/监视信号值($display,$monitor)停止仿真 $stop结束仿真$finish123?如何编写Testbench测试模块的编写完整实例4-3位全加器的设计及其测试 模块Testbench编写预备知识2存储器两个需了解的知识在仿真时模拟内存使用,不能用这种方式来实现芯片中实际的内存(工 艺)!!!!在实际芯片制造时,ROM、RAM都会采用特殊工艺,但是由于仿真目的需要,需定义存储器接口reg[3:0]My mem[31:0]例1parameterADDR_DP=16,WD_SZ=8;reg[WD_SZ-1:0]R ampara[ADDR_DP-1:0]2说明:Rampara是存储器,是16个8位寄存器组来模拟实际的存储单元?如何编写T estbench测试模块的编写完整实例4-3位全加器的设计及其测试模块Testbench编写预备知识2存储器reg[ 7:0]MyMem[31:0]reg[31:0]data_bfferregserialMem[31:0]12 3MyMem是存储器,是32个8位寄存器来模拟实际存储单元,其宽度为8,深度为321 而data_buffer只是32位寄存器2而serialMem是宽度为1深度为32的存 储器3说明举例?如何编写Testbench测试模块的编写完整实例4-3位全加器的设计及其测试模块Te stbench编写预备知识2存储器赋值reg[31:0]xrom[1:0]一个存储器赋值不能在一条赋值语句中完成例 Xrom={{32’hA},{32’h8}};error可以对存储器的一个字赋值Xrom[0]=32‘hA;Xr om[1]=32’h812right12说明?如何编写Testbench测试模块的编写完整实例4-3 位全加器的设计及其测试模块Testbench编写预备知识2存储器赋值reg[31:0]data_bufferreg serialMem[31:0]reg[3:0]Mem[31:0]123举例对data_buf fer[3]进行赋值是否可以?serialMem[3]又是否可以,又是什么含义?Mem[3]呢?12提 问?如何编写Testbench测试模块的编写完整实例4-3位全加器的设计及其测试模块Testbench编写预备知识2存 储器赋值使用系统任务为存储器赋值$readmemb加载二进制值从指定的文本文件中读取数据并加载到存储器reg[31:0 ]Romb[6:0]$readmemb(“ram.dat”,Romb)例如Romb是存储器。文件ram.dat是pc 计算机存在的一个数据文件从文件ram.dat中读取数据并加载到存储器Romb?如何编写Testbench测试模块的编写 完整实例4-3位全加器的设计及其测试模块Testbench代码moduleadder3bit_test;reg [2:0]a,b;regcin;wire[2:0]sum;wir ecout;reg[2:0]counter;reg[2:0]sum_ex ;regcout_ex;reg[10:0]vmem[1:0];Add er3Bitf1(a,b,cin,sum,cout);模块的例化?如何编写Testbench测试模块的编写完整实例4-3 位全加器的设计及其测试模块Testbench代码initialbegin$readm emb("test.vec",vmem);for(counter=0;counter<=1;counter=c ounter+1)begin{a,b,cin,sum_ex,cout_e x}=vmem[counter];#5;if((sum!=sum_ex )||(cout!=cout_ex))$display("mismatchonvect or:%b",vmem[counter]);else$disp lay("nomismatchonvector:%b",vmem[counter]);end endendmodule?如何编写Testbench预备知识1模块例化方法1---位置映射…dclk clrqqb444d0d3DFFDFFREG4moduleREG4(d,clk,clr,q,qb); ......endmodulemoduleDFF(d,clk,rst,q,qb);inputd,clk,rst ;outputq,qb;regq,qb;always@(posedgeclkornegedge rst)beginif(!rst)beginq<=1''b0; qb<=1''b1;endelsebeginq< =d;q<=~d;endendendmodule?如何编写Testben chREG4…dclkclrqqb444d0d3DFFDFFmoduleDFF(d,clk,rst ,q,qb);........endmodulemoduleREG4(d,clk,clr,q,qb);inpu t[3:0]d;inputclk,clr;output[3:0]q,qb;DFF d0(d[0],clk,clr,q[0],qb[0]);DFFd0(d[1],clk,clr,q[1],qb[1]); DFFd0(d[2],clk,clr,q[2],qb[2]);DFFd0(d[3],clk,clr,q[3],qb[3 ]);endmodule位置映射(续)?如何编写Testbench模块例化--位置映射的说明可以将模块的实例通过端 口连接起来构成一个大的系统或原件123在上面的例子中,REG4有模块DFF的四个实例。注意,每个实例都有自己的名字(d0, d1,d2,d3),实例名是每个对象唯一标记,通过标记可以查看每个实例的内部实例中端口的次序与模块定义的次序相同(位置映射)模 块实例化与调用程序不同,每个实例都是模块的一个完全的拷贝,相互独立,并行?如何编写Testbench预备知识1模块例化方法2 ---名称映射…dclkclrqqb444d0d3DFFDFFREG4moduleDFF(d,cl k,rst,q,qb);........endmodulemoduleREG4(d,clk,clr,q,qb); input[3:0]d;inputclk,clr;output[3:0]q,qb;DF Fd0(.d(d[0]),.clk(clk),.rst(clr),q(q[0]),qb(qb[0]));DFFd1(.d (d[1]),.clk(clk),.rst(clr),q(q[1]),qb(qb[1]));DFFd2(.d(d[2]), .clk(clk),.rst(clr),q(q[2]),qb(qb[2]));DFFd3(.d(d[3]),.clk(cl k),.rst(clr),q(q[3]),qb(qb[3]));endmodule名称映射的语法:.内部信号(外部信号) modulecomp(o1,o2,i1,i2);outputo1,o2;input i1,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没有连接endm odule?如何编写Testbench输出端口没有连接时,通常会产生warning没有连接的输入端口初始化值为x.要特别注意 可能会引起芯片内电路逻辑出错!!!预备知识1模块例化方法的注意事项1?如何编写Testbench预备知识1模块例化方法 的注意事项2modulecomp(o1,o2,i1,i2);outputo1,o2;inputi1,i2 ;......endmodulemoduletest;endmodule模块实例化时实例必须有一个名字使 用位置映射时,端口次序与模块的说明相同使用名称映射时,端口次序与位置无关123compc1(Q,R,J,K); //error!!!unnamedinstancecompc2(.i2(K),.o1(Q),.o2(R,.i1(J)); //error!!!unnamedinstance?如何编写Testbench预备知识2简单延时#nmod ulemuxtwo(out,a,b,sl);outputout;inputa,b,sl;reg out;always@(sloraorb)if(!sl)#10out=a; //从a到out延时10个时间单位else#12out=b//从b到out延时12个时间单 位endmodulemoduletb_clock_gen(clk);outputclk;reg clk;parameterCYCLE=20;initialclk=0;always#(C YCLE/2)clk=~clk;endmodule在测试模块中常常使用简单延时(#延时)来施加不同数值的激 励。或在行为模型中模拟实际延时?如何编写Testbench预备知识2简单延时#n1延时#n与连续赋值一起使 用wireout;assign#1out=in1|in2;regout;always@(in1orin2) out=#1in1|in2;regout;always@(posedgeclk)out<=#1i n1|in2;23延时#n与过程块内阻塞赋值一起使用延时#n与过程块内非阻塞赋值一起使用例如,如果在时刻5,信号的in1 值发生变化,则在时刻6(5+1),右端表达式重新运算的结果被赋予左边信号out经过1个单位时间延时,右边表达式新结果被赋给左边目 标注意:在时钟上升沿后发生动作31?如何编写Testbench预备知识3`timescale`timescale1 ns\10ps//Alltimeunitsareinmultiplesof1//nanosecondmodul eMUX2_1(out,a,b,sel);outputout;inputa,b,sel;not#1 not1(sel_,sel);and#2and1(a1,a,sel);and#2and2(b1,b, sel);or#1or1(out,a1,b1);endmodule`timescale说明仿真时间单位及精 度格式:`timescale/如:`timescale1ns/1 00pstime_unit:延时或时间的测量单位`timescale必须在模块之前出现2time_precision: 延时值超出精度要先舍入后使用1?如何编写Testbench预备知识3`timescaletime_precision不能 大于time_unittime_precision和time_unit的表示方法:integerunit_stringInt eger:可以是1,10,100unit_string:可以是s(second),ms(millisecond),us(micr osecnd),ns(nanosecond),ps(picosecond),fs(femtosecond)以上integer和 unit_string可以是任意组合若time_unit与precision_unit差别很大将严重影响仿真速度若说明一个`t imescale1s/1ps,则仿真器在1秒内要扫描其事件序列1012次,而`timescale1s/1ms则只需扫描103次 21233precision的时间单位应尽量与设计的实际精度相同如果没有timescale说明将使用缺省值,一般是n sprecision是仿真器的仿真时间步1233将响应输出与期望值进行比较?如何编写Testbench测试的目的 2路选择器电路被测试器件DUT是一个二选一多路器测试装置(testfixture/testbench)提供测试激励及验证机制 测试模块的三要素1212产生激励(输入信号波形)将输入激励加入到测试模块并收集其输出响应?如何编写Testbenc h测试模块的编写施加激励方式产生激励并加到设计有多种方法,一些常用的方法有:1从一个initial块中施加线性激励2 34从一个循环或always块施加激励记录一个仿真过程,然后在另一个仿真中回放施加激励从一个向量或整数数组施加激励方 法?如何编写Testbench测试模块的编写常见输入波形产生通常需要两类波形具有重复模式的波形,例如 :时钟波形一组确定值的波形,如输入的图像数据12确定值序列产生方法——initial语句阻塞赋值语句外延时1initi albeginReset=0;#100Reset=1;#80Reset =0;#30Reset=1;end产生确定值序列的最佳方法是使用Initial语句210 180100Reset?如何编写Testbench测试模块的编写常见输入波形产生确定值序列产生方法——initial语 句阻塞赋值语句内延时1initialbeginReset=0;Reset=#1001; Reset=#800;Reset=#301;end语句内时延也能够按如下实例产生波形R eset100210180?如何编写Testbench测试模块的编写常见输入波形产生确定值序列产生方法——initi al语句非阻塞赋值语句1如果使用绝对时延,可用带有语句内时延的非阻塞性过程性赋值initialbeginR eset<=0;Reset<=#1001;Reset<=#1800;Reset <=#2101;endReset100210180三种形式波形一致?如何编写Testbench测试模块的 编写常见输入波形产生重复值序列产生方法——always语句2如:常用时钟信号的激励产生方法regclk_A;para meterCLK_PER=10;initialclk_A=0;always#(CLK_PER/2) clk_A=~clk_A;clk_A515102025303540?如何编写Testbench测试模块的 编写完整实例1寄存器变量被综合成触发器或者线的例子`timescale1ns/100psmoduleprocedure _reg(clk,rst,a,c);inputclk,rst,a;outputc;regc; regb;always@(posedgeclkornegedgerst)//always@(rsto ra)if(!rst)b<=0;elseb<=a;always@(p osedgeclkornegedgerst)//always@(rstorb)if(!rst) c<=1;elsec<=b;endmodule源代码?如何编写Testbench测试 模块的编写完整实例1寄存器变量被综合成触发器或者线的例子`timescale1ns/100psmoduletest_p rocedu_reg;regclk_test,rst_test,a_test;wirec_test;pro cedure_regu1(.clk(clk_test),.rst(rst_test),.a(a_test),.c(c_t est));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#50cl k_test=~clk_test;endmodule测试代码?如何编写Testbench测试模块的编写完整实 例1过程块敏感量为@(posedgeclkornegedgerst)时的仿真波形?如何编写Testbench测试模块 的编写完整实例1过程块敏感量为@(posedgeclkornegedgerst)时的电路图?如何编写Testbenc h测试模块的编写完整实例1过程块敏感量为always@(rstora)/(rstorb)时的仿真波形?如何编 写Testbench测试模块的编写完整实例1过程块敏感量为always@(rstora)/(rstorb)时的 电路图?如何编写Testbench测试模块的编写完整实例1问题1:`timescale1ns/100psmodule procedure_reg(clk,rst,a,c);inputclk,rst,a;outputc;re gc;regb;always@(posedgeclkornegedgerst)//alw ays@(rstora)if(!rst)b<=0;elseb<=a; //always@(posedgeclkornegedgerst)always@(rstorb)if( !rst)c<=1;elsec<=b;endmodule?仿真波形是怎么样,电路图又 是怎么样?如何编写Testbench测试模块的编写完整实例1问题1的电路图?如何编写Testbench测试模块的编写 完整实例1问题2:`timescale1ns/100psmoduleprocedure_reg(clk,rst,a,c );inputclk,rst,a;outputc;regc;regb;//al ways@(posedgeclkornegedgerst)always@(rstora)if(!rst )b<=0;elseb<=a;always@(posedgeclkorneg edgerst)//always@(rstorb)if(!rst)c<=1;else c<=b;endmodule?仿真波形是怎么样,电路图又是怎么样?如何编写Testbench测试模块的 编写完整实例1问题2的电路图?如何编写Testbench测试模块的编写完整实例2-计数器及其测试模块设计要求用ver ilogHDL语言实现16进制计数器,写出其测试模块画出用D触发器实现的16进制计数器的电路原理图12?如何编写Te stbench测试模块的编写完整实例2-计数器及其测试模块16进制计数器verilog的实现modulecounter (count,clk,rst,initial_value);inputclk,rst; input[3:0]initial_value;output[3:0]count;reg [3:0]count;always@(posedgeclkorposedgerst) beginif(rst)count<=initial_valu e;elsebeginif(co unt==4''b1111)count<=4''b0000; elsecount<=count+4''b0001; endendendmodulealways过程块条件的两分支?如何编写Testbench测试模块的编写完整实例2-计数器及其测试模块moduletest_counter;regclk,rst;reg[3:0]initial_value;counterdut(count,clk,rst,initial_value);//clockgeneratorinitialclk=0;always#50clk=~clk;//initial_valuegeneratorinitialinitial_value=4''b1010;//rstgeneratorinitialbeginrst=0;#5rst=1;#4rst=0;#50000$stop;endendmodule16进制计数器测试模块testbench?如何编写Testbench测试模块的编写完整实例2-计数器及其测试模块RTL视图?如何编写Testbench测试模块的编写完整实例3-串转并及其测试模块Verilog源代码modules2p(rst,clk,s2p_en,data_in,data_out,data_out_valid);//端口定义inputrst,clk,s2p_en,data_in;output[3:0]data_out;outputdata_out_valid;//数据类型声明reg[3:0]data_out;regdata_out_valid;reg[1:0]counter;未完待续 |
|