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

Subversion Repositories wbddr3

[/] [wbddr3/] [trunk/] [bench/] [cpp/] [ddrsdramsim.cpp] - Diff between revs 14 and 16

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

Rev 14 Rev 16
Line 36... Line 36...
//
//
//
//
#include <stdio.h>
#include <stdio.h>
#include <assert.h>
#include <assert.h>
 
 
#define PREFIX  "DDR3-SDRAM"
 
const unsigned ckCL = 5,
 
                ckRC = 10,
 
                ckRAS = 7,
 
                ckRFC = 320, // Clocks from refresh to activate
 
                ckREFI = 1560; // 7.8us @ 200MHz = 7.8e-6 * 200e6 = 1560
 
/*
 
const unsigned  nREF = 4,
 
                ckREFIn = nREF*ckREFI - (nREF-1) * ckRFC;
 
*/
 
const unsigned  nREF = 1,
 
                ckREFIn = ckREFI;
 
 
 
#include "ddrsdramsim.h"
#include "ddrsdramsim.h"
 
 
 
#define PREFIX  "DDR3-SDRAM"
 
const unsigned ckCL = 6,
 
                ckCWL = 5,
 
                ckRP = 6,
 
                ckWR = 6,
 
                ckRAS = 15,
 
                ckRC = 20,
 
                ckMRD = 4,
 
                ckMOD = 12,
 
                ckZQinit = 512,
 
                ckODT = ckCWL-2,
 
                ckRFC = 64, // Clocks from refresh to activate
 
                ckREFI = 1560*NWIDTH, // 7.8us @ 200MHz = 7.8e-6 * 200e6 = 1560
 
                DDR_MR2 = 0x0040 | (((ckCWL-5)&7)<<3),
 
                DDR_MR1 = 0x0044,
 
                DDR_MR0 = 0x0000 | (((ckCL-4)&0x07)<<4) | ((ckCL>11)?0x4:0)
 
                                |((ckWR==16)?0
 
                                        :(ckWR>=8)?((((ckWR-8)>>1)+8)<<9)
 
                                        :((ckWR-5+1)<<9)),
 
                nREF = 1;
 
 
