原创 Testbench的编写

2010-3-24 17:11 3903 13 13 分类: 测试测量

Testbench的作用,在于给我们编写的可综合代码的模块送入激励。即在我们波形仿真中用编写testbench来代替拖拽波形。其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的数据读入,或者将模块的输出写入到文本,供matlab调用检测)。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


对于testbench的编写的几点总结:


1.利用`timescale设置仿真时间单位和时间精度。格式:


`timescale 时间单位/时间精度


2.localparamparameter来定义测试模块中需要定义的常数。


定义常数往往是为了使测试代码可复用,如N点的FFT可将N常数化,这样不同的N则可用相同的代码来测试。


3.读取由matlab产生的数据,


Initial  $readmemb(“D:/……”,input);//或者用readmemh,即二进制与十六进制的差别。


4.时钟块


always


begin


       clk = 1’b0;


       #30  forever


                     #50 clk=~clk;


end


很多书上都是直接:always #50 clk=~clk;这样虽然简单,可是时钟从0开始就已经跑了,总有些不合适。凡事留些余地的好。另外,为了测试方便,我们都加上时钟计数块。


always


begin


       clk_cnt = 0;


       #30  forever


                     #100 clk_cnt = clk_cnt + 1;


end


这样我们可以在仿真波形出来后,清晰的看到第几个时钟各个端口、变量是个什么样的状况。


5.控制信号的赋值


每个控制信号都由单独的一个initial块来管理。如:


initial


begin


       clrn = 1;


       #30 clrn = 0;


       #130 clrn = 1;


end


6.控制仿真总时间,用$stop;


#10000 $stop;


7.将仿真结果输出到txt文本,以供matlab读取进行比对。


integer w_file


initial w_file = $fopen(“data_out.txt”);//在当前目录新建文本,并打开。


always @ (posedge clk)


begin


       #10 if(en_out)//此处延时是因为激励信号经过被测试模块后都会有小段延时,延时时间可自己斟酌。


       begin


              $fdisplay(w_file,”%h”,data_out);


       end


end


 


例如:这是个DTMB系统中LDPC编码器的其中一个模块的测试文件。


`timescale 1ns/1ps


 


module tb_circmatrix;


reg clk,reset,data_in,en_in;


reg [126:0]g;


reg load;


wire [126:0]data_out;


wire en_out;


 


reg [126:0]matlab_in;


//5DCE86622D846BF272215A792AF31A3E


 


integer w_file;


initial w_file = $fopen("data_out.txt");


always @ (posedge clk)


begin


         if(en_out)


                   $fdisplay(w_file,"%h",data_out);


end


 


initial


begin


         reset = 1'b0;


         clk = 1'b0;


         load = 1'b0;


         en_in = 1'b0;


         data_in = 1'b0;


         g = 0;


         matlab_in = 127'h5DCE86622D846BF272215A792AF31A3E;


end


 


initial


begin


         #50 reset = 1'b1;


         #100 reset = 1'b0;


end


 


initial


begin


         #150 load = 1'b1;


         g = 127'h44DB4147E6075A92E878EB68C44DD51F;


         #100 load = 1'b0;


end


 


integer in_num;


initial


begin


         #250 en_in = 1'b1;


         for(in_num = 126;in_num>=0;in_num=in_num-1)


         begin


                   data_in = matlab_in[in_num];


                   #100;


         end


         data_in = 1'b0;


         en_in = 1'b0;


         load = 1'b1;


         #100 load = 1'b0;


         #1000 $stop;


end


 


always


begin


         #50 forever


                   #50 clk = ~clk; 


end


 


integer clk_cnt;


always


begin


         clk_cnt = 0;


         #150;


         forever


                   #100 clk_cnt = clk_cnt + 1;


end


 


circmatrix u1(


.clk(clk),


.reset(reset),


.data_in(data_in),


.en_in(en_in),


.g(g),


.load(load),


.data_out(data_out),


.en_out(en_out)


);

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条