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

Subversion Repositories fft2_size

[/] [fft2_size/] [fft_int_size/] [fft_int_size_tb.sv] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 Papayaved
timeunit 1ns;
2
timeprecision 1ns;
3
 
4
module fft_int_size_tb;
5
        localparam POW = 9;
6
        localparam DATA_WIDTH = 32;
7
        localparam POW_WIDTH = (2**$clog2(POW) > POW - 1) ? $clog2(POW) : $clog2(POW) + 1;
8
        localparam RES_WIDTH = DATA_WIDTH + POW;
9
 
10
        bit clk = 0, aclr = 1;
11
        bit sink_sop = 0, sink_eop = 0, sink_valid = 0;
12
        bit signed [DATA_WIDTH-1:0] sink_Re = 0, sink_Im = 0;
13
 
14
        bit [POW_WIDTH-1:0] pow = 7; // 4..POW
15
        wire pow_ready;
16
 
17
        wire source_sop, source_eop, source_valid;
18
        wire signed [RES_WIDTH-1:0] source_Re, source_Im;
19
        wire error;
20
 
21
        localparam time period = 20ns;
22
        always #(period/2) clk++;
23
 
24
        initial begin
25
                repeat(10) @(posedge clk);
26
                aclr = 0;
27
                repeat(10) @(posedge clk);
28
 
29
                wait(pow_ready);
30
                pow = 6;
31
                @(posedge clk);
32
                Test(2**pow, 1<<1);
33
                Test(2**pow, 1<<2);
34
                Test(2**pow, 5<<1);
35
 
36
                wait(pow_ready);
37
                pow = 9;
38
                @(posedge clk);
39
                Test(2**pow, 1<<1);
40
                Test(2**pow, 1<<2);
41
                Test(2**pow, 5<<1);
42
 
43
//              TestLine(2**pow);
44
//              TestConst(2**pow);
45
 
46
                wait (pow_ready || error);
47
                if (error) $warning("ERROR");
48
 
49
                repeat(2**pow * 3 + 400) @(posedge clk);
50
                $stop(2);
51
        end
52
 
53
        always #(period * 2**POW * 10) begin
54
                $warning("Timeout");
55
                $stop(2);
56
        end
57
 
58
        fft_int_size #(.POW(POW), .DATA_WIDTH(DATA_WIDTH)) dut(.*);
59
 
60
        localparam IFFT_WIDTH = RES_WIDTH + POW;
61
 
62
        wire ifft_pow_ready;
63
        wire signed [IFFT_WIDTH-1:0] ifft_source_Re, ifft_source_Im;
64
        wire signed [IFFT_WIDTH-POW-1:0] ifft_Re, ifft_Im;
65
        wire ifft_sop, ifft_eop, ifft_valid;
66
        wire ifft_err;
67
 
68
        fft_int_size #(.POW(POW), .DATA_WIDTH(RES_WIDTH)) ifft(
69
                .clk, .aclr,
70
                .sink_sop(source_sop), .sink_eop(source_eop), .sink_valid(source_valid),
71
                .sink_Re(source_Im), .sink_Im(source_Re),
72
                .pow(pow), .pow_ready(ifft_pow_ready),
73
                .source_sop(ifft_sop), .source_eop(ifft_eop), .source_valid(ifft_valid),
74
                .source_Re(ifft_source_Im), .source_Im(ifft_source_Re),
75
                .error(ifft_err)
76
        );
77
 
78
        assign ifft_Re = ifft_source_Re / 2**pow;
79
        assign ifft_Im = ifft_source_Im / 2**pow;
80
 
81
        task Test(int len, int bin_msk = 2);
82
                int ar[];
83
                ar = new[len];
84
 
85
                for (int i = 0; i < len; i++)
86
                        if ((bin_msk & 1<
87
                                ar[i] = 1<<16;
88
                        else
89
                                ar[i] = 0;
90
 
91
                for (int i = 0; i < len; i++) begin
92
                        sink_sop = i == 0;
93
                        sink_eop = i == len - 1;
94
                        sink_valid = 1;
95
                        sink_Re = ar[i];
96
                        @(posedge clk);
97
                end
98
 
99
                sink_sop = 0;
100
                sink_eop = 0;
101
                sink_valid = 0;
102
                sink_Re = 0;
103
 
104
                ar.delete();
105
        endtask
106
 
107
        task TestLine(int len);
108
                int ar_Im[], ar_Re[];
109
                ar_Re = new[len];
110
                ar_Im = new[len];
111
 
112
                for (int i = 0; i < len; i++) begin
113
                        ar_Re[i] = (i+1) * 2**16;
114
                        ar_Im[i] = 0;
115
//                      ar_Im[i] = -(i+1);
116
                end
117
 
118
                for (int i = 0; i < len; i++) begin
119
                        sink_sop = i == 0;
120
                        sink_eop = i == len - 1;
121
                        sink_valid = 1;
122
                        sink_Re = ar_Re[i];
123
                        sink_Im = ar_Im[i];
124
                        @(posedge clk);
125
                end
126
 
127
                sink_sop = 0;
128
                sink_eop = 0;
129
                sink_valid = 0;
130
                sink_Re = 0;
131
                sink_Im = 0;
132
 
133
                ar_Re.delete();
134
                ar_Im.delete();
135
        endtask
136
 
137
        task TestConst(int len);
138
                for (int i = 0; i < len; i++) begin
139
                        sink_sop = i == 0;
140
                        sink_eop = i == len - 1;
141
                        sink_valid = 1;
142
                        sink_Re = 2**16;
143
                        sink_Im = -(2**16);
144
                        @(posedge clk);
145
                end
146
 
147
                sink_sop = 0;
148
                sink_eop = 0;
149
                sink_valid = 0;
150
                sink_Re = 0;
151
                sink_Im = 0;
152
        endtask
153
 
154
endmodule :fft_int_size_tb

powered by: WebSVN 2.1.0

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