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

Subversion Repositories dblclockfft

[/] [dblclockfft/] [trunk/] [rtl/] [bitreverse.v] - Blame information for rev 39

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 36 dgisselq
////////////////////////////////////////////////////////////////////////////////
2
//
3
// Filename:    bitreverse.v
4
//
5
// Project:     A General Purpose Pipelined FFT Implementation
6
//
7 39 dgisselq
// Purpose:     This module bitreverses a pipelined FFT input.  It differes
8
//              from the dblreverse module in that this is just a simple and
9
//      straightforward bitreverse, rather than one written to handle two
10
//      words at once.
11 36 dgisselq
//
12
//
13
// Creator:     Dan Gisselquist, Ph.D.
14
//              Gisselquist Technology, LLC
15
//
16
////////////////////////////////////////////////////////////////////////////////
17
//
18
// Copyright (C) 2015-2018, Gisselquist Technology, LLC
19
//
20 39 dgisselq
// This file is part of the general purpose pipelined FFT project.
21 36 dgisselq
//
22 39 dgisselq
// The pipelined FFT project is free software (firmware): you can redistribute
23
// it and/or modify it under the terms of the GNU Lesser General Public License
24
// as published by the Free Software Foundation, either version 3 of the
25
// License, or (at your option) any later version.
26 36 dgisselq
//
27 39 dgisselq
// The pipelined FFT project is distributed in the hope that it will be useful,
28
// but WITHOUT ANY WARRANTY; without even the implied warranty of
29
// MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
30
// General Public License for more details.
31
//
32
// You should have received a copy of the GNU Lesser General Public License
33
// along with this program.  (It's in the $(ROOT)/doc directory.  Run make
34
// with no target there if the PDF file isn't present.)  If not, see
35 36 dgisselq
// <http://www.gnu.org/licenses/> for a copy.
36
//
37 39 dgisselq
// License:     LGPL, v3, as defined and found on www.gnu.org,
38
//              http://www.gnu.org/licenses/lgpl.html
39 36 dgisselq
//
40
//
41
////////////////////////////////////////////////////////////////////////////////
42
//
43
//
44
`default_nettype        none
45
//
46 39 dgisselq
module  bitreverse(i_clk, i_reset, i_ce, i_in, o_out, o_sync);
47 36 dgisselq
        parameter                       LGSIZE=5, WIDTH=24;
48 39 dgisselq
        input   wire                    i_clk, i_reset, i_ce;
49
        input   wire    [(2*WIDTH-1):0]  i_in;
50
        output  reg     [(2*WIDTH-1):0]  o_out;
51 36 dgisselq
        output  reg                     o_sync;
52 39 dgisselq
        reg     [(LGSIZE):0]     wraddr;
53
        wire    [(LGSIZE):0]     rdaddr;
54 36 dgisselq
 
55 39 dgisselq
        reg     [(2*WIDTH-1):0]  brmem   [0:((1<<(LGSIZE+1))-1)];
56 36 dgisselq
 
57
        genvar  k;
58 39 dgisselq
        generate for(k=0; k<LGSIZE; k=k+1)
59
                assign rdaddr[k] = wraddr[LGSIZE-1-k];
60
        endgenerate
61
        assign  rdaddr[LGSIZE] = !wraddr[LGSIZE];
62 36 dgisselq
 
63 39 dgisselq
        reg     in_reset;
64
 
65
        initial in_reset = 1'b1;
66 36 dgisselq
        always @(posedge i_clk)
67
                if (i_reset)
68
                        in_reset <= 1'b1;
69 39 dgisselq
                else if ((i_ce)&&(&wraddr[(LGSIZE-1):0]))
70
                        in_reset <= 1'b0;
71
 
72
        initial wraddr = 0;
73
        always @(posedge i_clk)
74
                if (i_reset)
75
                        wraddr <= 0;
76
                else if (i_ce)
77 36 dgisselq
                begin
78 39 dgisselq
                        brmem[wraddr] <= i_in;
79
                        wraddr <= wraddr + 1;
80 36 dgisselq
                end
81
 
82
        always @(posedge i_clk)
83 39 dgisselq
                if (i_ce) // If (i_reset) we just output junk ... not a problem
84
                        o_out <= brmem[rdaddr]; // w/o a sync pulse
85 36 dgisselq
 
86 39 dgisselq
        initial o_sync = 1'b0;
87 36 dgisselq
        always @(posedge i_clk)
88 39 dgisselq
                if (i_reset)
89
                        o_sync <= 1'b0;
90
                else if ((i_ce)&&(!in_reset))
91
                        o_sync <= (wraddr[(LGSIZE-1):0] == 0);
92 36 dgisselq
 
93
`ifdef  FORMAL
94 39 dgisselq
`define ASSERT  assert
95 36 dgisselq
`ifdef  BITREVERSE
96
`define ASSUME  assume
97
`else
98
`define ASSUME  assert
99
`endif
100
 
