第6章Verilog HDL测试模块_第1页
第6章Verilog HDL测试模块_第2页
第6章Verilog HDL测试模块_第3页
第6章Verilog HDL测试模块_第4页
第6章Verilog HDL测试模块_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 Verilog HDL测试模块Verilog HDL数字系统设计及仿真Verilog HDL数字系统设计及仿真数字系统设计及仿真2测试模块范例测试模块范例module tb_add4; /顶层模块顶层模块wire COUT;wire 3:0 S;reg CIN;reg 3:0X,Y; /变量声明变量声明initialbegin X=4b0000;Y=4b0000;CIN=1; #10 X=4b0000;Y=4b1110;CIN=1; #10 X=4b0101;Y=4b1010;CIN=1; #10 X=4b0000;Y=4b0000;CIN=0; #10 X=4b0000;Y=4b11

2、10;CIN=0; #10 X=4b0101;Y=4b1010;CIN=0; /产生信号产生信号 #10 $stop; /仿真控制仿真控制endinitialbegin $monitor(x=%b,y=%b,cin=%b,sum=%b,cout=%b,X,Y,CIN,S,COUT); /监视任务监视任务endadd4 my_add4(S,COUT,CIN,X,Y); /待测模块的模块实例化待测模块的模块实例化endmoduleVerilog HDL数字系统设计及仿真数字系统设计及仿真3测试模块结构测试模块结构模块实例化、信号的产生和控制、响模块实例化、信号的产生和控制、响应监控三个部分应监控三

3、个部分 Verilog HDL数字系统设计及仿真数字系统设计及仿真4时钟信号时钟信号 占空比占空比50%reg clock1;initial clock1=0;always #5 clock1=clock1;reg clock2;always begin #5 clock2=0; #5 clock2=1;endVerilog HDL数字系统设计及仿真数字系统设计及仿真5占空比非占空比非50%reg clock3;always begin #15 clock3=0; #5 clock3=1;endVerilog HDL数字系统设计及仿真数字系统设计及仿真6使用参数使用参数reg clock6;p

4、arameter half_cycle=10alwaysbegin #half_cycle clock6=0; #half_cycle clock6=1;endVerilog HDL数字系统设计及仿真数字系统设计及仿真7整型和寄存器型的区别整型和寄存器型的区别timescale 1ns/1nsreg clock8;parameter cycle=15;alwaysbegin #(cycle/2) clock8=0; #(cycle/2) clock8=1;endalwaysbegin #(cycle/2.0) clock9=0; #(cycle/2.0) clock9=1;endVerilog

5、 HDL数字系统设计及仿真数字系统设计及仿真8复位信号复位信号 最简单的形式最简单的形式reg reset1;initialbegin reset1=1b0; #20 reset1=1b1; #40 reset1=1b0;endVerilog HDL数字系统设计及仿真数字系统设计及仿真9检测时钟边沿的复位信号检测时钟边沿的复位信号reg reset2;initialbegin reset2=1b0; wait(clock=1b1); (negedge clock); reset2=1b1; repeat (2) (negedge clock); reset2=1b0;endVerilog HD

6、L数字系统设计及仿真数字系统设计及仿真10测试向量测试向量 逐个给出的形式逐个给出的形式initialbegin X=4b0000;Y=4b0000;CIN=1; #10 X=4b0000;Y=4b1110;CIN=1; #10 X=4b0101;Y=4b1010;CIN=1; #10 X=4b0000;Y=4b0000;CIN=0; #10 X=4b0000;Y=4b1110;CIN=0; #10 X=4b0101;Y=4b1010;CIN=0; #10 ; endVerilog HDL数字系统设计及仿真数字系统设计及仿真11随机数的形式随机数的形式integer seed1,seed2,s

7、eed3;initial begin seed1=1;seed2=2;seed3=3; /种子初始化种子初始化endalways begin #10 X=($random(seed1)/16); Y=($random(seed2)/16); CIN=($random(seed3)/2);endVerilog HDL数字系统设计及仿真数字系统设计及仿真12使用使用$readmemb 的形式的形式reg 8:0 mem0:4; /定义存储器定义存储器integer i=0;initial$readmemb(vec.txt,mem); /读入数值读入数值alwaysbegin #10 X,Y,CIN

