Ignore:
Timestamp:
Sep 24, 2014, 10:51:29 AM (10 years ago)
Author:
haoliu
Message:

(MESI) Bug fixed in vci_mem_cache_wrapper:

When the MULTI_ACK_FSM handles an UNC_READ_DATA request from a L1 cache or a
device peripheric, it should not be saved as a copy of the cache line in the
directory or the heap.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/MESI/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp

    r788 r813  
    21762176                    size_t way = 0;
    21772177                    addr_t multi_ack_address = r_multi_ack_nline.read() * m_words * 4;
    2178                     bool match_ll = ((r_multi_ack_pktid.read() & 0x07) == TYPE_LL);
     2178                    bool cached_read = ((r_multi_ack_pktid.read() & 0x7) != 0)
     2179                                   and ((r_multi_ack_pktid.read() & 0x7) != 0x2)
     2180                                   and ((r_multi_ack_pktid.read() & 0x7) != 0x6);
     2181
    21792182                    DirectoryEntry entry     = m_cache_directory.read(multi_ack_address , way);
    21802183                    r_multi_ack_tag          = entry.tag;
     
    22102213                        r_multi_ack_fsm = MULTI_ACK_IVT_CHANGE;
    22112214                    }
    2212                     else if (not entry.count or match_ll) // The line has been already evicted from cache L1
     2215                    else if (not entry.count or not cached_read) // The line has been already evicted from cache L1
    22132216                    {
    22142217                        assert(((entry.count == 1) or (entry.count == 0)) && "multi ack for a ll request, count is 1");
     
    22572260                    }
    22582261
    2259                     bool match_ll = ((r_multi_ack_pktid.read() & 0x07) == TYPE_LL);
     2262                    bool cached_read = ((r_multi_ack_pktid.read() & 0x7) != 0)
     2263                                   and ((r_multi_ack_pktid.read() & 0x7) != 0x2)
     2264                                   and ((r_multi_ack_pktid.read() & 0x7) != 0x6);
    22602265
    22612266                    if (r_multi_ack_need_data.read())
     
    22832288                    entry.ptr    = 0;
    22842289
    2285                     if (match_ll)
     2290                    if (not cached_read)
    22862291                    {
    22872292                        entry.owner.srcid = r_multi_ack_copy.read();
     
    53645369                            << " / is_cnt = " << std::dec << victim.is_cnt
    53655370                            << " / set = " << set
    5366                             << "/ count = " << victim.count
     5371                            << " / count = " << victim.count
     5372                            << " / owner.srcid = " << victim.owner.srcid
     5373                            << " / nline = " << victim.tag*m_sets + set
    53675374                            << " / inval_required = " << inval << std::endl;
    53685375#endif
     
    56685675
    56695676                        if (r_xram_rsp_victim_dirty.read() and (r_xram_rsp_victim_state.read() == ENTRY_SHARED)) 
    5670                                                      r_xram_rsp_fsm = XRAM_RSP_WRITE_DIRTY;
     5677                                                      r_xram_rsp_fsm = XRAM_RSP_WRITE_DIRTY;
    56715678                        else if (not_last_multi_req)  r_xram_rsp_fsm = XRAM_RSP_HEAP_REQ;
    5672                         else                         r_xram_rsp_fsm = XRAM_RSP_IDLE;
     5679                        else                          r_xram_rsp_fsm = XRAM_RSP_IDLE;
    56735680
    56745681                        // std::cout << "cleanup sent for trt index =" << r_xram_rsp_trt_index.read() << std::endl;
     
    56775684                            std::cout << "  <MEMC " << name() << " XRAM_RSP_INVAL>"
    56785685                                << " Send an inval request to CC_SEND FSM"
     5686                                << " / srcid = " << r_xram_rsp_victim_copy.read()
    56795687                                << " / address = " << r_xram_rsp_victim_nline.read()*m_words*4 << std::endl;
    56805688#endif
     
    57465754                        HeapEntry entry = m_heap.read(r_xram_rsp_next_ptr.read());
    57475755
    5748                         xram_rsp_to_cc_send_fifo_srcid    = entry.owner.srcid;
     5756                        xram_rsp_to_cc_send_fifo_srcid = entry.owner.srcid;
    57495757                        xram_rsp_to_cc_send_fifo_inst  = entry.owner.inst;
    57505758                        xram_rsp_to_cc_send_fifo_put   = true;
     
    63166324                    addr_t cleanup_address = r_cleanup_nline.read() * m_words * 4;
    63176325
    6318                     bool match_ll = ((r_cleanup_locked_pktid.read() & 0x07) == TYPE_LL);
     6326                    bool cached_read = ((r_cleanup_locked_pktid.read() & 0x7) != 0)
     6327                                   and ((r_cleanup_locked_pktid.read() & 0x7) != 0x2)
     6328                                   and ((r_cleanup_locked_pktid.read() & 0x7) != 0x6);
    63196329
    63206330                    DirectoryEntry      entry;
     
    63676377                    {
    63686378                        entry.state = ENTRY_SHARED;
    6369                         if (match_ll)
     6379                        if (not cached_read)
    63706380                        {
    63716381                            entry.count       = 0;
Note: See TracChangeset for help on using the changeset viewer.