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

Subversion Repositories cordic_atan_iq

[/] [cordic_atan_iq/] [cordic_atan_iq_tb.sv] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 Papayaved
timeunit 1ns;
2
timeprecision 1ns;
3
 
4
`include "AuxFunc.sv"
5
`include "AuxClasses.sv"
6
`include "atan32_table.sv"
7
 
8
module cordic_atan_iq_tb;
9
        import AuxFuncPkg::*;
10
        import AuxClassesPkg::*;
11
 
12
        bit clk = 0;
13
        bit signed [29:0] IS, QS;
14
        wire signed [31:0] angle;
15
        wire [31:0] coe_radius;
16
 
17
        int ang_delta_max = 0, ang_delta_min = 0;
18
        int abs_delta_max = 0, abs_delta_min = 0;
19
        real pct;
20
        int i, j;
21
 
22
        always #10ns clk++;
23
 
24
        initial begin
25
                repeat(10) @(posedge clk);
26
 
27
                //Test(20_000_000, 4_000_000);
28
                //Test(0, V_MAX);
29
                //Test(V_MIN, 0);
30
                //Test(V_MIN, V_MAX);
31
                //Test(0, V_MIN);
32
                Test2();
33
 
34
                $stop(2);
35
        end
36
 
37
        cordic_atan_iq dut(.*);
38
 
39
        task Test(bit signed [29:0] I, Q);
40
                int atan_ref, ang_delta, abs_ref, abs_res, abs_delta;
41
 
42
                IS = I;
43
                QS = Q;
44
                repeat(100) @(posedge clk);
45
 
46
                atan_ref = atan_iq_int(int'(IS), int'(QS));
47
                ang_delta = delta(atan_ref, angle);
48
                pct = rel_pct(atan_ref, angle);
49
 
50
                $display("%d {%08h, %08h}: Ref %g deg (%d), RTL %g deg (%d), delta %d (%g pct)", i, int'(IS), int'(QS), int_to_deg(atan_ref), atan_ref, int_to_deg(angle), angle, ang_delta, pct);
51
 
52
                abs_ref = imag(I, Q);
53
                abs_res = int'(ConstPkg::K * real'(coe_radius));
54
                abs_delta = delta(abs_ref, abs_res);
55
                $display("\tAbs: x[end] = %08h, Ref %d, RTL %d, delta %d", coe_radius, abs_ref, abs_res, abs_delta);
56
 
57
                assert (iabs(ang_delta) <= 16 && iabs(abs_delta) <= 16) else $display("ERROR!");
58
        endtask
59
 
60
        task Test2();
61
                int atan_ref, ang_delta, abs_ref, abs_res, abs_delta;
62
                int I, Q;
63
                automatic bit error = 0;
64
 
65
//              automatic IQArrayList v = GenIQ();
66
                automatic IQArrayList v = GenIQ(1024);
67
 
68
                fork
69
                        begin
70
                                for (int i = 0; i < v.size(); i++) begin
71
                                        IS = v.data[i].I;
72
                                        QS = v.data[i].Q;
73
                                        @(posedge clk);
74
                                end
75
                        end
76
                        begin
77
                                repeat(32+1) @(posedge clk);
78
 
79
                                for (int i = 0; i < v.size(); i++) begin
80
                                        I = v.data[i].I;
81
                                        Q = v.data[i].Q;
82
 
83
                                        atan_ref = atan_iq_int(I, Q);
84
 
85
                                        ang_delta = delta(atan_ref, angle);
86
                                        if (ang_delta > ang_delta_max) ang_delta_max = ang_delta;
87
                                        if (ang_delta < ang_delta_min) ang_delta_min = ang_delta;
88
 
89
                                        pct = rel_pct(atan_ref, angle);
90
 
91
                                        $display("%d {%08h, %08h}. Angle: Ref %g deg (%d), RTL %g deg (%d), delta %d (%g pct)", i, I, Q, int_to_deg(atan_ref), atan_ref, int_to_deg(angle), angle, ang_delta, pct);
92
 
93
                                        abs_ref = imag(I, Q);
94
                                        abs_res = int'(ConstPkg::K * real'(coe_radius));
95
                                        abs_delta = delta(abs_ref, abs_res);
96
                                        if (abs_delta > abs_delta_max) abs_delta_max = abs_delta;
97
                                        if (abs_delta < abs_delta_min) abs_delta_min = abs_delta;
98
 
99
                                        $display("\tAbs: x[end] = %08h, Ref %d, RTL %d, delta %d", coe_radius, abs_ref, abs_res, abs_delta);
100
 
101
                                        assert (iabs(ang_delta) <= 16 && iabs(abs_delta) <= 16)
102
                                        else
103
                                                begin
104
                                                        error = 1;
105
                                                        $display("ERROR!");
106
                                                end
107
 
108
                                        @(posedge clk);
109
                                end
110
 
111
                                if (error)
112
                                        $display("Result: ERROR!");
113
                                else
114
                                        $display("Result: OK");
115
                        end
116
                join
117
 
118
                $display("Calculation precision. Angle: [%d, %d] ([%g, %g] sec)", ang_delta_min, ang_delta_max, int_to_deg(ang_delta_min) * 60**2, int_to_deg(ang_delta_max) * 60**2);
119
                $display("\tAbs: [%d, %d])", abs_delta_min, abs_delta_max);
120
 
121
                repeat(100) @(posedge clk);
122
                $stop(2);
123
        endtask
124
 
125
        //
126
        wire [31:0][31:0] x;
127
        wire [30:0][31:0] y;
128
        wire [31:1][31:0] a;
129
 
130
        genvar k;
131
        generate for (k = 0; k < 32; k++)
132
                begin :gen_x
133
                        assign x[k] = dut.x[k];
134
                end
135
        endgenerate
136
 
137
        genvar n;
138
        generate for (n = 0; n < 31; n++)
139
                begin :gen_y
140
                        assign y[n] = dut.y[n];
141
                end
142
        endgenerate
143
 
144
        genvar m;
145
        generate for (m = 1; m < 32; m++)
146
                begin :gen_a
147
                        assign a[m] = dut.a[m];
148
                end
149
        endgenerate
150
 
151
endmodule :cordic_atan_iq_tb

powered by: WebSVN 2.1.0

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