8、=memi; /memi进行赋值进行赋值 i=i+1; /i要变化要变化end001000011010100100011101001010010101101010111Verilog HDL数字系统设计及仿真数字系统设计及仿真13响应监控响应监控 构造一组黄金向量构造一组黄金向量xxxxxxxxxxxxxx /第第1行行0000000000000001001000111010100011101011110000001010011011001010101111 /第第10行行01100000001100 /第第11行行01000011110000initial$readmemb(vec.txt,

9、mem); alwaysbegin #10 temp=memi; X,Y,CIN=temp13:5; S_ref,COUT_ref=temp4:0; i=i+1;endVerilog HDL数字系统设计及仿真数字系统设计及仿真14结果相符时结果相符时Verilog HDL数字系统设计及仿真数字系统设计及仿真15结果不符时结果不符时Verilog HDL数字系统设计及仿真数字系统设计及仿真16也可以添加任务也可以添加任务always (S,COUT) begin if(S!=S_ref | COUT!= COUT_ref ) $strobe($realtime,The result is wro

10、ng, right S=%b,COUT=%b, but current S=%b,COUT=%b,S_ref,COUT_ref,S,COUT);endVerilog HDL数字系统设计及仿真数字系统设计及仿真17更复杂的形式更复杂的形式always (S,COUT) begin if(S!=S_ref | COUT!= COUT_ref ) begin $strobe($realtime,The result is wrong, right S=%b,COUT=%b,but current right S=%b,COUT=%b,S_ref,COUT_ref,S,COUT); case(S=S_

11、ref),(COUT=COUT_ref) 2b10:$strobe(the %s is wrong!,COUT); 2b01:$strobe(the %s is wrong!,S); 2b11:$strobe(the %s is wrong!, both S and COUT); endcase endend# 100The result is wrong, right S=0111,COUT=0,but current right S=0111,COUT=1# the COUT is wrong!# 110The result is wrong, right S=0111,COUT=0,bu

12、t current right S=0110,COUT=0# the S is wrong!Verilog HDL数字系统设计及仿真数字系统设计及仿真18仿真中对信号的控制仿真中对信号的控制 wait语句:等待条件达成语句:等待条件达成initial wait(reset2)begin (posedge clock); #4 q=1; #8 qb) -sub; /a大于大于b激活激活sub事件事件 else -add; /否则激活否则激活add事件事件endalways (sub) /该事件可被该事件可被检测,并触发检测,并触发always结构结构out_ref=a-b;always (add

13、) /此段同理此段同理out_ref=a+b;Verilog HDL数字系统设计及仿真数字系统设计及仿真21组合逻辑的测试模块组合逻辑的测试模块 设计模块:设计模块:3-8译码器译码器module decoder3x8(din,en,dout,ex);input 2:0 din;input en;output 7:0 dout;output ex;reg 7:0 dout;reg ex;always (din or en)if(en) begin dout=8b1111_1111; ex=1b1; end else begin case(din) 3b000: begin dout=8b111

14、1_1110; ex=1b0; end 3b001: begin dout=8b1111_1101; ex=1b0; end 3b010: begin dout=8b1111_1011; ex=1b0; endVerilog HDL数字系统设计及仿真数字系统设计及仿真22设计模块:设计模块:3-8译码器译码器 3b011: begin dout=8b1111_0111; ex=1b0; end 3b100: begin dout=8b1110_1111; ex=1b0; end 3b101: begin dout=8b1101_1111; ex=1b0; end 3b110: begin do

15、ut=8b1011_1111; ex=1b0; end 3b111: begin dout=8b0111_1111; ex=1b0; end default:begin dout=8b1111_1111; ex=1b0; end endcase endendmoduleVerilog HDL数字系统设计及仿真数字系统设计及仿真23测试信号测试信号initialbegin #10 en=0;din=3b000; #10 en=0;din=3b001; #10 en=0;din=3b010; #10 en=0;din=3b011; #10 en=0;din=3b100; #10 en=0;din=