BANKINFO::BANKINFO(void) {
BANKINFO::BANKINFO(void) {
        m_state = 0; m_row = 0; m_wcounter = 0; m_min_time_before_precharge=0;
        m_state = 0; m_row = 0; m_wcounter = 0; m_min_time_before_precharge=0;
}
}
 
 
void    BANKINFO::tick(int cmd, unsigned addr) {
void    BANKINFO::tick(int cmd, unsigned addr) {
Line 63... Line 71...
        switch(cmd) {
        switch(cmd) {
                case DDR_REFRESH:
                case DDR_REFRESH:
                        assert(m_state == 0);
                        assert(m_state == 0);
                        break;
                        break;
                case DDR_PRECHARGE:
                case DDR_PRECHARGE:
                        m_state = 6;
                        // assert((m_state&((1<<ckRP)-1)) == ((1<<ckRP)-1));
 
                        m_state &= -2;
                        // While the specification allows precharging an already
                        // While the specification allows precharging an already
                        // precharged bank, we can keep that from happening
                        // precharged bank, we can keep that from happening
                        // here:
                        // here:
                        // assert(m_state&7);
                        // assert(m_state&7);
                        // Only problem is, this will currently break our
                        // Only problem is, this will currently break our
                        // refresh logic.
                        // refresh logic.
                        if (m_min_time_before_precharge != 0) {
                        /*
                                printf("BANK-FAIL: TIME-BEFORE-PRECHARGE = %d (should be zero)\n", m_min_time_before_precharge);
                        if (m_min_time_before_precharge != 0) {
                                assert(m_min_time_before_precharge == 0);
                                printf("BANK-FAIL: TIME-BEFORE-PRECHARGE = %d (should be zero)\n", m_min_time_before_precharge);
                        } if (m_min_time_before_activate != 0) {
                                assert(m_min_time_before_precharge == 0);
                                printf("BANK-FAIL: TIME-BEFORE-ACTIVATE = %d (should be zero)\n", m_min_time_before_activate);
                        } if (m_min_time_before_activate != 0) {
                                assert(m_min_time_before_activate==0);
                                printf("BANK-FAIL: TIME-BEFORE-ACTIVATE = %d (should be zero)\n", m_min_time_before_activate);
                        }
                                assert(m_min_time_before_activate==0);
 
                        }
 
                        */
                        break;
                        break;
                case DDR_ACTIVATE:
                case DDR_ACTIVATE:
 
                        assert((m_state&((1<<ckRP)-1)) == 0);
                        if (((m_state&7)!=0)&&((addr&0x7fff) != m_row)) {
                        if (((m_state&7)!=0)&&((addr&0x7fff) != m_row)) {
                                printf("BANK-FAIL: Attempt to Activate an already active bank without closing it first (m_state = %x)\n", m_state);
                                printf("BANK-FAIL: Attempt to Activate an already active bank without closing it first (m_state = %x)\n", m_state);
                                assert((m_state&7)==0);
                                assert((m_state&7)==0);
                        }
                        }
                        if (m_wcounter != 0) {
 
                                printf("BANK-FAIL: ACTIVATE too soon after write (wcounter = %d)\n", m_wcounter);
                        /*
                                assert(m_wcounter == 0);
                        if (m_wcounter != 0) {
                        } if (m_min_time_before_activate!=0) {
                                printf("BANK-FAIL: ACTIVATE too soon after write (wcounter = %d)\n", m_wcounter);
                                printf("BANK-FAIL: ACTIVATE too soon after last activate, (ctr=%d)\n", m_min_time_before_activate);
                                assert(m_wcounter == 0);
                                assert(m_min_time_before_activate==0);
                        } if (m_min_time_before_activate!=0) {
                        }
                                printf("BANK-FAIL: ACTIVATE too soon after last activate, (ctr=%d)\n", m_min_time_before_activate);
 
                                assert(m_min_time_before_activate==0);
 
                        }
 
                        */
                        m_state = 1;
                        m_state = 1;
                        m_row = addr & 0x7fff;
                        m_row = addr & 0x7fff;
 
printf("BANK -- Setting address to %04x\n", m_row);
                        m_min_time_before_precharge = ckRAS;
                        m_min_time_before_precharge = ckRAS;
                        m_min_time_before_activate = ckRC;
                        m_min_time_before_activate = ckRC;
                        break;
                        break;
                case DDR_READ: case DDR_WRITE:
                case DDR_READ: case DDR_WRITE:
                        if (DDR_READ)
                        if (DDR_READ)
                                assert(m_wcounter == 0);
                                assert(m_wcounter == 0);
                        else
                        else
                                m_wcounter = 3+4+4;
                                m_wcounter = 3+4+4;
                        assert((m_state&7) == 7);
                        if ((m_state&((1<<ckRP)-1)) != ((1<<ckRP)-1)) {
 
                                printf(PREFIX "::R/W Error: m_state = %08x, ckRP = %d (%08x)\n",
 
                                        m_state, ckRP, ((1<<ckRP)-1));
 
                                assert((m_state&((1<<ckRP)-1)) == ((1<<ckRP)-1));
 
                        }
                        if (m_min_time_before_precharge)
                        if (m_min_time_before_precharge)
                                m_min_time_before_precharge--;
                                m_min_time_before_precharge--;
                        if (m_min_time_before_activate)
                        if (m_min_time_before_activate)
                                m_min_time_before_activate--;
                                m_min_time_before_activate--;
                        break;
                        break;
                case DDR_ZQS:
                case DDR_ZQS:
                        assert((m_state&7) == 0);
                        assert((m_state&((1<<ckRP)-1)) == 0);
                        if (m_min_time_before_precharge)
                        if (m_min_time_before_precharge)
                                m_min_time_before_precharge--;
                                m_min_time_before_precharge--;
                        if (m_min_time_before_activate)
                        if (m_min_time_before_activate)
                                m_min_time_before_activate--;
                                m_min_time_before_activate--;
                        break;
                        break;
                case DDR_NOOP:
                case DDR_NOOP:
                        m_state <<= 1;
                        m_state <<= 1;
                        m_state |= (m_state&2)>>1;
                        m_state |= (m_state&2)>>1;
                        m_state &= 0x0f;
                        m_state &= ((1<<ckRP)-1);
                        if (m_min_time_before_precharge)
                        if (m_min_time_before_precharge)
                                m_min_time_before_precharge--;
                                m_min_time_before_precharge--;
                        if (m_min_time_before_activate)
                        if (m_min_time_before_activate)
                                m_min_time_before_activate--;
                                m_min_time_before_activate--;
                        break;
                        break;
Line 134... Line 154...
DDRSDRAMSIM::DDRSDRAMSIM(int lglen) {
DDRSDRAMSIM::DDRSDRAMSIM(int lglen) {
        m_memlen = (1<<(lglen-2));
        m_memlen = (1<<(lglen-2));
        m_mem = new unsigned[m_memlen];
        m_mem = new unsigned[m_memlen];
        m_reset_state = 0;
        m_reset_state = 0;
        m_reset_counts= 0;
        m_reset_counts= 0;
 
        assert(NTIMESLOTS > ckCL+3);
        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++)
        for(int i=0; i<NTIMESLOTS; i++)
                m_bus[i].m_rtt = 0;
                m_bus[i].m_rtt = 0;
        m_busloc = 0;
        m_busloc = 0;
}
}
 
 
unsigned DDRSDRAMSIM::operator()(int reset_n, int cke,
unsigned DDRSDRAMSIM::apply(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;
        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)
Line 154... Line 175...
 
 
        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) {
 
                // printf(PREFIX "::Reset-CMD = %02x,BA=%d,ADDR=%04x, counts = %d\n", cmd, ba, addr, m_reset_counts);
                switch(m_reset_state) {
                switch(m_reset_state) {
                case 0:
                case 0:
                        m_reset_counts++;
                        m_reset_counts++;
                        if (reset_n) {
                        if (reset_n) {
                                assert(m_reset_counts > 40000);
                                assert(m_reset_counts > 40000*NWIDTH);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 1;
                                m_reset_state = 1;
                        } break;
                        } break;
                case 1:
                case 1:
                        m_reset_counts++;
                        m_reset_counts++;
                        if (cke) {
                        if (cke) {
                                assert(m_reset_counts > 100000);
                                assert(m_reset_counts > 100000*NWIDTH);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 2;
                                m_reset_state = 2;
                        } break;
                        } break;
                case 2:
                case 2:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        if (cmd != DDR_NOOP) {
                        if (cmd != DDR_NOOP) {
                                assert(m_reset_counts > 147);
                                assert(m_reset_counts > (int)(ckRFC+2*NWIDTH));
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 3;
                                m_reset_state = 3;
                                assert(cmd == DDR_MRSET);
                                assert(cmd == DDR_MRSET);
                                // Set MR2
                                // Set MR2
                                assert(ba == 2);
                                assert(ba == 2);
                                assert(addr == 0x040);
                                printf(PREFIX "::Checking DDR-MR2(%04x) against %04x\n", addr, DDR_MR2);
 
                                assert(addr == DDR_MR2);
                        } break;
                        } break;
                case 3:
                case 3:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        if (cmd != DDR_NOOP) {
                        if (cmd != DDR_NOOP) {
                                // assert(m_reset_counts > 3);
                                assert(m_reset_counts >= (int)ckMRD);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 4;
                                m_reset_state = 4;
                                assert(cmd == DDR_MRSET);
                                assert(cmd == DDR_MRSET);
                                // Set MR1
                                // Set MR1
                                assert(ba == 1);
                                assert(ba == 1);
                                assert(addr == 0x844);
                                assert(addr == DDR_MR1);
                        } break;
                        } break;
                case 4:
                case 4:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        if (cmd != DDR_NOOP) {
                        if (cmd != DDR_NOOP) {
                                printf(PREFIX "::RESET-CMD[4]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                printf(PREFIX "::RESET-CMD[4]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                assert(m_reset_counts > 3);
                                assert(m_reset_counts >= (int)ckMRD);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 5;
                                m_reset_state = 5;
                                assert(cmd == DDR_MRSET);
                                assert(cmd == DDR_MRSET);
                                // Set MR0
                                // Set MR0
                                assert(ba == 0);
                                assert(ba == 0);
                                assert(addr == 0x210);
                                assert(addr == DDR_MR0);
                        } break;
                        } break;
                case 5:
                case 5:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        if (cmd != DDR_NOOP) {
                        if (cmd != DDR_NOOP) {
                                printf(PREFIX "::RESET-CMD[5]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                printf(PREFIX "::RESET-CMD[5]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                assert(m_reset_counts > 11);
                                assert(m_reset_counts >= (int)ckMOD);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 6;
                                m_reset_state = 6;
                                assert(cmd == DDR_ZQS);
                                assert(cmd == DDR_ZQS);
                                assert(addr == 0x400);
                                assert(addr == 0x400);
                        } break;
                        } break;
                case 6:
                case 6:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        if (cmd != DDR_NOOP) {
                        if (cmd != DDR_NOOP) {
                                printf(PREFIX "::RESET-CMD[6]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                printf(PREFIX "::RESET-CMD[6]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                assert(m_reset_counts > 512);
                                assert(m_reset_counts >= (int)ckZQinit);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 7;
                                m_reset_state = 7;
                                assert(cmd == DDR_PRECHARGE);
                                assert(cmd == DDR_PRECHARGE);
                                assert(addr == 0x400);
                                assert(addr == 0x400);
                        } break;
                        } break;
                case 7:
                case 7:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        if (cmd != DDR_NOOP) {
                        if (cmd != DDR_NOOP) {
                                printf(PREFIX "::RESET-CMD[7]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                printf(PREFIX "::RESET-CMD[7]: %d:%08x[%d]@0x%04x\n", cmd, m_reset_counts, ba, addr);
                                assert(m_reset_counts > 3);
                                assert(m_reset_counts >= (int)ckRP);
                                m_reset_counts = 0;
                                m_reset_counts = 0;
                                m_reset_state = 8;
                                m_reset_state = 8;
                                assert(cmd == DDR_REFRESH);
                                assert(cmd == DDR_REFRESH);
                                m_clocks_since_refresh = 0;
                                m_clocks_since_refresh = 0;
                        } break;
                        } break;
                case 8:
                case 8:
                        m_reset_counts++;
                        m_reset_counts++;
                        assert(cke);
                        assert(cke);
                        assert(cmd == DDR_NOOP);
                        assert(cmd == DDR_NOOP);
                        if (m_reset_counts > 140) {
                        if (m_reset_counts > (int)ckRFC) {
                                m_reset_state = 16;
                                m_reset_state = 16;
                                printf(PREFIX ": Leaving reset state\n");
                                printf(PREFIX ": Leaving reset state\n");
                        }
                        }
                        break;
                        break;
                default:
                default:
Line 280... Line 303...
                        printf(PREFIX "::Refresh cycle complete\n");
                        printf(PREFIX "::Refresh cycle complete\n");
        } else {
        } else {
                // In operational mode!!
                // In operational mode!!
 
 
                m_clocks_since_refresh++;
                m_clocks_since_refresh++;
                assert(m_clocks_since_refresh < (int)ckREFIn);
                if (m_clocks_since_refresh > (int)ckREFI) {
 
                        printf(PREFIX "::ERROR! Clocks since refresh = %d, which isn\'t less than %d\n", m_clocks_since_refresh, ckREFI);
 
                }
 
                assert(m_clocks_since_refresh <= (int)ckREFI);
                switch(cmd) {
                switch(cmd) {
                case DDR_MRSET:
                case DDR_MRSET:
                        assert(0&&"Modes should only be set in reset startup");
                        assert(0&&"Modes should only be set in reset startup");
                        for(int i=0; i<NBANKS; i++)
                        for(int i=0; i<NBANKS; i++)
                                m_bank[i].tick(DDR_MRSET,0);
                                m_bank[i].tick(DDR_MRSET,0);
Line 296... Line 322...
                        assert(0 && "Internal err: Refresh should be handled above");
                        assert(0 && "Internal err: Refresh should be handled above");
                        break;
                        break;
                case DDR_PRECHARGE:
                case DDR_PRECHARGE:
                        if (addr & 0x400) {
                        if (addr & 0x400) {
                                // Precharge all
                                // Precharge all
 
                                printf(PREFIX "::Precharging all banks\n");
                                for(int i=0; i<NBANKS; i++)
                                for(int i=0; i<NBANKS; i++)
                                        m_bank[i].tick(DDR_PRECHARGE,0);
                                        m_bank[i].tick(DDR_PRECHARGE,0);
                        } else {
                        } else {
 
                                printf(PREFIX "::Precharging bank [%d]\n", ba);
                                m_bank[ba].tick(DDR_PRECHARGE,0);
                                m_bank[ba].tick(DDR_PRECHARGE,0);
                                for(int i=0; i<NBANKS; i++)
                                for(int i=0; i<NBANKS; i++)
                                        if (ba != i)
                                        if (ba != i)
                                                m_bank[i].tick(DDR_NOOP,0);
                                                m_bank[i].tick(DDR_NOOP,0);
                        }
                        }
                        break;
                        break;
                case DDR_ACTIVATE:
                case DDR_ACTIVATE:
 
                        if (m_clocks_since_refresh < (int)ckRFC) {
 
                                printf(PREFIX "::ACTIVATE -- not enough clocks since refresh, %d < %d should be true\n", m_clocks_since_refresh, ckRFC);
                        assert(m_clocks_since_refresh >= (int)ckRFC);
                        assert(m_clocks_since_refresh >= (int)ckRFC);
 
                        }
                        printf(PREFIX "::Activating bank %d, address %08x\n", ba, addr);
                        printf(PREFIX "::Activating bank %d, address %08x\n", ba, addr);
                        m_bank[ba].tick(DDR_ACTIVATE,addr);
                        m_bank[ba].tick(DDR_ACTIVATE,addr);
                        for(int i=0; i<NBANKS; i++)
                        for(int i=0; i<NBANKS; i++)
                                if (i!=ba) m_bank[i].tick(DDR_NOOP,0);
                                if (i!=ba) m_bank[i].tick(DDR_NOOP,0);
                        break;
                        break;
Line 328... Line 359...
                                caddr |= addr;
                                caddr |= addr;
                                caddr &= ~7;
                                caddr &= ~7;
                                caddr >>= 1;
                                caddr >>= 1;
 
 
                                BUSTIMESLOT *tp;
                                BUSTIMESLOT *tp;
                                int     offset = m_busloc+ckCL+1;
                                int     offset = m_busloc+ckCWL+1;
 
 
                                tp = &m_bus[(offset+0)&(NTIMESLOTS-1)];
                                tp = &m_bus[(offset+0)&(NTIMESLOTS-1)];
                                // printf("Setting bus timeslots from (now=%d)+%d=%d to now+%d+3\n", m_busloc, ckCL,(m_busloc+ckCL)&(NTIMESLOTS-1), ckCL);
                                // printf("Setting bus timeslots from (now=%d)+%d=%d to now+%d+3\n", m_busloc, ckCL,(m_busloc+ckCL)&(NTIMESLOTS-1), ckCL);
                                tp->m_addr = caddr  ;
                                tp->m_addr = caddr  ;
                                tp->m_used = 1;
                                tp->m_used = 1;
Line 368... Line 399...
                                caddr &= ~7;
                                caddr &= ~7;
                                caddr >>= 1;
                                caddr >>= 1;
 
 
                                BUSTIMESLOT *tp;
                                BUSTIMESLOT *tp;
 
 
 
                                printf(PREFIX"::READ(%03x:%d:%03x => %08x) Queuing %08x:%08x:%08x:%08x\n",
 
                                        m_bank[ba].m_row, ba, addr,
 
                                        caddr,
 
                                        m_mem[caddr  ], m_mem[caddr+1],
 
                                        m_mem[caddr+2], m_mem[caddr+3]);
                                int offset = (m_busloc+ckCL+1)&(NTIMESLOTS-1);
                                int offset = (m_busloc+ckCL+1)&(NTIMESLOTS-1);
                                tp = &m_bus[(offset)&(NTIMESLOTS-1)];
                                tp = &m_bus[(offset)&(NTIMESLOTS-1)];
                                tp->m_data = m_mem[caddr];
                                tp->m_data = m_mem[caddr];
                                tp->m_addr = caddr;
                                tp->m_addr = caddr;
                                tp->m_used = 1;
                                tp->m_used = 1;
Line 416... Line 452...
                                if (nxtts->m_used) {
                                if (nxtts->m_used) {
                                        flag = true;
                                        flag = true;
                                        break;
                                        break;
                                }
                                }
                        } if (flag) {
                        } if (flag) {
                        printf("DQS = %d BUSLOC = %d\n", dqs, (m_busloc+1)&(NTIMESLOTS-1));
                        printf(PREFIX "::DQS = %d BUSLOC = %d\n", dqs, (m_busloc+1)&(NTIMESLOTS-1));
                        for(int i=0; i<5; i++) {
                        for(int i=0; i<5; i++) {
                                int bl = (m_busloc+1+i)&(NTIMESLOTS-1);
                                int bl = (m_busloc+1+i)&(NTIMESLOTS-1);
                                nxtts = &m_bus[bl];
                                nxtts = &m_bus[bl];
                                printf("BUS[%2d] ", bl);
                                printf("BUS[%2d] ", bl);
                                if (nxtts->m_used)
                                if (nxtts->m_used)
Line 432... Line 468...
                                printf("\n");
                                printf("\n");
                        }}
                        }}
                }
                }
 
 
                ts = &m_bus[(m_busloc+1)&(NTIMESLOTS-1)];
                ts = &m_bus[(m_busloc+1)&(NTIMESLOTS-1)];
                if (dqs)
                if (dqs) {
 
                        /*
 
                        if ((!ts->m_rtt)||(!m_last_rtt)) {
 
                                printf(PREFIX "ODT(dqs is true) m_rtt is %s and last_rtt is %s.  Both should be true if DQS.  (ERROR!)\n",
 
                                        (ts->m_rtt)?"true":"false",
 
                                        (m_last_rtt)?"true":"false");
 
                        } */
                        assert((ts->m_rtt)&&(m_last_rtt));
                        assert((ts->m_rtt)&&(m_last_rtt));
                else if (!m_last_dqs)
                } else if (!m_last_dqs)
                        assert(!m_last_rtt);
                        assert(!m_last_rtt);
        }
        }
 
 
        m_busloc = (m_busloc+1)&(NTIMESLOTS-1);
        m_busloc = (m_busloc+1)&(NTIMESLOTS-1);
 
 
        ts = &m_bus[m_busloc];
        ts = &m_bus[m_busloc];
        nxtts = &m_bus[(m_busloc+1)&(NTIMESLOTS-1)];
        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)&&(!busoe))
                || ((ts->m_used)&&(ts->m_read)&&(!busoe))
                || ((ts->m_used)&&(!ts->m_read)&&(busoe))
                || ((ts->m_used)&&(!ts->m_read)&&(busoe))
                );
                );
 
 
Line 460... Line 503...
                        assert((dqs) && (m_last_dqs));
                        assert((dqs) && (m_last_dqs));
        } else if (!nxtts->m_used)
        } else if (!nxtts->m_used)
                assert(!dqs);
                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 != 0x0f)) {
                printf(PREFIX "::Setting MEM[%08x] = %08x\n", ts->m_addr, data);
                printf(PREFIX "::Setting MEM[%08x] = %08x (%02x)\n", ts->m_addr, data, dm);
                m_mem[ts->m_addr] = data;
                unsigned mask = 0;
 
                if (dm&0x08) mask = 0x0ff;
 
                mask <<= 8; if (dm&0x004) mask |= 0x0ff;
 
                mask <<= 8; if (dm&0x002) mask |= 0x0ff;
 
                mask <<= 8; if (dm&0x001) mask |= 0x0ff;
 
                m_mem[ts->m_addr] = (data & (~mask)) | (m_mem[ts->m_addr]&mask);
 
        } else if ((ts->m_used)&&(ts->m_read)) {
 
                printf(PREFIX ":: %08x\n", vl);
        }
        }
 
 
        m_bus[(m_busloc+3)&(NTIMESLOTS-1)].m_rtt = (odt)&&(reset_n);
        m_bus[(m_busloc+ckODT-1)&(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;
        ts->m_rtt  = 0;
        return (!busoe)?vl:data;
        return (!busoe)?vl:data;

powered by: WebSVN 2.1.0

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