Line 82... |
Line 82... |
m_core->o_ddr_ba,
|
m_core->o_ddr_ba,
|
m_core->o_ddr_data);
|
m_core->o_ddr_data);
|
|
|
bool writeout = (!m_core->v__DOT__reset_override);
|
bool writeout = (!m_core->v__DOT__reset_override);
|
|
|
if (writeout) {
|
|
int cmd;
|
int cmd;
|
cmd = (m_core->o_ddr_reset_n?0:32)
|
cmd = (m_core->o_ddr_reset_n?0:32)
|
|(m_core->o_ddr_cke?0:16)
|
|(m_core->o_ddr_cke?0:16)
|
|(m_core->o_ddr_cs_n?8:0)
|
|(m_core->o_ddr_cs_n?8:0)
|
|(m_core->o_ddr_ras_n?4:0)
|
|(m_core->o_ddr_ras_n?4:0)
|
|(m_core->o_ddr_cas_n?2:0)
|
|(m_core->o_ddr_cas_n?2:0)
|
|(m_core->o_ddr_we_n?1:0);
|
|(m_core->o_ddr_we_n?1:0);
|
|
if ((cmd&0x0f)==DDR_REFRESH)
|
|
writeout = true;
|
|
|
|
if (writeout) {
|
printf("%08lx-WB: %s/%s %s%s%s %s@0x%08x[%08x/%08x] -- ",
|
printf("%08lx-WB: %s/%s %s%s%s %s@0x%08x[%08x/%08x] -- ",
|
m_tickcount,
|
m_tickcount,
|
(m_core->i_wb_cyc)?"CYC":" ",
|
(m_core->i_wb_cyc)?"CYC":" ",
|
(m_core->i_wb_stb)?"STB":" ",
|
(m_core->i_wb_stb)?"STB":" ",
|
(m_core->o_wb_stall)?"STALL":" ",
|
(m_core->o_wb_stall)?"STALL":" ",
|
Line 176... |
Line 179... |
(m_core->v__DOT__need_close_bank)?"C":"N",
|
(m_core->v__DOT__need_close_bank)?"C":"N",
|
//:(m_core->v__DOT__maybe_close_next_bank)?"c":"N",
|
//:(m_core->v__DOT__maybe_close_next_bank)?"c":"N",
|
(m_core->v__DOT__need_open_bank)?"O":"K");
|
(m_core->v__DOT__need_open_bank)?"O":"K");
|
// :(m_core->v__DOT__maybe_open_next_bank)?"o":"K");
|
// :(m_core->v__DOT__maybe_open_next_bank)?"o":"K");
|
for(int i=0; i<8; i++) {
|
for(int i=0; i<8; i++) {
|
printf("%s%x@%x%s",
|
printf("%s%s%s%x%x@%x%s",
|
(m_core->v__DOT__r_bank==i)?"R":"[",
|
(m_core->v__DOT__r_bank==i)?"R":"[",
|
|
((m_core->v__DOT__bank_open)&(1<<i))?"+":" ",
|
|
((m_core->v__DOT__bank_closed)&(1<<i))?"-":" ",
|
m_core->v__DOT__bank_status[i],
|
m_core->v__DOT__bank_status[i],
|
|
m_sdram->m_bank[i].m_state&0x0f,
|
m_core->v__DOT__bank_address[i],
|
m_core->v__DOT__bank_address[i],
|
(m_core->v__DOT__r_nxt_bank==i)?"N":"]");
|
(m_core->v__DOT__r_nxt_bank==i)?"N":"]");
|
}
|
}
|
|
|
|
|
extern int gbl_state, gbl_counts;
|
/*
|
printf(" %2d:%08x ", gbl_state, gbl_counts);
|
extern int gbl_state, gbl_counts;
|
|
printf(" %2d:%08x ", gbl_state, gbl_counts);
|
|
*/
|
|
|
printf(" %s%s%s%s%s%s:%08x:%08x",
|
printf(" %s%s%s%s%s%s%s%s%s%s%s",
|
(m_core->v__DOT__reset_override)?"R":" ",
|
(m_core->v__DOT__reset_override)?"R":" ",
|
(m_core->v__DOT__need_refresh)?"N":" ",
|
(m_core->v__DOT__need_refresh)?"N":" ",
|
(m_core->v__DOT__need_close_bank)?"C":" ",
|
(m_core->v__DOT__need_close_bank)?"C":" ",
|
(m_core->v__DOT__need_open_bank)?"O":" ",
|
(m_core->v__DOT__need_open_bank)?"O":" ",
|
(m_core->v__DOT__valid_bank)?"V":" ",
|
(m_core->v__DOT__valid_bank)?"V":" ",
|
(m_core->v__DOT__r_move)?"R":" ",
|
(m_core->v__DOT__r_move)?"R":" ",
|
m_core->v__DOT__activate_bank_cmd,
|
(m_core->v__DOT__maybe_close_next_bank)?"c":" ",
|
m_core->v__DOT__cmd);
|
(m_core->v__DOT__maybe_open_next_bank)?"o":" ",
|
|
(m_core->v__DOT__pre_valid)?"p":" ",
|
|
(m_core->v__DOT__w_r_valid)?"r":" ",
|
|
(m_core->v__DOT__w_s_valid)?"s":" ");
|
|
|
printf(" F%s%05x:%x/%s",
|
/*
|
(m_core->v__DOT__refresh_ztimer)?"Z":" ",
|
// Refresh logic
|
m_core->v__DOT__refresh_counter,
|
printf(" F%s%05x:%x/%s",
|
m_core->v__DOT__refresh_addr,
|
(m_core->v__DOT__refresh_ztimer)?"Z":" ",
|
(m_core->v__DOT__need_refresh)?"N":" ");
|
m_core->v__DOT__refresh_counter,
|
|
m_core->v__DOT__refresh_addr,
|
|
(m_core->v__DOT__need_refresh)?"N":" ");
|
|
*/
|
|
|
if (m_core->v__DOT__reset_override)
|
if (m_core->v__DOT__reset_override)
|
printf(" OVERRIDE");
|
printf(" OVERRIDE");
|
//if(m_core->v__DOT__last_open_bank)printf(" LST-OPEN");
|
//if(m_core->v__DOT__last_open_bank)printf(" LST-OPEN");
|
switch(cmd) {
|
switch(cmd) {
|
Line 223... |
Line 237... |
// Decode the command
|
// Decode the command
|
|
|
printf("\n");
|
printf("\n");
|
}
|
}
|
|
|
|
// A consistency check ...
|
|
/*
|
|
if (m_core->v__DOT__bus_fifo_head != m_core->v__DOT__bus_fifo_tail) {
|
|
fflush(stdout);
|
|
if (cmd == DDR_REFRESH)
|
|
printf("FAIL: CMD=REFRESH, but head != tail\n");
|
|
assert(cmd != DDR_REFRESH);
|
|
} */
|
|
|
m_core->eval();
|
m_core->eval();
|
m_core->i_clk = 0;
|
m_core->i_clk = 0;
|
m_core->eval();
|
m_core->eval();
|
|
|
m_tickcount++;
|
m_tickcount++;
|
Line 249... |
Line 272... |
|
|
void wb_tick(void) {
|
void wb_tick(void) {
|
m_core->i_wb_cyc = 0;
|
m_core->i_wb_cyc = 0;
|
m_core->i_wb_stb = 0;
|
m_core->i_wb_stb = 0;
|
tick();
|
tick();
|
|
assert(!m_core->o_wb_ack);
|
}
|
}
|
|
|
unsigned wb_read(unsigned a) {
|
unsigned wb_read(unsigned a) {
|
int errcount = 0;
|
int errcount = 0;
|
unsigned result;
|
unsigned result;
|
Line 274... |
Line 298... |
while((errcount++ < BOMBCOUNT)&&(!m_core->o_wb_ack))
|
while((errcount++ < BOMBCOUNT)&&(!m_core->o_wb_ack))
|
tick();
|
tick();
|
|
|
|
|
result = m_core->o_wb_data;
|
result = m_core->o_wb_data;
|
|
if (result != (*this)[a]) {
|
|
printf("READ-FAIL\n");
|
|
assert(result == (*this)[a]);
|
|
}
|
|
|
// Release the bus?
|
// Release the bus?
|
m_core->i_wb_cyc = 0;
|
m_core->i_wb_cyc = 0;
|
m_core->i_wb_stb = 0;
|
m_core->i_wb_stb = 0;
|
|
|
Line 288... |
Line 316... |
printf("SETTING ERR TO TRUE--NO ACK, NO TIMEOUT\n");
|
printf("SETTING ERR TO TRUE--NO ACK, NO TIMEOUT\n");
|
m_bomb = true;
|
m_bomb = true;
|
}
|
}
|
tick();
|
tick();
|
|
|
|
assert(m_core->v__DOT__bus_fifo_head == m_core->v__DOT__bus_fifo_tail);
|
|
|
|
assert(!m_core->o_wb_ack);
|
return result;
|
return result;
|
}
|
}
|
|
|
void wb_read(unsigned a, int len, unsigned *buf) {
|
void wb_read(unsigned a, int len, unsigned *buf) {
|
int errcount = 0;
|
int errcount = 0;
|
Line 323... |
Line 354... |
s = (m_core->o_wb_stall==0)?0:1;
|
s = (m_core->o_wb_stall==0)?0:1;
|
tick();
|
tick();
|
if (!s)
|
if (!s)
|
m_core->i_wb_addr += inc;
|
m_core->i_wb_addr += inc;
|
cnt += (s==0)?1:0;
|
cnt += (s==0)?1:0;
|
if (m_core->o_wb_ack)
|
if (m_core->o_wb_ack) {
|
buf[rdidx++] = m_core->o_wb_data;
|
buf[rdidx] = m_core->o_wb_data;
|
|
printf("WB-READ[%08x] = %08x\n", a+rdidx,
|
|
m_core->o_wb_data);
|
|
if (buf[rdidx] != (*this)[a+rdidx]) {
|
|
printf("READ-FAIL\n");
|
|
assert(buf[rdidx] == (*this)[a+rdidx]);
|
|
}
|
|
rdidx++;
|
|
}
|
} while((cnt < len)&&(errcount++ < THISBOMBCOUNT));
|
} while((cnt < len)&&(errcount++ < THISBOMBCOUNT));
|
|
|
m_core->i_wb_stb = 0;
|
m_core->i_wb_stb = 0;
|
|
|
while((rdidx < len)&&(errcount++ < THISBOMBCOUNT)) {
|
while((rdidx < len)&&(errcount++ < THISBOMBCOUNT)) {
|
tick();
|
tick();
|
if (m_core->o_wb_ack)
|
if (m_core->o_wb_ack) {
|
buf[rdidx++] = m_core->o_wb_data;
|
buf[rdidx] = m_core->o_wb_data;
|
|
printf("WB-READ[%08x] = %08x\n", a+rdidx,
|
|
m_core->o_wb_data);
|
|
if (buf[rdidx] != (*this)[a+rdidx]) {
|
|
printf("READ-FAIL\n");
|
|
assert(buf[rdidx] == (*this)[a+rdidx]);
|
|
}
|
|
rdidx++;
|
|
}
|
}
|
}
|
|
|
// Release the bus?
|
// Release the bus?
|
m_core->i_wb_cyc = 0;
|
m_core->i_wb_cyc = 0;
|
|
|
Line 346... |
Line 393... |
} else if (!m_core->o_wb_ack) {
|
} else if (!m_core->o_wb_ack) {
|
printf("SETTING ERR TO TRUE--NO ACK, NO TIMEOUT\n");
|
printf("SETTING ERR TO TRUE--NO ACK, NO TIMEOUT\n");
|
m_bomb = true;
|
m_bomb = true;
|
}
|
}
|
tick();
|
tick();
|
|
assert(m_core->v__DOT__bus_fifo_head == m_core->v__DOT__bus_fifo_tail);
|
|
assert(!m_core->o_wb_ack);
|
}
|
}
|
|
|
void wb_write(unsigned a, unsigned int v) {
|
void wb_write(unsigned a, unsigned int v) {
|
int errcount = 0;
|
int errcount = 0;
|
|
|
Line 376... |
Line 425... |
|
|
if(errcount >= BOMBCOUNT) {
|
if(errcount >= BOMBCOUNT) {
|
printf("SETTING ERR TO TRUE!!!!!\n");
|
printf("SETTING ERR TO TRUE!!!!!\n");
|
m_bomb = true;
|
m_bomb = true;
|
} tick();
|
} tick();
|
|
assert(m_core->v__DOT__bus_fifo_head == m_core->v__DOT__bus_fifo_tail);
|
|
assert(!m_core->o_wb_ack);
|
}
|
}
|
|
|
void wb_write(unsigned a, unsigned int ln, unsigned int *buf) {
|
void wb_write(unsigned a, unsigned int ln, unsigned int *buf) {
|
unsigned errcount = 0, nacks = 0;
|
unsigned errcount = 0, nacks = 0;
|
|
|
Line 416... |
Line 467... |
|
|
if(errcount >= BOMBCOUNT) {
|
if(errcount >= BOMBCOUNT) {
|
printf("SETTING ERR TO TRUE!!!!!\n");
|
printf("SETTING ERR TO TRUE!!!!!\n");
|
m_bomb = true;
|
m_bomb = true;
|
} tick();
|
} tick();
|
|
assert(m_core->v__DOT__bus_fifo_head == m_core->v__DOT__bus_fifo_tail);
|
|
assert(!m_core->o_wb_ack);
|
}
|
}
|
|
|
bool bombed(void) const { return m_bomb; }
|
bool bombed(void) const { return m_bomb; }
|
|
|
};
|
};
|
Line 484... |
Line 537... |
unsigned v, a;
|
unsigned v, a;
|
for(int i=0; i<8; i++) {
|
for(int i=0; i<8; i++) {
|
a = 1087 + i*1031;
|
a = 1087 + i*1031;
|
tb->wb_write(a, rdbuf[a]);
|
tb->wb_write(a, rdbuf[a]);
|
if ((v=tb->wb_read(a)) != rdbuf[a]) {
|
if ((v=tb->wb_read(a)) != rdbuf[a]) {
|
printf("CASE-1, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], a, v);
|
printf("CASE-2, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], a, v);
|
goto test_failure;
|
goto test_failure;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
Line 497... |
Line 550... |
unsigned v, a;
|
unsigned v, a;
|
for(int i=0; i<8; i++) {
|
for(int i=0; i<8; i++) {
|
a = 1109 + i*1024;
|
a = 1109 + i*1024;
|
tb->wb_write(a, rdbuf[a]);
|
tb->wb_write(a, rdbuf[a]);
|
if ((v=tb->wb_read(a)) != rdbuf[a]) {
|
if ((v=tb->wb_read(a)) != rdbuf[a]) {
|
printf("CASE-1, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], a, v);
|
printf("CASE-3, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], a, v);
|
goto test_failure;
|
goto test_failure;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
Line 509... |
Line 562... |
{
|
{
|
unsigned v, a;
|
unsigned v, a;
|
for(int i=0; i<8; i++) {
|
for(int i=0; i<8; i++) {
|
a = 1109 + i*1024;
|
a = 1109 + i*1024;
|
tb->wb_write(a, rdbuf[a]);
|
tb->wb_write(a, rdbuf[a]);
|
|
} for(int i=0; i<8; i++) {
|
|
a = 1109 + i*1024;
|
if ((v=tb->wb_read(a)) != rdbuf[a]) {
|
if ((v=tb->wb_read(a)) != rdbuf[a]) {
|
printf("CASE-1, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], a, v);
|
printf("CASE-4, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], a, v);
|
|
goto test_failure;
|
|
}
|
|
}
|
|
}
|
|
|
|
// And a quick pipeline test
|
|
{
|
|
unsigned v, mbuf[8], a = 379;
|
|
tb->wb_write(0, 8, &rdbuf[379]);
|
|
for(int i=0; i<8; i++) {
|
|
a = 379+i;
|
|
if ((v=(*tb)[i]) != rdbuf[a]) {
|
|
printf("CASE-5, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], i, v);
|
|
goto test_failure;
|
|
}
|
|
} tb->wb_read(0, 8, mbuf);
|
|
for(int i=0; i<8; i++) {
|
|
a = 379+i;
|
|
if (mbuf[i] != rdbuf[a]) {
|
|
printf("CASE-6, %08x -> MEM[%08x] -> %08x FAILED (R/W not equal)\n", rdbuf[a], i, mbuf[i]);
|
goto test_failure;
|
goto test_failure;
|
}
|
}
|
}
|
}
|
}
|
}
|
#endif
|
#endif
|
Line 556... |
Line 631... |
#endif
|
#endif
|
|
|
#ifdef BIGPIPELINE_WRITE
|
#ifdef BIGPIPELINE_WRITE
|
// Second test: Vector writes going through all memory, followed a
|
// Second test: Vector writes going through all memory, followed a
|
// massive vector read
|
// massive vector read
|
|
printf("Starting the big-pipeline write test\n");
|
uload(mlen, rdbuf); // Get some new values
|
uload(mlen, rdbuf); // Get some new values
|
tb->wb_write(0, mlen, rdbuf);
|
tb->wb_write(0, mlen, rdbuf);
|
if (tb->bombed())
|
if (tb->bombed())
|
goto test_failure;
|
goto test_failure;
|
for(int i=0; i<(int)mlen; i++) {
|
for(int i=0; i<(int)mlen; i++) {
|
Line 578... |
Line 654... |
for(int i=0; i<(int)mlen; i++)
|
for(int i=0; i<(int)mlen; i++)
|
(*tb)[i] = rdbuf[i];
|
(*tb)[i] = rdbuf[i];
|
#endif // BIGPIPELINE_WRITE && BIGPIPELINE_READ
|
#endif // BIGPIPELINE_WRITE && BIGPIPELINE_READ
|
#endif
|
#endif
|
#ifdef BIGPIPELINE_READ
|
#ifdef BIGPIPELINE_READ
|
|
printf("Starting the big-pipeline read test\n");
|
tb->wb_read( 0, mlen, mbuf);
|
tb->wb_read( 0, mlen, mbuf);
|
if (tb->bombed())
|
if (tb->bombed())
|
goto test_failure;
|
goto test_failure;
|
for(int i=0; i<(int)mlen; i++) {
|
for(int i=0; i<(int)mlen; i++) {
|
if (rdbuf[i] != mbuf[i]) {
|
if (rdbuf[i] != mbuf[i]) {
|
Line 591... |
Line 668... |
}
|
}
|
}
|
}
|
#endif
|
#endif
|
|
|
#ifdef PRIMEVEC_WRITE
|
#ifdef PRIMEVEC_WRITE
|
|
printf("Starting the prime-vector write test\n");
|
// Third test: Vector writes going through all memory, in prime numbers
|
// Third test: Vector writes going through all memory, in prime numbers
|
// of values at a time, followed by reads via a different prime number
|
// of values at a time, followed by reads via a different prime number
|
uload(mlen, rdbuf); // Get some new values
|
uload(mlen, rdbuf); // Get some new values
|
{
|
{
|
int nw = 3;
|
int nw = 3;
|