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

Subversion Repositories dblclockfft

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /dblclockfft/trunk/bench/cpp
    from Rev 7 to Rev 8
    Reverse comparison

Rev 7 → Rev 8

/fftstage_o2048_tb.cpp
54,9 → 54,11
#define LGSPAN 9
#define SPANLEN (1<<LGSPAN)
#define SPANMASK (SPANLEN-1)
#define IWIDTH 17
#define CWIDTH 21
#define OWIDTH 18
#define DBLSPANLEN (1<<(LGSPAN+1))
#define DBLSPANMASK (DBLSPANLEN-1)
#define IWIDTH 16
#define CWIDTH 20
#define OWIDTH 17
#define BFLYSHIFT 0
#define LGWIDTH 11
#define LGSPAN 9
65,10 → 67,15
public:
Vfftstage_o2048 *m_ftstage;
long m_oaddr, m_iaddr;
long m_vals[SPANLEN], m_lft[SPANLEN>>1], m_rht[SPANLEN>>1];
long m_vals[SPANLEN], m_lft[DBLSPANLEN], m_rht[DBLSPANLEN];
bool m_syncd;
int m_lchecks, m_rchecks;
 
FFTSTAGE_TB(void) {
m_ftstage = new Vfftstage_o2048;
m_syncd = false;
m_iaddr = m_oaddr = 0;
m_lchecks = m_rchecks = 0;
}
 
void tick(void) {
95,7 → 102,7
return r;
}
 
