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

Subversion Repositories dblclockfft

[/] [dblclockfft/] [trunk/] [bench/] [formal/] [abs_longbimpy.v] - Blame information for rev 40

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 40 dgisselq
////////////////////////////////////////////////////////////////////////////////
2
//
3
// Filename:    ../rtl/abs_longbimpy.v
4
//
5
// Project:     A General Purpose Pipelined FFT Implementation
6
//
7
// Purpose:     A portable shift and add multiply, built with the knowledge
8
//      of the existence of a six bit LUT and carry chain.  That knowledge
9
//      allows us to multiply two bits from one value at a time against all
10
//      of the bits of the other value.  This sub multiply is called the
11
//      bimpy.
12
//
13
//      For minimal processing delay, make the first parameter the one with
14
//      the least bits, so that AWIDTH <= BWIDTH.
15
//
16
//
17
//
18
// Creator:     Dan Gisselquist, Ph.D.
19
//              Gisselquist Technology, LLC
20
//
21
////////////////////////////////////////////////////////////////////////////////
22
//
23
// Copyright (C) 2015-2018, Gisselquist Technology, LLC
24
//
25
// This program is free software (firmware): you can redistribute it and/or
26
// modify it under the terms of  the GNU General Public License as published
27
// by the Free Software Foundation, either version 3 of the License, or (at
28
// your option) any later version.
29
//
30
// This program is distributed in the hope that it will be useful, but WITHOUT
31
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
32
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
33
// for more details.
34
//
35
// You should have received a copy of the GNU General Public License along
36
// with this program.  (It's in the $(ROOT)/doc directory, run make with no
37
// target there if the PDF file isn't present.)  If not, see
38
// <http://www.gnu.org/licenses/> for a copy.
39
//
40
// License:     GPL, v3, as defined and found on www.gnu.org,
41
//              http://www.gnu.org/licenses/gpl.html
42
//
43
//
44
////////////////////////////////////////////////////////////////////////////////
45
//
46
//
47
`default_nettype        none
48
//
49
module  longbimpy(i_clk, i_ce, i_a_unsorted, i_b_unsorted, o_r);
50
        parameter       IAW=8,  // The width of i_a, min width is 5
51
                        IBW=12, // The width of i_b, can be anything
52
                        // The following three parameters should not be changed
53
                        // by any implementation, but are based upon hardware
54
                        // and the above values:
55
                        OW=IAW+IBW;     // The output width
56
        localparam      AW = (IAW<IBW) ? IAW : IBW,
57
                        BW = (IAW<IBW) ? IBW : IAW,
58
                        LUTB=2, // How many bits we can multiply by at once
59
                        TLEN=(AW+(LUTB-1))/LUTB; // Nmbr of rows in our tableau
60
        input   wire                    i_clk, i_ce;
61
        input   wire    [(IAW-1):0]      i_a_unsorted;
62
        input   wire    [(IBW-1):0]      i_b_unsorted;
63
        output  reg     [(AW+BW-1):0]    o_r;
64
 
65
        //
66
        // Swap parameter order, so that AW <= BW -- for performance
67
        // reasons
68
        wire    [AW-1:0] i_a;
69
        wire    [BW-1:0] i_b;
70
        generate if (IAW <= IBW)
71
        begin : NO_PARAM_CHANGE
72
                assign i_a = i_a_unsorted;
73
                assign i_b = i_b_unsorted;
74
        end else begin : SWAP_PARAMETERS
75
                assign i_a = i_b_unsorted;
76
                assign i_b = i_a_unsorted;
77
        end endgenerate
78
 
79
`ifndef FORMAL
80
        // This file should only be used in a formal context.
81
        // The following line should therefore yield a syntax error
82
        assert(0);
83
`endif
84
 
85
        reg     f_past_valid;
86
        initial f_past_valid = 1'b0;
87
        always @(posedge i_clk)
88
                f_past_valid <= 1'b1;
89
 
90
        reg     [AW-1:0] f_past_a        [0:TLEN+1];
91
        reg     [BW-1:0] f_past_b        [0:TLEN+1];
92
 
93
        initial f_past_a[0] = 0;
94
        initial f_past_b[0] = 0;
95
        always @(posedge i_clk)
96
        if (i_ce)
97
        begin
98
                f_past_a[0] <= i_a;
99
                f_past_b[0] <= i_b;
100
        end
101
 
102
        genvar  k;
103
 
104
        generate for(k=0; k<TLEN+1; k=k+1)
105
        begin
106
                initial f_past_a[k+1] = 0;
107
                initial f_past_b[k+1] = 0;
108
                always @(posedge i_clk)
109
                if (i_ce)
110
                begin
111
                        f_past_a[k+1] <= f_past_a[k];
112
                        f_past_b[k+1] <= f_past_b[k];
113
                end
114
        end endgenerate
115
 
116
        // abs_mpy #(.AW(AW), .BW(BW)) thempy(f_past_a[TLEN+1], f_past_b[TLEN+1], o_r);
117
        (* anyseq *) reg [AW+BW-1:0]     result;
118
        wire    [AW+BW-1:0]      f_neg_a, f_neg_b;
119
 
120
        assign  f_neg_a = - {{(BW){f_past_a[TLEN+1][AW-1]}}, f_past_a[TLEN+1]};
121
        assign  f_neg_b = - {{(AW){f_past_b[TLEN+1][BW-1]}}, f_past_b[TLEN+1]};
122
 
123
        always @(*)
124
        if (f_past_a[TLEN+1] == 0)
125
                assume(result == 0);
126
        else if (f_past_b[TLEN+1] == 0)
127
                assume(result == 0);
128
        else if (f_past_a[TLEN+1] == 1)
129
        begin
130
                assume(result[BW-1:0] == f_past_b[TLEN+1]);
131
                assume(result[AW+BW-1:BW] == {(AW){f_past_b[TLEN+1][BW-1]}});
132
        end else if (f_past_b[TLEN+1] == 1)
133
        begin
134
                assume(result[AW-1:0] == f_past_a[TLEN+1]);
135
                assume(result[AW+BW-1:AW] == {(BW){f_past_a[TLEN+1][AW-1]}});
136
        end else if (&f_past_a[TLEN+1])
137
                assume(result == f_neg_b);
138
        else if (&f_past_b[TLEN+1])
139
                assume(result == f_neg_a);
140
        else
141
                assume(result[AW+BW-1] == (f_past_a[TLEN+1][AW-1]
142
                                        ^f_past_b[TLEN+1][BW-1]));
143
 
144
 
145
        always @(*)
146
                o_r = result;
147
endmodule

powered by: WebSVN 2.1.0

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