Line 93... |
Line 93... |
m_reset_state = 0;
|
m_reset_state = 0;
|
m_reset_counts= 0;
|
m_reset_counts= 0;
|
m_bus = new BUSTIMESLOT[NTIMESLOTS];
|
m_bus = new BUSTIMESLOT[NTIMESLOTS];
|
for(int i=0; i<NTIMESLOTS; i++)
|
for(int i=0; i<NTIMESLOTS; i++)
|
m_bus[i].m_used = 0;
|
m_bus[i].m_used = 0;
|
|
for(int i=0; i<NTIMESLOTS; i++)
|
|
m_bus[i].m_rtt = 0;
|
m_busloc = 0;
|
m_busloc = 0;
|
}
|
}
|
|
|
unsigned DDRSDRAMSIM::operator()(int reset_n, int cke,
|
unsigned DDRSDRAMSIM::operator()(int reset_n, int cke,
|
int csn, int rasn, int casn, int wen,
|
int csn, int rasn, int casn, int wen,
|
int dqs, int dm, int odt, int busoe,
|
int dqs, int dm, int odt, int busoe,
|
int addr, int ba, int data) {
|
int addr, int ba, int data) {
|
|
BUSTIMESLOT *ts, *nxtts;
|
int cmd = (reset_n?0:32)|(cke?0:16)|(csn?8:0)
|
int cmd = (reset_n?0:32)|(cke?0:16)|(csn?8:0)
|
|(rasn?4:0)|(casn?2:0)|(wen?1:0);
|
|(rasn?4:0)|(casn?2:0)|(wen?1:0);
|
|
|
if ((m_reset_state!=0)&&(reset_n==0)) {
|
if ((m_reset_state!=0)&&(reset_n==0)) {
|
m_reset_state = 0;
|
m_reset_state = 0;
|
m_reset_counts = 0;
|
m_reset_counts = 0;
|
} else if (m_reset_state < 16) {
|
} else if (m_reset_state < 16) {
|
switch(m_reset_state) {
|
switch(m_reset_state) {
|
Line 352... |
Line 355... |
default: // We are deselecteda
|
default: // We are deselecteda
|
for(int i=0; i<NBANKS; i++)
|
for(int i=0; i<NBANKS; i++)
|
m_bank[i].tick(DDR_NOOP,addr);
|
m_bank[i].tick(DDR_NOOP,addr);
|
break;
|
break;
|
}
|
}
|
|
|
|
if (true) {
|
|
bool flag = false;
|
|
for(int i=0; i<5; i++) {
|
|
int bl = (m_busloc+1+i)&(NTIMESLOTS-1);
|
|
nxtts = &m_bus[bl];
|
|
if (nxtts->m_used) {
|
|
flag = true;
|
|
break;
|
|
}
|
|
} if (flag) {
|
|
printf("DQS = %d BUSLOC = %d\n", dqs, (m_busloc+1)&(NTIMESLOTS-1));
|
|
for(int i=0; i<5; i++) {
|
|
int bl = (m_busloc+1+i)&(NTIMESLOTS-1);
|
|
nxtts = &m_bus[bl];
|
|
printf("BUS[%2d] ", bl);
|
|
if (nxtts->m_used)
|
|
printf(" USED");
|
|
if (nxtts->m_read)
|
|
printf(" READ");
|
|
if (nxtts->m_rtt)
|
|
printf(" RTT");
|
|
printf("\n");
|
|
}}
|
|
}
|
|
|
|
ts = &m_bus[(m_busloc+1)&(NTIMESLOTS-1)];
|
|
if (dqs)
|
|
assert((ts->m_rtt)&&(m_last_rtt));
|
|
else if (!m_last_dqs)
|
|
assert(!m_last_rtt);
|
}
|
}
|
|
|
m_busloc = (m_busloc+1)&(NTIMESLOTS-1);
|
m_busloc = (m_busloc+1)&(NTIMESLOTS-1);
|
|
|
BUSTIMESLOT *ts = &m_bus[m_busloc];
|
ts = &m_bus[m_busloc];
|
|
nxtts = &m_bus[(m_busloc+1)&(NTIMESLOTS-1)];
|
unsigned vl = ts->m_data;
|
unsigned vl = ts->m_data;
|
assert( ((!ts->m_used)||(busoe))
|
assert( ((!ts->m_used)||(busoe))
|
|| ((ts->m_used)&&(ts->m_read)));
|
|| ((ts->m_used)&&(ts->m_read)&&(!busoe))
|
|
|| ((ts->m_used)&&(!ts->m_read)&&(busoe))
|
|
);
|
|
|
|
m_last_dqs = dqs;
|
|
m_last_rtt = ts->m_rtt;
|
|
|
|
if (ts->m_used) {
|
|
if (ts->m_read)
|
|
assert((!dqs)&&(!m_last_dqs));
|
|
else
|
|
assert((dqs) && (m_last_dqs));
|
|
} else if (!nxtts->m_used)
|
|
assert(!dqs);
|
|
|
assert((!ts->m_used)||(ts->m_addr < (unsigned)m_memlen));
|
assert((!ts->m_used)||(ts->m_addr < (unsigned)m_memlen));
|
if ((ts->m_used)&&(!ts->m_read)&&(!dm)) {
|
if ((ts->m_used)&&(!ts->m_read)&&(!dm)) {
|
printf(PREFIX "::Setting MEM[%08x] = %08x\n", ts->m_addr, data);
|
printf(PREFIX "::Setting MEM[%08x] = %08x\n", ts->m_addr, data);
|
m_mem[ts->m_addr] = data;
|
m_mem[ts->m_addr] = data;
|
}
|
}
|
|
|
|
m_bus[(m_busloc+3)&(NTIMESLOTS-1)].m_rtt = (odt)&&(reset_n);
|
ts->m_used = 0;
|
ts->m_used = 0;
|
ts->m_read = 0;
|
ts->m_read = 0;
|
ts->m_addr = -1;
|
ts->m_addr = -1;
|
|
ts->m_rtt = 0;
|
return (!busoe)?vl:data;
|
return (!busoe)?vl:data;
|
}
|
}
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|