16、3b101; #10 en=0;din=3b110; #10 en=0;din=3b111; #10 en=0;din=3b1x1; #10 en=1;din=3b000; #10 en=1;din=3b001; #10 en=1;din=3b010; #10 en=1;din=3b011; #10 en=1;din=3b100; #10 en=1;din=3b101; #10 en=1;din=3b110; #10 en=1;din=3b111; #10 $stop;endVerilog HDL数字系统设计及仿真数字系统设计及仿真24时序逻辑的测试模块时序逻辑的测试模块 4位的并串转换模块位

17、的并串转换模块 module p2s(data_in,clock,reset,load,data_out,done);input 3:0 data_in;input clock,reset,load;output data_out;output done;reg done; reg 3:0 temp;reg 3:0 cnt;Verilog HDL数字系统设计及仿真数字系统设计及仿真254位的并串转换模块位的并串转换模块 always(posedge clock or posedge reset ) begin if(reset) begin temp=0; cnt=0; done=1; end

18、 else if(load) begin temp=data_in; cnt=0; done=0; endelse if(cnt=3) begin temp = temp2:0,1b0; cnt=0; done=1; end else begin temp = temp2:0,1b0; cnt=cnt+1; done=0; endendassign data_out=(done=1)?1bz:temp3; endmodule Verilog HDL数字系统设计及仿真数字系统设计及仿真26测试模块测试模块module tbp2s;reg 3:0 data_in;reg clock,reset,l

19、oad;wire data_out;wire done;initialbegin reset=1; #15 reset=0;endinitial clock=1;always #5 clock=clock;always (done)begin if(done=1) begin data_in=$random%16; load=1; end else begin load=0; endendVerilog HDL数字系统设计及仿真数字系统设计及仿真27always (posedge clock)if(load=1) /每次载数后判断每次载数后判断 begin:dis integer i; i=3

20、; repeat(4) /重复四次,即四位信号依次判断重复四次,即四位信号依次判断 begin (posedge clock) if(data_out=data_ini) /正确时产生正确输出正确时产生正确输出 $display(Output Right!); else /错误时产生错误输出,并提示信息错误时产生错误输出,并提示信息 $display(Bed Output!data_out= %b ,but data_in%d= %b,data_out,i,data_ini); i=i-1; end endp2s ip2s(data_in,clock,reset,load,data_out,d

21、one);endmodule Verilog HDL数字系统设计及仿真数字系统设计及仿真28仿真结果仿真结果Verilog HDL数字系统设计及仿真数字系统设计及仿真29除法器的测试模块除法器的测试模块 功能表功能表端口名称端口名称功能说明功能说明clk输入端,时钟信号,提供该除法器内部运算所需时钟输入端,时钟信号,提供该除法器内部运算所需时钟reset输入端,复位信号,低电平有效输入端,复位信号,低电平有效start输入端,开始信号,为高电平时开始计算输入端,开始信号,为高电平时开始计算A输入端,输入端,32位被除数位被除数B输入端,输入端,32位除数位除数D输出端,输出端,48位商值位商值

22、R输出端,输出端,32位余数位余数ok输出端,计算完毕时输出输出端,计算完毕时输出ok为高电平,此时是最终结果为高电平,此时是最终结果err输出端,如果出现错误则输出高电平输出端,如果出现错误则输出高电平Verilog HDL数字系统设计及仿真数字系统设计及仿真30测试模块测试模块参考函数参考函数 function n+n+(n+m)+(n)-1:0 gen_rand_data; /函数部分,生成被除数、除数,和商与余数的参考值函数部分,生成被除数、除数,和商与余数的参考值 input integer i; reg n+m-1:0 dividend; reg n+m-1:0 divisor;

23、reg n+m-1:0 quotient; reg n+m-1:0 remainder; integer k; integer flag;Verilog HDL数字系统设计及仿真数字系统设计及仿真31begin k = (i/4) % 32 + 1; flag = 1; while(flag) begin dividend = $random, m1b0; /随机数生成被除数,并扩展位随机数生成被除数,并扩展位 divisor = m1b0, $random; /随机数生成除数,被扩展位随机数生成除数,被扩展位Verilog HDL数字系统设计及仿真数字系统设计及仿真32 divisor = divisor % ( 2 divisor) /商大于余数时报错商大于余数时报错 begin $display(Bad remainder!); $s

温馨提示

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

评论

0/150

提交评论