void butterfly(long cv, long lft, long rht,
void butterfly(const long cv, const long lft, const long rht,
long &o_lft, long &o_rht) {
long cv_r, cv_i;
long lft_r, lft_i, rht_r, rht_i;
116,8 → 123,8
o_lft_r &= (~(-1l << OWIDTH));
o_lft_i &= (~(-1l << OWIDTH));
 
o_lft_r >>= 1;
o_lft_i >>= 1;
// o_lft_r >>= 1;
// o_lft_i >>= 1;
o_lft = (o_lft_r << OWIDTH) | (o_lft_i);
 
o_rht_r = (cv_r * (lft_r-rht_r)) - (cv_i * (lft_i-rht_i));
143,45 → 150,73
void test(bool i_sync, long i_data) {
long cv;
bool bc;
int raddr;
 
m_ftstage->i_rst = 0;
m_ftstage->i_ce = 1;
m_ftstage->i_sync = i_sync;
i_data &= (~(-1l<<(2*IWIDTH)));
m_ftstage->i_data = i_data;
 
cv = m_ftstage->v__DOT__cmem[m_iaddr & SPANMASK];
bc = m_iaddr & (1<<(LGSPAN-1));
bc = m_iaddr & (1<<LGSPAN);
if (!bc)
m_vals[m_iaddr & (SPANMASK)] = i_data;
else {
butterfly(cv, m_vals[m_iaddr & (SPANMASK>>1)], i_data,
m_lft[m_iaddr & (SPANMASK>>1)],
m_rht[m_iaddr & (SPANMASK>>1)]);
int waddr = m_iaddr ^ (1<<LGSPAN);
waddr &= (DBLSPANMASK);
if (m_iaddr & (1<<(LGSPAN+1)))
waddr |= (1<<(LGSPAN));
butterfly(cv, m_vals[m_iaddr & (SPANMASK)], i_data,
m_lft[waddr], m_rht[waddr]);
/*
printf("BFLY: C=%16lx M=%8lx I=%10lx -> %10lx %10lx\n",
cv, m_vals[m_iaddr & (SPANMASK)], i_data,
m_lft[waddr], m_rht[waddr]);
*/
}
 
tick();
 
if (m_ftstage->o_sync)
m_oaddr = 0;
// if (m_ftstage->o_sync)
// m_oaddr = 0;
m_oaddr = m_iaddr - 0x219;
m_syncd = (m_syncd)||(m_ftstage->o_sync);
 
printf("%4ld, %4ld: %d %9lx -> %9lx %d %d %4x %15lx (%10lx %10lx) %10lx %8x %8x %d %8lx %8lx %10lx %10lx\n",
raddr = m_oaddr & (~(-1l<<LGSPAN));
if (m_oaddr & (1<<(LGSPAN+1)))
raddr |= (1<<LGSPAN);
 
printf("%4ld, %4ld: %d %9lx -> %9lx %d %4x %15lx (%10lx %10lx)\n",
m_iaddr, m_oaddr,
i_sync, i_data & (~(-1l << (2*IWIDTH))),
m_ftstage->o_data, m_ftstage->o_sync,
m_ftstage->v__DOT__b_ce,
m_ftstage->v__DOT__iaddr&(FFTMASK>>1),
m_ftstage->v__DOT__cmem[m_ftstage->v__DOT__iaddr&(SPANMASK>>1)] & (~(-1l<<(2*CWIDTH))),
m_lft[m_oaddr & (SPANMASK>>1)],
m_rht[m_oaddr & (SPANMASK>>1)],
m_ftstage->v__DOT__ib_c,
m_ftstage->v__DOT__ib_a,
m_ftstage->v__DOT__ib_b,
m_ftstage->v__DOT__ib_sync,
m_ftstage->v__DOT__bfly__DOT__b_left_r,
m_ftstage->v__DOT__bfly__DOT__b_left_i,
m_ftstage->v__DOT__bfly__DOT__b_right_r,
m_ftstage->v__DOT__bfly__DOT__b_right_i);
m_lft[raddr], m_rht[raddr]);
 
if (m_ftstage->o_sync != (((m_iaddr&DBLSPANMASK)==0x0219)?1:0)) {
fprintf(stderr, "Bad output sync\n");
exit(-1);
}
 
if (m_syncd) {
if (!(m_oaddr&(1l<<LGSPAN))) {
if (m_lft[raddr] != m_ftstage->o_data) {
fprintf(stderr, "Bad output data, left\n");
exit(-1);
}
 
m_lchecks++;
} else {
if (m_rht[raddr] != m_ftstage->o_data) {
fprintf(stderr, "Bad output data, right, m_oaddr = %lx, bit = %lx\n",
m_oaddr, (1l<<LGSPAN));
exit(-1);
}
m_rchecks++;
}
}
m_iaddr++;
m_oaddr++;
}
201,11 → 236,12
// Medium imaginary (constant) value ... just for starters
for(int k=1; k<FFTSIZE; k+=2)
ftstage->test((k==1), 0x00000020l);
// Medium sine wave
// Medium sine wave, real
for(int k=1; k<FFTSIZE; k+=2) {
long vl;
vl= (long)(cos(2.0 * M_PI * 1.0 / FFTSIZE * k)*(1l<<32) + 0.5);
vl &= (-1 << 17);
vl= (long)(cos(2.0 * M_PI * 1.0 / FFTSIZE * k)*(1l<<30) + 0.5);
vl &= (-1l << 16); // Turn off the imaginary bit portion
vl &= (~(-1l << (IWIDTH*2))); // Turn off unused high order bits
ftstage->test((k==1), vl);
}
// Smallest real value
221,8 → 257,8
for(int k=1; k<FFTSIZE; k+=2)
ftstage->test((k==1), 0x000010000l);
 
printf("SUCCESS! (%d, %d)\n", ftstage->m_lchecks, ftstage->m_rchecks);
delete ftstage;
 
printf("SUCCESS!\n");
exit(0);
}
/butterfly_tb.cpp
283,10 → 283,22
bfly->test(9,2,0x4000000000l,0x00000008,0x0000fff8, 0);
bfly->test(9,3,0x4000000000l,0x00000008,0x00000008, 0);
 
bfly->test(7,0,0x3fffbff9b9l,0xfffe0000,0x00000000, 1);
bfly->test(7,1,0x3ffd4fed28l,0xfffc0000,0x00020000, 0);
bfly->test(7,2,0x3ff85fe098l,0xfff80000,0x00060000, 0);
bfly->test(7,3,0x3ff0efd409l,0xfff00000,0x000e0000, 0);
bfly->test(7,4,0x3fe70fc77cl,0xffe60000,0x00180000, 0);
bfly->test(7,5,0x3fdabfbaf1l,0xffda0000,0x00240000, 0);
bfly->test(7,6,0x3fcbefae69l,0xffca0000,0x00340000, 0);
bfly->test(7,7,0x3fbaafa1e4l,0xffba0000,0x00440000, 0);
 
/*
// Special tests
bfly->test(9,0,0x4000000000l,0x00010000,0xffff0000, 1);
bfly->test(9,1,0x4000000000l,0x00010000,0x00010000, 0);
bfly->test(9,2,0x4000000000l,0x00000001,0x0000ffff, 0);
bfly->test(9,3,0x4000000000l,0x00000001,0x00000001, 0);
*/
 
for(int n=0; n<4; n++) for(int k=0; k<TESTSZ; k++) {
long iv, rv;

powered by: WebSVN 2.1.0

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