Ignore:
Timestamp:
Sep 2, 2010, 2:22:12 PM (14 years ago)
Author:
guthmull
Message:

Add broadcast limitation compatibility, indicate the type of response when possible

Location:
trunk/modules/vci_mem_cache_v2/caba/source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_mem_cache_v2/caba/source/include/vci_mem_cache_v2.h

    r2 r82  
    334334      const soclib::common::AddressMaskingTable<vci_addr_t>   m_nline;
    335335
     336      // broadcast address
     337      vci_addr_t broadcast_addr;
     338
    336339      //////////////////////////////////////////////////
    337340      // Others registers
     
    448451      sc_signal<copy_t>    r_write_to_init_cmd_d_copies;    // bit_vector of L1 to update
    449452      sc_signal<data_t>   *r_write_to_init_cmd_data;        // data (one cache line)
    450       sc_signal<bool>     *r_write_to_init_cmd_we;              // word enable
     453      sc_signal<be_t>     *r_write_to_init_cmd_be;              // word enable
    451454      sc_signal<size_t>    r_write_to_init_cmd_count;       // number of words in line
    452455      sc_signal<size_t>    r_write_to_init_cmd_index;       // index of first word in line
  • trunk/modules/vci_mem_cache_v2/caba/source/src/vci_mem_cache_v2.cpp

    r59 r82  
    3434//#define DEBUG_VCI_MEM_CACHE 1
    3535#define RANDOMIZE_SC
     36#define DEBUG_START_CYCLE 33069000
    3637
    3738namespace soclib { namespace caba {
     
    295296
    296297
     298      // Set the broadcast address with Xmin,Xmax,Ymin,Ymax set to maximum
     299      broadcast_addr = 0x3 | (0x7C1F << (vci_param::N-20));
     300
    297301      // Get the segments associated to the MemCache
    298302      std::list<soclib::common::Segment>::iterator seg;
     
    348352      r_write_be                                = new sc_signal<be_t>[nwords];
    349353      r_write_to_init_cmd_data          = new sc_signal<data_t>[nwords];
    350       r_write_to_init_cmd_we            = new sc_signal<bool>[nwords];
     354      r_write_to_init_cmd_be            = new sc_signal<be_t>[nwords];
    351355      r_write_to_ixr_cmd_data       = new sc_signal<data_t>[nwords];
    352356
     
    530534
    531535#if DEBUG_VCI_MEM_CACHE
     536if(m_cpt_cycles > DEBUG_START_CYCLE){
    532537    std::cout << "---------------------------------------------" << std::dec << std::endl;
    533538    std::cout << "MEM_CACHE " << m_srcid_ini << " ; Time = " << m_cpt_cycles << std::endl
     
    546551      << " - ALLOC_TRT FSM = " << alloc_trt_fsm_str[r_alloc_trt_fsm] << std::endl
    547552      << " - ALLOC_UPT FSM = " << alloc_upt_fsm_str[r_alloc_upt_fsm] << std::endl;
     553}
    548554#endif
    549555
     
    700706            bool valid  = m_update_tab.decrement(r_init_rsp_upt_index.read(), count);
    701707#ifdef IDEBUG
     708if(m_cpt_cycles > DEBUG_START_CYCLE){
    702709        std::cout << sc_time_stamp() << " " << name() << " INIT_RSP_UPT_LOCK update table : " << std::endl;
    703710        m_update_tab.print();
     711}
    704712#endif
    705713            assert ( valid
     
    724732            m_update_tab.clear(r_init_rsp_upt_index.read());
    725733#ifdef IDEBUG
     734if(m_cpt_cycles > DEBUG_START_CYCLE){
    726735        std::cout << sc_time_stamp() << " " << name() << " INIT_RSP_UPT_CLEAR update table : " << std::endl;
    727736        m_update_tab.print();
     737}
    728738#endif
    729739          }
     
    777787            DirectoryEntry entry = m_cache_directory.read(m_cmd_read_addr_fifo.read(), way);
    778788#ifdef DDEBUG
     789if(m_cpt_cycles > DEBUG_START_CYCLE){
    779790           std::cout << "In READ_DIR_LOCK printing the entry of address is : " << std::hex << m_cmd_read_addr_fifo.read() << std::endl;
    780791           entry.print();
    781792           std::cout << "done" << std::endl;
     793}
    782794#endif
    783795
     
    832844              }
    833845              if(!inst_read && !is_cnt){ // Data read, vector mode
    834                 assert(!(r_read_d_copies.read() & (0x1 << m_cmd_read_srcid_fifo.read())) && "MemCache Error : processor read on an already owned cache line");
     846                if(r_read_d_copies.read() & (0x1 << m_cmd_read_srcid_fifo.read())) {
     847                    std::cout << "MemCache Error : processor read on an already owned cache line, Time : " << m_cpt_cycles << std::endl;
     848                    exit(0);
     849                }
    835850                entry.d_copies  = r_read_d_copies.read() | (0x1 << m_cmd_read_srcid_fifo.read());
    836851                entry.i_copies  = r_read_i_copies.read();
     
    848863            }
    849864#ifdef DDEBUG
     865if(m_cpt_cycles > DEBUG_START_CYCLE){
    850866           std::cout << "In READ_DIR_HIT printing the entry of address is : " << std::endl;
    851867           entry.print();
    852868           std::cout << "done" << std::endl;
     869}
    853870#endif
    854871
     
    881898          if ( r_alloc_trt_fsm.read() == ALLOC_TRT_READ ) {
    882899#ifdef TDEBUG
     900if(m_cpt_cycles > DEBUG_START_CYCLE){
    883901        std::cout << sc_time_stamp() << " " << name() << " READ_TRT_LOCK " << std::endl;
     902}
    884903#endif
    885904            size_t index = 0;
     
    912931                std::vector<data_t>(m_words,0));
    913932#ifdef TDEBUG
     933if(m_cpt_cycles > DEBUG_START_CYCLE){
    914934        std::cout << sc_time_stamp() << " " << name() << " READ_TRT_SET transaction table : " << std::endl;
    915935        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    916936          m_transaction_tab.print(i);
     937}
    917938#endif
    918939
     
    11781199                index);
    11791200#ifdef IDEBUG
     1201if(m_cpt_cycles > DEBUG_START_CYCLE){
    11801202            if(wok){
    11811203        std::cout << sc_time_stamp() << " " << name() << " WRITE_UPT_LOCK update table : " << std::endl;
    11821204        m_update_tab.print();
    11831205            }
     1206}
    11841207#endif
    11851208            r_write_upt_index = index;
     
    12101233
    12111234            for(size_t i=0; i<m_words ; i++){
    1212               if(r_write_be[i].read())  r_write_to_init_cmd_we[i]=true;
    1213               else                      r_write_to_init_cmd_we[i]=false;
     1235              r_write_to_init_cmd_be[i]=r_write_be[i].read();
    12141236            }
    12151237
     
    12411263          if ( r_alloc_trt_fsm.read() == ALLOC_TRT_WRITE ) {
    12421264#ifdef TDEBUG
     1265if(m_cpt_cycles > DEBUG_START_CYCLE){
    12431266        std::cout << sc_time_stamp() << " " << name() << " READ_TRT_LOCK " << std::endl;
     1267}
    12441268#endif
    12451269            size_t hit_index = 0;
     
    12921316                data_vector);
    12931317#ifdef TDEBUG
     1318if(m_cpt_cycles > DEBUG_START_CYCLE){
    12941319        std::cout << sc_time_stamp() << " " << name() << " WRITE_TRT_SET transaction table : " << std::endl;
    12951320        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    12961321          m_transaction_tab.print(i);
     1322}
    12971323#endif
    12981324
     
    13181344            r_write_fsm = WRITE_RSP;
    13191345#ifdef TDEBUG
     1346if(m_cpt_cycles > DEBUG_START_CYCLE){
    13201347        std::cout << sc_time_stamp() << " " << name() << " WRITE_TRT_DATA transaction table : " << std::endl;
    13211348        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    13221349          m_transaction_tab.print(i);
     1350}
    13231351#endif
    13241352
     
    13771405                index);
    13781406#ifdef IDEBUG
     1407if(m_cpt_cycles > DEBUG_START_CYCLE){
    13791408            if(wok){
    13801409        std::cout << sc_time_stamp() << " " << name() << " WRITE_INVAL_LOCK update table : " << std::endl;
    13811410        m_update_tab.print();
    13821411            }
     1412}
    13831413#endif
    13841414            r_write_upt_index = index;
     
    14081438                std::vector<data_t>(m_words,0));
    14091439#ifdef TDEBUG
     1440if(m_cpt_cycles > DEBUG_START_CYCLE){
    14101441        std::cout << sc_time_stamp() << " " << name() << " WRITE_DIR_INVAL transaction table : " << std::endl;
    14111442        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    14121443          m_transaction_tab.print(i);
     1444}
    14131445#endif
    14141446
     
    14471479
    14481480            for(size_t i=0; i<m_words ; i++){
    1449               r_write_to_init_cmd_we[i]=false;
     1481              r_write_to_init_cmd_be[i]=0;
    14501482              r_write_to_init_cmd_data[i] = 0;
    14511483            }
     
    16171649            r_ixr_rsp_fsm = IXR_RSP_IDLE;
    16181650#ifdef TDEBUG
     1651if(m_cpt_cycles > DEBUG_START_CYCLE){
    16191652        std::cout << sc_time_stamp() << " " << name() << " IXR_RSP_TRT_ERASE transaction table : " << std::endl;
    16201653        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    16211654          m_transaction_tab.print(i);
     1655}
    16221656#endif
    16231657
     
    16381672            if ( eop ) {
    16391673#ifdef TDEBUG
     1674if(m_cpt_cycles > DEBUG_START_CYCLE){
    16401675        std::cout << sc_time_stamp() << " " << name() << " IXR_RSP_TRT_READ transaction table : " << std::endl;
    16411676        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    16421677          m_transaction_tab.print(i);
     1678}
    16431679#endif
    16441680
     
    16871723              break;
    16881724#ifdef TDEBUG
     1725if(m_cpt_cycles > DEBUG_START_CYCLE){
    16891726        std::cout << "XRAM_RSP FSM in XRAM_RSP_IDLE state" << std::endl;
     1727}
    16901728#endif
    16911729            }
     
    16991737            r_xram_rsp_fsm           = XRAM_RSP_TRT_COPY;
    17001738#ifdef TDEBUG
     1739if(m_cpt_cycles > DEBUG_START_CYCLE){
    17011740        std::cout << "XRAM_RSP FSM in XRAM_RSP_DIR_LOCK state" << std::endl;
     1741}
    17021742#endif
    17031743          }
     
    17341774            r_xram_rsp_fsm = XRAM_RSP_INVAL_LOCK;
    17351775#ifdef TDEBUG
     1776if(m_cpt_cycles > DEBUG_START_CYCLE){
    17361777        std::cout << "XRAM_RSP FSM in XRAM_RSP_TRT_COPY state" << std::endl;
    17371778        std::cout << "Victim way : " << std::hex << way << " set " << std::hex << set << std::endl;
    17381779        victim.print();
     1780}
    17391781#endif
    17401782          }
     
    17461788          if ( r_alloc_upt_fsm == ALLOC_UPT_XRAM_RSP ) {
    17471789#ifdef IDEBUG
     1790if(m_cpt_cycles > DEBUG_START_CYCLE){
    17481791        std::cout << "XRAM_RSP FSM in XRAM_RSP_INVAL_LOCK state" << std::endl;
     1792}
    17491793#endif
    17501794            size_t index;
     
    17521796              r_xram_rsp_fsm = XRAM_RSP_INVAL_WAIT;
    17531797#ifdef IDEBUG
     1798if(m_cpt_cycles > DEBUG_START_CYCLE){
    17541799        std::cout << "XRAM_RSP FSM in XRAM_RSP_INVAL_LOCK state to XRAM_RSP_INVAL_WAIT state" << std::endl;
     1800}
    17551801#endif
    17561802
     
    17591805              r_xram_rsp_fsm = XRAM_RSP_INVAL_WAIT;
    17601806#ifdef IDEBUG
     1807if(m_cpt_cycles > DEBUG_START_CYCLE){
    17611808        std::cout << "XRAM_RSP FSM in XRAM_RSP_INVAL_LOCK state to XRAM_RSP_INVAL_WAIT state" << std::endl;
     1809}
    17621810#endif
    17631811            }
     
    17651813              r_xram_rsp_fsm = XRAM_RSP_DIR_UPDT;
    17661814#ifdef IDEBUG
     1815if(m_cpt_cycles > DEBUG_START_CYCLE){
    17671816        std::cout << "XRAM_RSP FSM in XRAM_RSP_INVAL_LOCK state to XRAM_RSP_DIR_UPDT state" << std::endl;
     1817}
    17681818#endif
    17691819            }
     
    17771827          break;
    17781828#ifdef IDEBUG
     1829if(m_cpt_cycles > DEBUG_START_CYCLE){
    17791830        std::cout << "XRAM_RSP FSM in XRAM_RSP_INVAL_WAIT state" << std::endl;
     1831}
    17801832#endif
    17811833        }
     
    18221874          m_cache_directory.write(set, way, entry);
    18231875#ifdef DDEBUG
     1876if(m_cpt_cycles > DEBUG_START_CYCLE){
    18241877           std::cout << "printing the entry : " << std::endl;
    18251878           entry.print();
    18261879           std::cout << "done" << std::endl;
     1880}
    18271881#endif
    18281882
    18291883#ifdef TDEBUG
     1884if(m_cpt_cycles > DEBUG_START_CYCLE){
    18301885        std::cout << sc_time_stamp() << " " << name() << " XRAM_RSP_DIR_UPDT transaction table : " << std::endl;
    18311886        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    18321887          m_transaction_tab.print(i);
     1888}
    18331889#endif
    18341890
     
    18491905
    18501906#ifdef IDEBUG
     1907if(m_cpt_cycles > DEBUG_START_CYCLE){
    18511908            std::cout << "xram_rsp : record invalidation, time = " << std::dec << m_cpt_cycles << std::endl;
    18521909            m_update_tab.print();
     1910}
    18531911#endif
    18541912            r_xram_rsp_upt_index = index;
     
    18851943                std::vector<data_t>(m_words,0) );
    18861944#ifdef TDEBUG
     1945if(m_cpt_cycles > DEBUG_START_CYCLE){
    18871946        std::cout << sc_time_stamp() << " " << name() << " XRAM_RSP_TRT_DIRTY transaction table : " << std::endl;
    18881947        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    18891948          m_transaction_tab.print(i);
     1949}
    18901950#endif
    18911951
     
    19151975
    19161976#ifdef DDEBUG
     1977if(m_cpt_cycles > DEBUG_START_CYCLE){
    19171978        std::cout << "XRAM_RSP FSM in XRAM_RSP_DIR_RSP state" << std::endl;
     1979}
    19181980#endif
    19191981          }
     
    19331995            else                                    r_xram_rsp_fsm = XRAM_RSP_IDLE;
    19341996#ifdef DDEBUG
     1997if(m_cpt_cycles > DEBUG_START_CYCLE){
    19351998        std::cout << "XRAM_RSP FSM in XRAM_RSP_INVAL state" << std::endl;
     1999}
    19362000#endif
    19372001          }
     
    19512015            r_xram_rsp_fsm = XRAM_RSP_IDLE;
    19522016#ifdef TDEBUG
     2017if(m_cpt_cycles > DEBUG_START_CYCLE){
    19532018        std::cout << "XRAM_RSP FSM in XRAM_RSP_WRITE_DIRTY state" << std::endl;
     2019}
    19542020#endif
    19552021          }
     
    19812047            }
    19822048            if ( (p_vci_tgt_cleanup.cmd.read() == vci_param::CMD_WRITE) &&
    1983                 (((addr_t)(p_vci_tgt_cleanup.address.read())) != BROADCAST_ADDR) &&
     2049                (((addr_t)(p_vci_tgt_cleanup.address.read())&0x3) != 0x3) &&
    19842050                reached) {
    19852051
     
    20062072           DirectoryEntry entry = m_cache_directory.read(cleanup_address , way);
    20072073#ifdef DDEBUG
     2074if(m_cpt_cycles > DEBUG_START_CYCLE){
    20082075           std::cout << "In CLEANUP_DIR_LOCK printing the entry of address is : " << std::hex << cleanup_address << std::endl;
    20092076           entry.print();
    20102077           std::cout << "done" << std::endl;
     2078}
    20112079#endif
    20122080            r_cleanup_is_cnt    = entry.is_cnt;
     
    20892157            if(!hit_inval) {
    20902158#ifdef DEBUG_VCI_MEM_CACHE
     2159if(m_cpt_cycles > DEBUG_START_CYCLE){
    20912160              std::cout << "MEM_CACHE WARNING: cleanup with no corresponding entry at address : " << std::hex << (r_cleanup_nline.read()*4*m_words) << std::dec << std::endl;
     2161}
    20922162#endif
    20932163              r_cleanup_fsm = CLEANUP_RSP;
     
    21112181            m_update_tab.clear(r_cleanup_index.read());
    21122182#ifdef IDEBUG
     2183if(m_cpt_cycles > DEBUG_START_CYCLE){
    21132184        std::cout << sc_time_stamp() << " " << name() << " CLEANUP_UPT_WRITE update table : " << std::endl;
    21142185        m_update_tab.print();
     2186}
    21152187#endif
    21162188
     
    22062278            // set Atomic Table
    22072279            m_atomic_tab.set(m_cmd_llsc_srcid_fifo.read(), m_cmd_llsc_addr_fifo.read());
     2280
     2281#ifdef DDEBUG
     2282if(m_cpt_cycles > DEBUG_START_CYCLE){
     2283           std::cout << "In LLSC_DIR_LOCK printing the entry of address is : " << std::hex << m_cmd_llsc_addr_fifo.read() << std::endl;
     2284           entry.print();
     2285           std::cout << "done" << std::endl;
     2286}
     2287#endif
     2288
    22082289
    22092290            if ( entry.valid )  r_llsc_fsm = LL_DIR_HIT;
     
    23472428                index);
    23482429#ifdef IDEBUG
     2430if(m_cpt_cycles > DEBUG_START_CYCLE){
    23492431            if(wok){
    23502432        std::cout << sc_time_stamp() << " " << name() << " SC_UPT_LOCK update table : " << std::endl;
    23512433        m_update_tab.print();
    23522434            }
     2435}
    23532436#endif
    23542437            r_llsc_upt_index = index;
     
    24362519                index);
    24372520#ifdef IDEBUG
     2521if(m_cpt_cycles > DEBUG_START_CYCLE){
    24382522            if(wok){
    24392523        std::cout << sc_time_stamp() << " " << name() << " LLSC_INVAL_LOCK update table : " << std::endl;
    24402524        m_update_tab.print();
    24412525            }
     2526}
    24422527#endif
    24432528            r_llsc_upt_index = index;
     
    24662551                std::vector<data_t>(m_words,0));
    24672552#ifdef TDEBUG
     2553if(m_cpt_cycles > DEBUG_START_CYCLE){
    24682554        std::cout << sc_time_stamp() << " " << name() << " SC_DIR_INVAL transaction table : " << std::endl;
    24692555        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    24702556          m_transaction_tab.print(i);
     2557}
    24712558#endif
    24722559            // reset Atomic Table
     
    26242711            }
    26252712#ifdef TDEBUG
     2713if(m_cpt_cycles > DEBUG_START_CYCLE){
    26262714        std::cout << sc_time_stamp() << " " << name() << " LLSC_TRT_SET transaction table : " << std::endl;
    26272715        for(size_t i = 0 ; i < m_transaction_tab.size() ; i++)
    26282716          m_transaction_tab.print(i);
     2717}
    26292718#endif
    26302719
     
    36113700        p_vci_tgt.rtrdid   = r_write_to_tgt_rsp_trdid.read();
    36123701        p_vci_tgt.rpktid   = r_write_to_tgt_rsp_pktid.read();
    3613         p_vci_tgt.rerror   = 0;
     3702        p_vci_tgt.rerror   = 0x2 & ( (1 << (vci_param::E + 1)) - 1); // Write OK
    36143703        p_vci_tgt.reop     = true;
    36153704        break;
     
    36843773        p_vci_ini.cmdval  = true;
    36853774        if(r_xram_rsp_to_init_cmd_brdcast.read())
    3686           p_vci_ini.address = BROADCAST_ADDR;
     3775          p_vci_ini.address = broadcast_addr;
    36873776        else {
    36883777          if(r_init_cmd_inst.read()) {
     
    37003789      case INIT_CMD_BRDCAST:
    37013790        p_vci_ini.cmdval  = true;
    3702         p_vci_ini.address = BROADCAST_ADDR;
     3791        p_vci_ini.address = broadcast_addr;
    37033792        p_vci_ini.wdata   = (addr_t)r_write_to_init_cmd_nline.read();
    37043793        p_vci_ini.be      = ((r_write_to_init_cmd_nline.read() >> 32) & 0x3);
     
    37303819        p_vci_ini.wdata   = r_write_to_init_cmd_data[r_init_cmd_cpt.read() +
    37313820          r_write_to_init_cmd_index.read()].read();
    3732         if(r_write_to_init_cmd_we[r_init_cmd_cpt.read() +
    3733             r_write_to_init_cmd_index.read()].read()) 
    3734           p_vci_ini.be      = 0xF;
    3735         else                    p_vci_ini.be      = 0x0;
     3821        p_vci_ini.be      = r_write_to_init_cmd_be[r_init_cmd_cpt.read() +r_write_to_init_cmd_index.read()].read() ; 
    37363822        p_vci_ini.plen    = 4 * (r_write_to_init_cmd_count.read() + 2);
    37373823        p_vci_ini.trdid   = r_write_to_init_cmd_trdid.read();
     
    37413827      case INIT_CMD_SC_BRDCAST:
    37423828        p_vci_ini.cmdval  = true;
    3743         p_vci_ini.address = BROADCAST_ADDR;
     3829        p_vci_ini.address = broadcast_addr;
    37443830        p_vci_ini.wdata   = (addr_t)r_llsc_to_init_cmd_nline.read();
    37453831        p_vci_ini.be      = ((r_llsc_to_init_cmd_nline.read() >> 32) & 0x3);
     
    38103896          p_vci_tgt_cleanup.rpktid = r_cleanup_pktid.read();
    38113897          p_vci_tgt_cleanup.rtrdid = r_cleanup_trdid.read();
    3812           p_vci_tgt_cleanup.rerror = 0;
     3898          p_vci_tgt_cleanup.rerror = 0x2 & ( (1 << (vci_param::E + 1)) - 1);
    38133899          p_vci_tgt_cleanup.reop   = 1;
    38143900          break;
Note: See TracChangeset for help on using the changeset viewer.