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

Subversion Repositories dblclockfft

[/] [dblclockfft/] [trunk/] [bench/] [cpp/] [fft_tb.cpp] - Diff between revs 23 and 26

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 23 Rev 26
Line 47... Line 47...
#include "Vfftmain.h"
#include "Vfftmain.h"
#include "twoc.h"
#include "twoc.h"
 
 
#define LGWIDTH 11
#define LGWIDTH 11
#define IWIDTH  16
#define IWIDTH  16
 
// #define      OWIDTH  16
#define OWIDTH  22
#define OWIDTH  22
 
 
#define NFTLOG  8
#define NFTLOG  8
#define FFTLEN  (1<<LGWIDTH)
#define FFTLEN  (1<<LGWIDTH)
 
 
 
unsigned long bitrev(const int nbits, const unsigned long vl) {
 
        unsigned long   r = 0;
 
        unsigned long   val = vl;
 
 
 
        for(int k=0; k<nbits; k++) {
 
                r<<= 1;
 
                r |= (val & 1);
 
                val >>= 1;
 
        }
 
 
 
        return r;
 
}
 
 
class   FFT_TB {
class   FFT_TB {
public:
public:
        Vfftmain        *m_fft;
        Vfftmain        *m_fft;
        long            m_data[FFTLEN], m_log[NFTLOG*FFTLEN];
        long            m_data[FFTLEN], m_log[NFTLOG*FFTLEN];
        int             m_iaddr, m_oaddr, m_ntest;
        int             m_iaddr, m_oaddr, m_ntest, m_logbase;
        FILE            *m_dumpfp;
        FILE            *m_dumpfp;
        fftw_plan       m_plan;
        fftw_plan       m_plan;
        double          *m_fft_buf;
        double          *m_fft_buf;
        bool            m_syncd;
        bool            m_syncd;
 
 
Line 80... Line 94...
        void    tick(void) {
        void    tick(void) {
                m_fft->i_clk = 0;
                m_fft->i_clk = 0;
                m_fft->eval();
                m_fft->eval();
                m_fft->i_clk = 1;
                m_fft->i_clk = 1;
                m_fft->eval();
                m_fft->eval();
 
 
 
                /*
 
                int nrpt = (rand()&0x01f) + 1;
 
                m_fft->i_ce = 0;
 
                for(int i=0; i<nrpt; i++) {
 
                        m_fft->i_clk = 0;
 
                        m_fft->eval();
 
                        m_fft->i_clk = 1;
 
                        m_fft->eval();
 
                }
 
                */
        }
        }
 
 
        void    reset(void) {
        void    reset(void) {
                m_fft->i_ce  = 0;
                m_fft->i_ce  = 0;
                m_fft->i_rst = 1;
                m_fft->i_rst = 1;
                tick();
                tick();
                m_fft->i_rst = 0;
                m_fft->i_rst = 0;
                tick();
                tick();
 
 
                m_iaddr = m_oaddr = 0;
                m_iaddr = m_oaddr = m_logbase = 0;
                m_syncd = false;
                m_syncd = false;
        }
        }
 
 
        long    twos_complement(const long val, const int bits) {
        long    twos_complement(const long val, const int bits) {
                return sbits(val, bits);
                return sbits(val, bits);
Line 104... Line 129...
                double  vout[FFTLEN*2];
                double  vout[FFTLEN*2];
                double  isq=0.0, osq = 0.0;
                double  isq=0.0, osq = 0.0;
                long    *lp;
                long    *lp;
 
 
                // Fill up our test array from the log array
                // Fill up our test array from the log array
                // printf("%3d : CHECK: %8d %5x\n", m_ntest, m_iaddr, m_iaddr);
                printf("%3d : CHECK: %8d %5x m_log[-%x=%x]\n", m_ntest, m_iaddr, m_iaddr,
                dp = m_fft_buf; lp = &m_log[(m_iaddr-FFTLEN*3)&((NFTLOG*FFTLEN-1)&(-FFTLEN))];
                        m_logbase, (m_iaddr-m_logbase)&((NFTLOG*FFTLEN-1)&(-FFTLEN)));
 
                dp = m_fft_buf; lp = &m_log[(m_iaddr-m_logbase)&((NFTLOG*FFTLEN-1)&(-FFTLEN))];
                for(int i=0; i<FFTLEN; i++) {
                for(int i=0; i<FFTLEN; i++) {
                        long    tv = *lp++;
                        long    tv = *lp++;
 
 
                        dp[0] = sbits(tv >> IWIDTH, IWIDTH);
                        dp[0] = sbits(tv >> IWIDTH, IWIDTH);
                        dp[1] = sbits(tv, IWIDTH);
                        dp[1] = sbits(tv, IWIDTH);
Line 121... Line 147...
                        dp += 2;
                        dp += 2;
                }
                }
 
 
                // Let's measure ... are we the zero vector?  If not, how close?
                // Let's measure ... are we the zero vector?  If not, how close?
                dp = m_fft_buf;
                dp = m_fft_buf;
                for(int i=0; i<FFTLEN; i++)
                for(int i=0; i<FFTLEN*2; i++) {
                        isq += (*dp) * (*dp);
                        isq += (*dp) * (*dp); dp++;
 
                }
 
 
                fftw_execute(m_plan);
                fftw_execute(m_plan);
 
 
                // Let's load up the output we received into vout
                // Let's load up the output we received into vout
                dp = vout;
                dp = vout;
                for(int i=0; i<FFTLEN; i++) {
                for(int i=0; i<FFTLEN; i++) {
                        long    tv = m_data[i];
                        *dp = rdata(i);
 
 
                        // printf("OUT[%4d = %4x] = ", i, i);
 
                        // printf("%12lx = ", tv);
 
                        *dp = sbits(tv >> OWIDTH, OWIDTH);
 
                        // printf("%10.1f + ", *dp);
 
                        osq += (*dp) * (*dp); dp++;
                        osq += (*dp) * (*dp); dp++;
                        *dp = sbits(tv, OWIDTH);
                        *dp = idata(i);
                        // printf("%10.1f j", *dp);
 
                        osq += (*dp) * (*dp); dp++;
                        osq += (*dp) * (*dp); dp++;
                        // printf(" <-> %12.1f %12.1f\n", m_fft_buf[2*i], m_fft_buf[2*i+1]);
 
                }
                }
 
 
 
 
                // Let's figure out if there's a scale factor difference ...
                // Let's figure out if there's a scale factor difference ...
                double  scale = 0.0, wt = 0.0;
                double  scale = 0.0, wt = 0.0;
Line 155... Line 175...
 
 
                if (wt == 0.0) scale = 1.0;
                if (wt == 0.0) scale = 1.0;
 
 
                double xisq = 0.0;
                double xisq = 0.0;
                sp = m_fft_buf;  dp = vout;
                sp = m_fft_buf;  dp = vout;
 
 
 
                if ((true)&&(m_dumpfp)) {
 
                        double  tmp[FFTLEN*2], nscl;
 
 
 
                        if (fabs(scale) < 1e-4)
 
                                nscl = 1.0;
 
                        else
 
                                nscl = scale;
 
                        for(int i=0; i<FFTLEN*2; i++)
 
                                tmp[i] = m_fft_buf[i] * nscl;
 
                        fwrite(tmp, sizeof(double), FFTLEN*2, m_dumpfp);
 
                }
 
 
                for(int i=0; i<FFTLEN*2; i++) {
                for(int i=0; i<FFTLEN*2; i++) {
                        double vl = (*sp++) * scale - (*dp++);
                        double vl = (*sp++) * scale - (*dp++);
                        xisq += vl * vl;
                        xisq += vl * vl;
                }
                }
 
 
Line 184... Line 217...
                m_log[(m_iaddr++)&(NFTLOG*FFTLEN-1)] = (long)rht;
                m_log[(m_iaddr++)&(NFTLOG*FFTLEN-1)] = (long)rht;
 
 
                tick();
                tick();
 
 
                if (m_fft->o_sync) {
                if (m_fft->o_sync) {
 
                        if (!m_syncd) {
 
                                m_logbase = m_iaddr;
 
                        } // else printf("RESYNC AT %lx\n", m_fft->m_tickcount);
                        m_oaddr &= (-1<<LGWIDTH);
                        m_oaddr &= (-1<<LGWIDTH);
                        m_syncd = true;
                        m_syncd = true;
                } else m_oaddr += 2;
                } else m_oaddr += 2;
 
 
                printf("%8x,%5d: %08x,%08x -> %011lx,%011lx"
                printf("%8x,%5d: %08x,%08x -> %011lx,%011lx",
                        // "\t%011lx,%011lx"
                        m_iaddr, m_oaddr,
                        "\t%011lx,%011lx"
                        lft, rht, m_fft->o_left, m_fft->o_right);
 
                printf( // "\t%011lx,%011lx"
 
                        "\t%3x"
 
                        "\t%011lx,%011lx"               // w_e128, w_o128
 
                        // "\t%011lx,%011lx"            // w_e4, w_o4
                        // "\t%06x,%06x"
                        // "\t%06x,%06x"
                        // "\t%06x,%06x"
                        // "\t%06x,%06x"
                        // "\t%011lx,%06x,%06x"
                        // "\t%011lx,%06x,%06x"
                        "\t%011lx,%06x,%06x"
                        "\t%011lx,%06x,%06x"            // ob_a, ob_b_r, ob_b_i
                        "\t%06x,%06x,%06x,%06x"
                        "\t%06x,%06x,%06x,%06x",        // o_out_xx
                        "\t%011lx,%011lx"
                        // "\t%011lx,%011lx"
                        " %s%s%s%s%s%s%s%s%s%s%s %s%s\n",
                        m_fft->v__DOT__revstage__DOT__iaddr,
                        m_iaddr, m_oaddr,
                        m_fft->v__DOT__w_e128,
                        lft, rht, m_fft->o_left, m_fft->o_right,
                        m_fft->v__DOT__w_o128,
                        m_fft->v__DOT__w_e4,
                        // m_fft->v__DOT__w_e4,
                        m_fft->v__DOT__w_o4,
                        // m_fft->v__DOT__w_o4,
                        // m_fft->v__DOT__stage_e512__DOT__ib_a,
                        // m_fft->v__DOT__stage_e512__DOT__ib_a,
                        // m_fft->v__DOT__stage_e512__DOT__ib_b,
                        // m_fft->v__DOT__stage_e512__DOT__ib_b,
                        // m_fft->v__DOT__stage_e256__DOT__ib_a,
                        // m_fft->v__DOT__stage_e256__DOT__ib_a,
                        // m_fft->v__DOT__stage_e256__DOT__ib_b,
                        // m_fft->v__DOT__stage_e256__DOT__ib_b,
                        // m_fft->v__DOT__stage_e128__DOT__ib_a,
                        // m_fft->v__DOT__stage_e128__DOT__ib_a,
Line 231... Line 271...
                        m_fft->v__DOT__stage_o4__DOT__ob_b_r,
                        m_fft->v__DOT__stage_o4__DOT__ob_b_r,
                        m_fft->v__DOT__stage_o4__DOT__ob_b_i,
                        m_fft->v__DOT__stage_o4__DOT__ob_b_i,
                        m_fft->v__DOT__stage_2__DOT__o_out_0r,
                        m_fft->v__DOT__stage_2__DOT__o_out_0r,
                        m_fft->v__DOT__stage_2__DOT__o_out_0i,
                        m_fft->v__DOT__stage_2__DOT__o_out_0i,
                        m_fft->v__DOT__stage_2__DOT__o_out_1r,
                        m_fft->v__DOT__stage_2__DOT__o_out_1r,
                        m_fft->v__DOT__stage_2__DOT__o_out_1i,
                        m_fft->v__DOT__stage_2__DOT__o_out_1i);
                        m_fft->v__DOT__br_o_left,
/*
                        m_fft->v__DOT__br_o_right,
                printf(" DBG:%c%c:%08x [%6d,%6d]",
                        (m_fft->v__DOT__w_s2048)?"S":"-",
                                (m_fft->o_dbg&(1l<<33))?'T':' ',
                        (m_fft->v__DOT__w_s1024)?"S":"-",
                                (m_fft->o_dbg&(1l<<32))?'C':' ',
                        (m_fft->v__DOT__w_s512)?"S":"-",
                                (unsigned)(m_fft->o_dbg&((-1l<<32)-1)),
                        (m_fft->v__DOT__w_s256)?"S":"-",
                                ((int)(m_fft->o_dbg))>>16,
 
                                (((unsigned)(m_fft->o_dbg&0x0ffff))
 
                                        |((m_fft->o_dbg&0x08000)?(-1<<16):0)));
 
*/
 
                printf(" %s%s%s%s%s%s%s %s%s\n",
 
                        // m_fft->v__DOT__br_o_left,
 
                        // m_fft->v__DOT__br_o_right,
 
                        // (m_fft->v__DOT__w_s2048)?"S":"-",
 
                        // (m_fft->v__DOT__w_s1024)?"S":"-",
 
                        // (m_fft->v__DOT__w_s512)?"S":"-",
 
                        // (m_fft->v__DOT__w_s256)?"S":"-",
                        (m_fft->v__DOT__w_s128)?"S":"-",
                        (m_fft->v__DOT__w_s128)?"S":"-",
                        (m_fft->v__DOT__w_s64)?"S":"-",
                        (m_fft->v__DOT__w_s64)?"S":"-",
                        (m_fft->v__DOT__w_s32)?"S":"-",
                        (m_fft->v__DOT__w_s32)?"S":"-",
                        (m_fft->v__DOT__w_s16)?"S":"-",
                        (m_fft->v__DOT__w_s16)?"S":"-",
                        (m_fft->v__DOT__w_s8)?"S":"-",
                        (m_fft->v__DOT__w_s8)?"S":"-",
Line 274... Line 324...
 
 
                return test(ilft, irht);
                return test(ilft, irht);
        }
        }
 
 
        double  rdata(int addr) {
        double  rdata(int addr) {
                return (double)sbits(m_data[addr&(FFTLEN-1)]>>OWIDTH, OWIDTH);
                int     index = addr & (FFTLEN-1);
 
 
 
                // index = bitrev(LGWIDTH, index);
 
                return (double)sbits(m_data[index]>>OWIDTH, OWIDTH);
        }
        }
 
 
        double  idata(int addr) {
        double  idata(int addr) {
                return (double)sbits(m_data[addr&(FFTLEN-1)], OWIDTH);
                int     index = addr & (FFTLEN-1);
 
 
 
                // index = bitrev(LGWIDTH, index);
 
                return (double)sbits(m_data[index], OWIDTH);
        }
        }
 
 
        void    dump(FILE *fp) {
        void    dump(FILE *fp) {
                m_dumpfp = fp;
                m_dumpfp = fp;
        }
        }
Line 317... Line 373...
        }
        }
 
 
        fft->reset();
        fft->reset();
        fft->dump(fpout);
        fft->dump(fpout);
 
 
 