101
        reg     f_past_valid;
102
        initial f_past_valid = 1'b0;
103
        always @(posedge i_clk)
104
                f_past_valid <= 1'b1;
105
 
106
        initial `ASSUME(i_reset);
107
        always @(posedge i_clk)
108
        if ((!f_past_valid)||($past(i_reset)))
109
        begin
110 39 dgisselq
                `ASSERT(wraddr == 0);
111 36 dgisselq
                `ASSERT(in_reset);
112
                `ASSERT(!o_sync);
113
        end
114
`ifdef  BITREVERSE
115
        always @(posedge i_clk)
116
                assume((i_ce)||($past(i_ce))||($past(i_ce,2)));
117
`endif // BITREVERSE
118
 
119 39 dgisselq
                (* anyconst *) reg      [LGSIZE:0]       f_const_addr;
120
                wire    [LGSIZE:0]       f_reversed_addr;
121
                reg                     f_addr_loaded;
122
                reg     [(2*WIDTH-1):0]  f_addr_value;
123 36 dgisselq
 
124 39 dgisselq
                generate for(k=0; k<LGSIZE; k=k+1)
125
                        assign  f_reversed_addr[k] = f_const_addr[LGSIZE-1-k];
126 36 dgisselq
                endgenerate
127 39 dgisselq
                assign  f_reversed_addr[LGSIZE] = f_const_addr[LGSIZE];
128 36 dgisselq
 
129 39 dgisselq
                initial f_addr_loaded = 1'b0;
130 36 dgisselq
                always @(posedge i_clk)
131
                if (i_reset)
132 39 dgisselq
                        f_addr_loaded <= 1'b0;
133
                else if (i_ce)
134 36 dgisselq
                begin
135 39 dgisselq
                        if (wraddr == f_const_addr)
136
                                f_addr_loaded <= 1'b1;
137
                        else if (rdaddr == f_const_addr)
138
                                f_addr_loaded <= 1'b0;
139 36 dgisselq
                end
140
 
141
                always @(posedge i_clk)
142 39 dgisselq
                if ((i_ce)&&(wraddr == f_const_addr))
143 36 dgisselq
                begin
144 39 dgisselq
                        f_addr_value <= i_in;
145
                        `ASSERT(!f_addr_loaded);
146 36 dgisselq
                end
147
 
148
                always @(posedge i_clk)
149
                if ((f_past_valid)&&(!$past(i_reset))
150 39 dgisselq
                                &&($past(f_addr_loaded))&&(!f_addr_loaded))
151
                        assert(o_out == f_addr_value);
152 36 dgisselq
 
153
                always @(*)
154 39 dgisselq
                if (o_sync)
155
                        assert(wraddr[LGSIZE-1:0] == 1);
156 36 dgisselq
 
157
                always @(*)
158 39 dgisselq
                if ((wraddr[LGSIZE]==f_const_addr[LGSIZE])
159
                                &&(wraddr[LGSIZE-1:0]
160
                                                <= f_const_addr[LGSIZE-1:0]))
161
                        `ASSERT(!f_addr_loaded);
162 36 dgisselq
 
163
                always @(*)
164 39 dgisselq
                if ((rdaddr[LGSIZE]==f_const_addr[LGSIZE])&&(f_addr_loaded))
165
                        `ASSERT(wraddr[LGSIZE-1:0]
166
                                        <= f_reversed_addr[LGSIZE-1:0]+1);
167 36 dgisselq
 
168
                always @(*)
169 39 dgisselq
                if (f_addr_loaded)
170
                        `ASSERT(brmem[f_const_addr] == f_addr_value);
171 36 dgisselq
 
172
 
173
 
174
`endif  // FORMAL
175
endmodule

powered by: WebSVN 2.1.0

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