OpenCores
URL https://opencores.org/ocsvn/divider/divider/trunk

Subversion Repositories divider

[/] [divider/] [trunk/] [bench/] [verilog/] [bench_div_top.v] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rherveille
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Divider                   Testbench                        ////
4
////                                                             ////
5
////  Author: Richard Herveille                                  ////
6
////          richard@asics.ws                                   ////
7
////          www.asics.ws                                       ////
8
////                                                             ////
9
/////////////////////////////////////////////////////////////////////
10
////                                                             ////
11
//// Copyright (C) 2002 Richard Herveille                        ////
12
////                    richard@asics.ws                         ////
13
////                                                             ////
14
//// This source file may be used and distributed without        ////
15
//// restriction provided that this copyright statement is not   ////
16
//// removed from the file and that any derivative work contains ////
17
//// the original copyright notice and the associated disclaimer.////
18
////                                                             ////
19
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
20
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
21
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
22
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
23
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
24
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
25
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
26
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
27
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
28
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
29
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
30
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
31
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
32
////                                                             ////
33
/////////////////////////////////////////////////////////////////////
34
 
35
//  CVS Log
36
//
37 6 rherveille
//  $Id: bench_div_top.v,v 1.3 2003-09-17 13:09:23 rherveille Exp $
38 2 rherveille
//
39 6 rherveille
//  $Date: 2003-09-17 13:09:23 $
40
//  $Revision: 1.3 $
41 2 rherveille
//  $Author: rherveille $
42
//  $Locker:  $
43
//  $State: Exp $
44
//
45
// Change History:
46
//               $Log: not supported by cvs2svn $
47 6 rherveille
//               Revision 1.2  2002/10/31 13:53:55  rherveille
48
//               Modified testbench. Fixed a bug in the remainder output size of div_su.v
49
//
50 4 rherveille
//               Revision 1.1.1.1  2002/10/29 20:29:08  rherveille
51
//
52
//
53 2 rherveille
//               Revision 1.1.1.1  2002/03/26 07:25:12  rherveille
54
//               First upload
55
//
56
//
57
 
58
`include "timescale.v"
59
 
60
module bench_div_top();
61
 
62 6 rherveille
        parameter z_width = 16;
63 2 rherveille
        parameter d_width = z_width /2;
64
 
65 6 rherveille
        parameter pipeline = d_width +4;
66 2 rherveille
 
67
        parameter show_div0 = 0;
68
        parameter show_ovf  = 0;
69
 
70
        //
71
        // internal wires
72
        //
73
        reg clk;
74
 
75
        integer z, d, n;
76 6 rherveille
        integer dz [pipeline:1];
77
        integer dd [pipeline:1];
78
        reg [d_width:1] di;
79
        reg [z_width:1] zi;
80 2 rherveille
 
81
        integer sr, qr;
82
 
83 4 rherveille
        wire [d_width   :0] s;
84
        wire [d_width   :0] q;
85 2 rherveille
        wire div0, ovf;
86
        reg  [d_width :0] sc, qc;
87
 
88 6 rherveille
        integer err_cnt;
89 2 rherveille
 
90 6 rherveille
        function integer twos;
91
                input [d_width:1] d;
92
        begin
93
          if(d[d_width])
94
            twos = -(~d[d_width:1] +1);
95
          else
96
            twos = d[d_width:1];
97
        end
98
        endfunction
99
 
100 2 rherveille
        //
101
        // hookup division unit
102
        //
103
        div_su #(z_width) dut (
104
                .clk(clk),
105
                .ena(1'b1),
106
                .z(zi),
107
                .d(di),
108
                .q(q),
109
                .s(s),
110
                .div0(div0),
111
                .ovf(ovf)
112
        );
113
 
114
        always #2.5 clk <= ~clk;
115
 
116 4 rherveille
        always @(posedge clk)
117 6 rherveille
          for(n=2; n<=pipeline; n=n+1)
118 4 rherveille
             begin
119
                 dz[n] <= #1 dz[n-1];
120
                 dd[n] <= #1 dd[n-1];
121
             end
122 2 rherveille
 
123
        initial
124
        begin
125 4 rherveille
            $display("*");
126
            $display("* Starting testbench");
127
            $display("*");
128 6 rherveille
 
129
`ifdef WAVES
130
   $shm_open("waves");
131
   $shm_probe("AS",bench_div_top,"AS");
132
   $display("INFO: Signal dump enabled ...\n\n");
133
`endif
134
 
135 4 rherveille
            err_cnt = 0;
136 2 rherveille
 
137 4 rherveille
            clk = 0; // start with low-level clock
138 2 rherveille
 
139 4 rherveille
            // wait a while
140
            @(posedge clk);
141 2 rherveille
 
142 4 rherveille
            // present data
143
            for(z=-(1<<(z_width -1)); z < 1<<(z_width -1); z=z+1)
144
            for(d=0; d< 1<<(z_width/2); d=d+1)
145
            begin
146 6 rherveille
                zi <= #1 z;
147
                di <= #1 d;
148 2 rherveille
 
149 6 rherveille
                dz[1] <= #1 z;
150
                dd[1] <= #1 d;
151 2 rherveille
 
152 6 rherveille
                qc = dz[pipeline] / dd[pipeline];
153
                sc = dz[pipeline] - (dd[pipeline] * (dz[pipeline]/dd[pipeline]));
154 2 rherveille
 
155 6 rherveille
                if(!ovf && !div0)
156 4 rherveille
                  if ( (qc !== q) || (sc !== s) )
157
                    begin
158 6 rherveille
                        $display("Result error (z/d=%0d/%0d). Received (q,s) = (%0d,%0d), expected (%0d,%0d)",
159
                                 dz[pipeline], dd[pipeline], twos(q), s, twos(qc), sc);
160 2 rherveille
 
161 4 rherveille
                        err_cnt = err_cnt +1;
162
                    end
163 2 rherveille
 
164 4 rherveille
                  if(show_div0)
165
                    if(div0)
166 6 rherveille
                      $display("Division by zero (z/d=%0d/%0d)", dz[pipeline], dd[pipeline]);
167 2 rherveille
 
168 4 rherveille
                  if(show_ovf)
169
                    if(ovf)
170 6 rherveille
                      $display("Overflow (z/d=%0d/%0d)", dz[pipeline], dd[pipeline]);
171 2 rherveille
 
172 4 rherveille
                  @(posedge clk);
173
            end
174 2 rherveille
 
175 4 rherveille
            // wait a while
176
            repeat(20) @(posedge clk);
177 2 rherveille
 
178 4 rherveille
            $display("*");
179
            $display("* Testbench ended. Total errors = %d", err_cnt);
180
            $display("*");
181 2 rherveille
 
182 4 rherveille
            $stop;
183 2 rherveille
        end
184
 
185
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.