        // 1.
 
        fft->test(0.0, 0.0, 32767.0, 0.0);
 
        for(int k=0; k<FFTLEN/2-1; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        // 2. 
 
        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
        for(int k=0; k<FFTLEN/2-1; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        // 3. 
 
        fft->test(0.0,0.0,0.0,0.0);
 
        fft->test(32767.0, 0.0, 0.0, 0.0);
 
        for(int k=0; k<FFTLEN/2-1; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        // 4.
 
        for(int k=0; k<8; k++)
 
                fft->test(32767.0, 0.0, 32767.0, 0.0);
 
        for(int k=8; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        // 5.
 
        if (FFTLEN/2 >= 16) {
 
                for(int k=0; k<16; k++)
 
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
                for(int k=16; k<FFTLEN/2; k++)
 
                        fft->test(0.0,0.0,0.0,0.0);
 
        }
 
 
 
        // 6.
 
        if (FFTLEN/2 >= 32) {
 
                for(int k=0; k<32; k++)
 
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
                for(int k=32; k<FFTLEN/2; k++)
 
                        fft->test(0.0,0.0,0.0,0.0);
 
        }
 
 
 
        // 7.
 
        if (FFTLEN/2 >= 64) {
 
                for(int k=0; k<64; k++)
 
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
                for(int k=64; k<FFTLEN/2; k++)
 
                        fft->test(0.0,0.0,0.0,0.0);
 
        }
 
 
 
        if (FFTLEN/2 >= 128) {
 
                for(int k=0; k<128; k++)
 
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
                for(int k=128; k<FFTLEN/2; k++)
 
                        fft->test(0.0,0.0,0.0,0.0);
 
        }
 
 
 
        if (FFTLEN/2 >= 256) {
 
                for(int k=0; k<256; k++)
 
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
                for(int k=256; k<FFTLEN/2; k++)
 
                        fft->test(0.0,0.0,0.0,0.0);
 
        }
 
 
 
        if (FFTLEN/2 >= 512) {
 
                for(int k=0; k<256+128; k++)
 
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
 
                for(int k=256+128; k<FFTLEN/2; k++)
 
                        fft->test(0.0,0.0,0.0,0.0);
 
        }
 
 
 
        /*
 
        for(int k=0; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        for(int k=0; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        for(int k=0; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        for(int k=0; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        for(int k=0; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        for(int k=0; k<FFTLEN/2; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
        */
 
 
 
#ifndef NO_JUNK
 
        // 7.
 
 
        //     1 -> 0x0001 
        //     1 -> 0x0001 
        //     2 -> 0x0002 
        //     2 -> 0x0002 
        //     4 -> 0x0004 
        //     4 -> 0x0004 
        //     8 -> 0x0008 
        //     8 -> 0x0008 
        //    16 -> 0x0010 
        //    16 -> 0x0010 
Line 350... Line 496...
        //  2048 -> 0xf800
        //  2048 -> 0xf800
        //  4096 -> 0xf000
        //  4096 -> 0xf000
        //  8192 -> 0xe000
        //  8192 -> 0xe000
        // 16384 -> 0xc000
        // 16384 -> 0xc000
        // 32768 -> 0x8000
        // 32768 -> 0x8000
 
        fft->test(0.0,0.0,16384.0,0.0);
 
        for(int k=0; k<FFTLEN/2-1; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
        for(int v=1; v<=32768; v<<=1) for(int k=0; k<FFTLEN/2; k++)
        for(int v=1; v<=32768; v<<=1) for(int k=0; k<FFTLEN/2; k++)
                fft->test(-(double)v,0.0,-(double)v,0.0);
                fft->test(-(double)v,0.0,-(double)v,0.0);
        //     1 -> 0x000040    CORRECT!!
        //     1 -> 0x000040    CORRECT!!
        //     2 -> 0x000080 
        //     2 -> 0x000080 
        //     4 -> 0x000100 
        //     4 -> 0x000100 
Line 429... Line 579...
        // 72. And another one on the next clock (FAILS, ugly)
        // 72. And another one on the next clock (FAILS, ugly)
        fft->test(0.0, 0.0, 16384.0, 0.0);
        fft->test(0.0, 0.0, 16384.0, 0.0);
        for(int k=0; k<FFTLEN/2-1; k++)
        for(int k=0; k<FFTLEN/2-1; k++)
                fft->test(0.0,0.0,0.0,0.0);
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        // 72. And another one on the next clock (FAILS, ugly)
 
        fft->test(0.0, 0.0,  8192.0, 0.0);
 
        for(int k=0; k<FFTLEN/2-1; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
        // 72. And another one on the next clock (FAILS, ugly)
 
        fft->test(0.0, 0.0,   512.0, 0.0);
 
        for(int k=0; k<FFTLEN/2-1; k++)
 
                fft->test(0.0,0.0,0.0,0.0);
 
 
        // 73. And an imaginary one on the second clock
        // 73. And an imaginary one on the second clock
        fft->test(0.0, 0.0, 0.0, 16384.0);
        fft->test(0.0, 0.0, 0.0, 16384.0);
        for(int k=0; k<FFTLEN/2-1; k++)
        for(int k=0; k<FFTLEN/2-1; k++)
                fft->test(0.0,0.0,0.0,0.0);
                fft->test(0.0,0.0,0.0,0.0);
 
 
Line 502... Line 662...
                sl = sin(W * (2*k  )) * 4.0;
                sl = sin(W * (2*k  )) * 4.0;
                cr = cos(W * (2*k+1)) * 4.0;
                cr = cos(W * (2*k+1)) * 4.0;
                sr = sin(W * (2*k+1)) * 4.0;
                sr = sin(W * (2*k+1)) * 4.0;
                fft->test(cl, sl, cr, sr);
                fft->test(cl, sl, cr, sr);
        }
        }
 
#endif
        // 19.--24. And finally, let's clear out our results / buffer
        // 19.--24. And finally, let's clear out our results / buffer
        for(int k=0; k<(FFTLEN/2) * 5; k++)
        for(int k=0; k<(FFTLEN/2) * 5; k++)
                fft->test(0.0,0.0,0.0,0.0);
                fft->test(0.0,0.0,0.0,0.0);
 
 
 
 

powered by: WebSVN 2.1.0

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