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; |