zoukankan      html  css  js  c++  java
  • Testbench的编写

    Testbench的作用,在于给我们编写的可综合代码的模块送入激励。即在我们波形仿真中用编写testbench来代替拖拽波形。其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的数据读入,或者将模块的输出写入到文本,供matlab调用检测)。

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

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

    `timescale 时间单位/时间精度

    2.用localparam、parameter来定义测试模块中需要定义的常数。

    定义常数往往是为了使测试代码可复用,如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)

    );

  • 相关阅读:
    IO流
    myEclipse的使用
    单例模式
    日期的使用
    String类的常用方法
    break、continue和return的区别
    包装类和随机数
    enum类的使用
    Java基础概念性的知识总结
    汇编中的函数调用与递归
  • 原文地址:https://www.cnblogs.com/lueguo/p/3581138.html
Copyright © 2011-2022 走看看