Ignore:
Timestamp:
Aug 25, 2014, 5:58:16 PM (10 years ago)
Author:
devigne
Message:

RWT commit :

  • Merge with trunk.
  • Cosmetic
  • Bugfix in state WRITE_IVT_LOCK_HIT_WB.

MemCache? records invalidation in IVT in this state but we do not check that
the IVT was full. Thus invalidation was issued without actually recorded in the
query IVT ...

  • Bugfix :

When a NCC line owned by a L1 cache with srcid != 0 was removed from MemCache?,
the owner field was reset to 0. If this same L1 cache was sending a read to
retrieve this line the MemCache? sent this line on CC mode.

  • Bugfix :

The MemCache? reset the 'inst' field to 0 when solving a
invalidation due to a change of state of line (NCC to CC).
But a line can be NCC (ie contained in a DATA cache) then asked by INST cache,
this read triggers a transition NCC to CC but we must save the nature of this read.
Now this information is stored in a register (r_read_to_cleanup_inst).

  • Add a counter for the number of minimum inputs available

in the heap. This counter indicates whether the heap size of 4096 is relevant.

File:
1 edited

Legend:

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

    r646 r767  
    5656#define RANDOMIZE_CAS        1
    5757
     58// RWT configuration
     59#define REVERT_CC_MECANISM   0
     60
     61// Configuration
     62#define REVERT_BC_MECANISM   0
     63
    5864namespace soclib { namespace caba {
    5965
     
    6470        "TGT_CMD_WRITE",
    6571        "TGT_CMD_CAS",
    66         "TGT_CMD_ERROR",
    67         "TGT_CMD_CONFIG"
     72        "TGT_CMD_CONFIG",
     73        "TGT_CMD_ERROR"
    6874    };
    6975    const char *tgt_rsp_fsm_str[] =
     
    7581        "TGT_RSP_MULTI_ACK_IDLE",
    7682        "TGT_RSP_CLEANUP_IDLE",
     83        "TGT_RSP_TGT_CMD_IDLE",
    7784        "TGT_RSP_CONFIG_IDLE",
    78         "TGT_RSP_TGT_CMD_IDLE",
    7985        "TGT_RSP_READ",
    8086        "TGT_RSP_WRITE",
     
    8389        "TGT_RSP_MULTI_ACK",
    8490        "TGT_RSP_CLEANUP",
    85         "TGT_RSP_CONFIG",
    86         "TGT_RSP_TGT_CMD"
     91        "TGT_RSP_TGT_CMD",
     92        "TGT_RSP_CONFIG"
    8793    };
    8894    const char *cc_receive_fsm_str[] =
     
    97103        "CC_SEND_XRAM_RSP_IDLE",
    98104        "CC_SEND_WRITE_IDLE",
     105        "CC_SEND_READ_IDLE",
    99106        "CC_SEND_CAS_IDLE",
    100107        "CC_SEND_CONFIG_IDLE",
     
    353360            const IntTab        &srcid_x,          // global index on external network
    354361            const IntTab        &tgtid_d,          // global index on direct network
    355             const size_t        cc_global_id,      // global index on cc network
    356362            const size_t        x_width,           // number of x bits in platform
    357363            const size_t        y_width,           // number of x bits in platform
     
    378384        p_dspin_clack( "p_dspin_clack" ),
    379385
    380         m_seglist( mtp.getSegmentList(tgtid_d) ),
    381         m_nseg( 0 ),
    382         m_srcid_x( mtx.indexForId(srcid_x) ),
    383         m_initiators( 1 << vci_param_int::S ),
    384         m_heap_size( heap_size ),
    385         m_ways( nways ),
    386         m_sets( nsets ),
    387         m_words( nwords ),
    388         m_cc_global_id( cc_global_id ),
    389         m_xwidth(x_width),
    390         m_ywidth(y_width),
     386        m_seglist(mtp.getSegmentList(tgtid_d)),
     387        m_nseg(0),
     388        m_srcid_x( mtx.indexForId(srcid_x)),
     389        m_initiators(1 << vci_param_int::S),
     390        m_heap_size(heap_size),
     391        m_ways(nways),
     392        m_sets(nsets),
     393        m_words(nwords),
     394        m_x_width(x_width),
     395        m_y_width(y_width),
    391396        m_debug_start_cycle( debug_start_cycle ),
    392397        m_debug_ok( debug_ok ),
     
    547552            }
    548553
     554            assert( (m_nseg > 0) and
     555                    "MEMC ERROR : At least one segment must be mapped to this component");
     556
    549557            m_seg = new soclib::common::Segment*[m_nseg];
    550558
     
    555563                i++;
    556564            }
     565
     566            addr_t gid = m_seg[0]->baseAddress() >> (vci_param_int::N - x_width - y_width);
     567            m_x_self = (gid >> m_y_width) & ((1 << m_x_width) - 1);
     568            m_y_self =  gid               & ((1 << m_y_width) - 1);
    557569
    558570            // Allocation for IXR_RSP FSM
     
    664676    }
    665677
     678    /////////////////////////////////////////////////////
     679    tmpl(uint32_t)::min_value(uint32_t old_value, uint32_t new_value)
     680        /////////////////////////////////////////////////////
     681    {
     682        if (old_value < new_value)
     683            return old_value;
     684        else
     685            return new_value;
     686    }
    666687
    667688    /////////////////////////////////////////////////////
     
    670691    {
    671692        const uint32_t srcid_width = vci_param_int::S;
    672         uint8_t self_x_srcid = m_cc_global_id >> (srcid_width - m_xwidth);
    673         uint8_t self_y_srcid = (m_cc_global_id >> (srcid_width - m_ywidth)) & ((1 << m_xwidth) - 1);
    674 
    675         uint8_t x_srcid = req_srcid >> (srcid_width - m_xwidth);
    676         uint8_t y_srcid = (req_srcid >> (srcid_width - m_ywidth - m_xwidth)) & ((1 << m_xwidth) - 1);
    677         return abs(self_x_srcid - x_srcid) + abs(self_y_srcid - y_srcid);
     693
     694        uint8_t req_x = (req_srcid >> (srcid_width - m_x_width));
     695        uint8_t req_y = (req_srcid >> (srcid_width - m_x_width - m_y_width)) & ((1 << m_y_width) - 1);
     696
     697        return abs(m_x_self - req_x) + abs(m_y_self - req_y);
    678698    }
    679699
     
    865885        m_cpt_ncc_to_cc_write    = 0;
    866886        m_cpt_ncc_to_cc          = 0;
     887        m_cpt_write_ncc_miss     = 0;
    867888    }
    868889
    869890
    870891    /////////////////////////////////////////
    871     tmpl(void)::print_stats(bool activity_counters = true, bool stats = true)
     892    tmpl(void)::print_stats(bool activity_counters, bool stats)
    872893    {
    873894        std::cout << "**********************************" << std::dec << std::endl;
     
    891912                << "[008] WRITE FLITS REMOTE        = " << m_cpt_write_flits_remote << std::endl
    892913                << "[009] WRITE COST (FLITS * DIST) = " << m_cpt_write_cost << std::endl
     914                << "[XXX] WRITE L1 MISS NCC         = " << m_cpt_write_ncc_miss << std::endl
    893915                << std::endl
    894916                << "[010] LOCAL LL                  = " << m_cpt_ll_local << std::endl
     
    929951                << "[037] GET (UNIMPLEMENTED)       = " << m_cpt_get << std::endl
    930952                << "[038] WRITE BROADCAST           = " << m_cpt_write_broadcast << std::endl
     953                << "[039] MIN HEAP SLOT AVAILABLE   = " << m_cpt_heap_min_slot_available << std::endl
    931954                << std::endl
    932                 << "[039] CLEANUP DATA (FLITS)      = " << m_cpt_cleanup_data * 16 << std::endl
    933                 << "[040] NCC TO CC (READ)          = " << m_cpt_ncc_to_cc_read << std::endl
    934                 << "[041] NCC TO CC (WRITE)         = " << m_cpt_ncc_to_cc_write << std::endl
    935                 << "[042] NCC TO CC (TOTAL)         = " << m_cpt_ncc_to_cc << std::endl
     955                << "[040] CLEANUP DATA (FLITS)      = " << m_cpt_cleanup_data * 16 << std::endl
     956                << "[041] NCC TO CC (READ)          = " << m_cpt_ncc_to_cc_read << std::endl
     957                << "[042] NCC TO CC (WRITE)         = " << m_cpt_ncc_to_cc_write << std::endl
     958                << "[043] NCC TO CC (TOTAL)         = " << m_cpt_ncc_to_cc << std::endl
    936959                << std::endl;
    937960        }
     
    10171040        delete [] m_debug_previous_data;
    10181041        delete [] m_debug_data;
    1019 
    1020         print_stats();
    10211042    }
    10221043
     
    11371158            r_xram_rsp_to_ixr_cmd_req          = false;
    11381159            r_xram_rsp_trt_index               = 0;
     1160            r_xram_rsp_rerror_irq              = false;
     1161            r_xram_rsp_rerror_irq_enable       = false;
    11391162
    11401163            m_xram_rsp_to_cc_send_inst_fifo.init();
     
    11751198            m_cpt_write_flits_local  = 0;
    11761199            m_cpt_write_flits_remote = 0;
     1200            m_cpt_write_ncc_miss     = 0;
    11771201            m_cpt_write_cost         = 0;
    11781202            m_cpt_ll_local           = 0;
     
    12531277            m_cpt_ncc_to_cc_write         = 0;       
    12541278            m_cpt_ncc_to_cc               = 0;       
     1279
     1280            m_cpt_heap_min_slot_available = m_heap_size;
     1281            m_cpt_heap_slot_available     = m_heap_size;
     1282
    12551283            return;
    12561284        }
     
    13601388#endif
    13611389                    // checking segmentation violation
    1362                     addr_t      address  = p_vci_tgt.address.read();
    1363                     uint32_t    plen     = p_vci_tgt.plen.read();
    1364                     bool        found    = false;
    1365                     bool        config   = false;
    1366 
    1367                     for (size_t seg_id = 0; (seg_id < m_nseg) && !found; seg_id++)
     1390                    addr_t   address = p_vci_tgt.address.read();
     1391                    uint32_t plen    = p_vci_tgt.plen.read();
     1392                    bool     config  = false;
     1393
     1394                    for (size_t seg_id = 0; (seg_id < m_nseg) ; seg_id++)
    13681395                    {
    13691396                        if (m_seg[seg_id]->contains(address) &&
    13701397                                m_seg[seg_id]->contains(address + plen - vci_param_int::B) )
    13711398                        {
    1372                             found = true;
    13731399                            if ( m_seg[seg_id]->special() ) config = true;
    13741400                        }
    13751401                    }
    13761402
    1377                     if (!found)                /////////// out of segment error
    1378                     {
    1379                         r_tgt_cmd_fsm   = TGT_CMD_ERROR;
    1380                     }
    1381                     else if ( config )              /////////// configuration command
     1403                    if (config)                     /////////// configuration command
    13821404                    {
    13831405                        if (!p_vci_tgt.eop.read()) r_tgt_cmd_fsm = TGT_CMD_ERROR;
    1384                         else                            r_tgt_cmd_fsm = TGT_CMD_CONFIG;
     1406                        else                       r_tgt_cmd_fsm = TGT_CMD_CONFIG;
    13851407                    }
    13861408                    else                            //////////// memory access
     
    14041426                            // ==> TYPE_WRITE = X100 with the TSAR encoding
    14051427                            // ==> mask = 0b0111 = 0x7
    1406                             assert(((p_vci_tgt.pktid.read() & 0x7) == 0x4 or (p_vci_tgt.pktid.read() == 0x0)) and
     1428                            assert((((p_vci_tgt.pktid.read() & 0x7) == 0x4)  or ((p_vci_tgt.pktid.read() & 0x7) == 0x0)) and
    14071429                                    "The type specified in the pktid field is incompatible with the WRITE CMD");
    14081430                            r_tgt_cmd_fsm = TGT_CMD_WRITE;
     
    16201642                        }
    16211643
     1644                        // xram GET bus error registers
     1645                        case MEMC_RERROR:
     1646                        {
     1647                            need_rsp = true;
     1648                            error    = 0;
     1649
     1650                            if (p_vci_tgt.cmd.read() == vci_param_int::CMD_WRITE)
     1651                            {
     1652                                switch (regr)
     1653                                {
     1654                                    case MEMC_RERROR_IRQ_ENABLE:
     1655                                        r_xram_rsp_rerror_irq_enable =
     1656                                            (p_vci_tgt.wdata.read() != 0);
     1657
     1658                                        break;
     1659                                       
     1660                                    default:
     1661                                        error = 1;
     1662                                        break;
     1663                                }
     1664                            }
     1665                            else if (p_vci_tgt.cmd.read() == vci_param_int::CMD_READ)
     1666                            {
     1667                                switch (regr)
     1668                                {
     1669                                    case MEMC_RERROR_SRCID:
     1670                                        rdata = (uint32_t)
     1671                                            r_xram_rsp_rerror_rsrcid.read();
     1672
     1673                                        break;
     1674
     1675                                    case MEMC_RERROR_ADDR_LO:
     1676                                        rdata = (uint32_t)
     1677                                            (r_xram_rsp_rerror_address.read()) &
     1678                                            ((1ULL<<32)-1);
     1679
     1680                                        break;
     1681
     1682                                    case MEMC_RERROR_ADDR_HI:
     1683                                        rdata = (uint32_t)
     1684                                            (r_xram_rsp_rerror_address.read() >> 32) &
     1685                                            ((1ULL<<32)-1);
     1686
     1687                                        break;
     1688
     1689                                    case MEMC_RERROR_IRQ_RESET:
     1690                                        if (not r_xram_rsp_rerror_irq.read()) break;
     1691
     1692                                        r_xram_rsp_rerror_irq = false;
     1693
     1694                                        break;
     1695
     1696                                    case MEMC_RERROR_IRQ_ENABLE:
     1697                                        rdata = (uint32_t)
     1698                                            (r_xram_rsp_rerror_irq_enable.read()) ? 1 : 0;
     1699
     1700                                        break;
     1701
     1702                                    default:
     1703                                        error = 1;
     1704                                        break;
     1705                                }
     1706                            }
     1707                            else
     1708                            {
     1709                                error = 1;
     1710                            }
     1711
     1712                            break;
     1713                        }
     1714
    16221715                        //unknown function
    16231716                        default:
     
    21002193        //   is signaled by the CLEANUP FSM by decrementing the r_config_rsp_lines counter.
    21012194        //   The CONFIG INVAL response is sent only when the last line has been invalidated.
     2195        //   There is no PUT transaction to XRAM, even if the invalidated line is dirty...
    21022196        //   TODO : The target buffer address must be aligned on a cache line boundary.
    21032197        //   This constraint can be released, but it requires to make 2 PUT transactions
     
    25592653                        r_config_heap_next = entry.next;
    25602654                        if ( last_copy ) r_config_fsm = CONFIG_HEAP_LAST;
     2655
     2656                        // <Activity counters>
     2657                        m_cpt_heap_slot_available++;
     2658                        // </Activity counters>
    25612659                    }
    25622660
     
    26842782                    {
    26852783                        r_read_ll_key   = m_llsc_table.ll(m_cmd_read_addr_fifo.read());
    2686                         /**//*std::cout << "MEMCACHE : from proc " << m_cmd_read_srcid_fifo.read()
    2687                               << " | @ " << std::hex << m_cmd_read_addr_fifo.read()
    2688                               << " | LL" << std::endl;*/
    26892784                        r_read_ll_done  = true;
    26902785                    }
     
    27082803                    {
    27092804                        r_read_coherent = entry.cache_coherent;
    2710                         if (entry.cache_coherent or (entry.count == 0))// or (entry.owner.srcid == m_cmd_read_srcid_fifo.read())) //hit on a WT line or the owner has no more copy (if LL, the owner must be invalidated even if he made the request)
     2805
     2806                        // hit on a WT line or the owner has no more copy (if LL, the owner must be invalidated even if he made the request)
     2807                        if (entry.cache_coherent or (entry.count == 0))// or (entry.owner.srcid == m_cmd_read_srcid_fifo.read()))
    27112808                        {
    27122809                            // test if we need to register a new copy in the heap
     
    27172814                            else
    27182815                            {
    2719                                 //std::cout << "is LL = " << ((m_cmd_read_pktid_fifo.read() & 0x7) == TYPE_LL) << std::endl;
    2720                                 //std::cout << "coherent = " << entry.cache_coherent << " | count = " << std::dec << entry.count << " | cached = " << cached_read << std::endl;
    27212816                                r_read_fsm = READ_HEAP_REQ;
    27222817                            }
     
    27552850                        size_t index;
    27562851                        addr_t nline = m_nline[(addr_t)(m_cmd_read_addr_fifo.read())];
    2757                         /*std::cout << "nline = " << std::dec <<  nline << std::endl
    2758                           << "inval en cours sur la ligne = " << m_upt.search_inval(nline, index) << std::endl
    2759                           << "UPT full = " << m_upt.is_full() << std::endl
    2760                           << "CC_SEND req = " << r_read_to_cc_send_req.read() << std::endl
    2761                           << "CLENAUP req = " <<r_read_to_cleanup_req.read() << std::endl;*/
    27622852                        if(m_ivt.search_inval(nline, index) or m_ivt.is_full() or r_read_to_cc_send_req.read() or r_read_to_cleanup_req.read()) //Check pending inval
    27632853                        {
     
    27822872                            r_read_to_cleanup_nline = nline;
    27832873                            r_read_to_cleanup_srcid = m_cmd_read_srcid_fifo.read();
     2874                            r_read_to_cleanup_inst = ((m_cmd_read_pktid_fifo.read() & 0x2) != 0);
    27842875                            r_read_to_cleanup_length  = m_cmd_read_length_fifo.read();
    27852876                            r_read_to_cleanup_first_word = m_x[(addr_t) m_cmd_read_addr_fifo.read()];
     
    27882879                            r_read_to_cleanup_is_ll= ((m_cmd_read_pktid_fifo.read() & 0x7) == TYPE_LL);
    27892880                            r_read_to_cleanup_ll_key = r_read_ll_key.read();
    2790                             //std::cout << "cleanup req (read) on line " << nline << " /on proc " << r_read_copy.read() << std::endl;
    27912881
    27922882                            m_ivt.set(false,     // it's an inval transaction
     
    28072897                            {
    28082898                                std::cout
    2809                                     << "  <MEMC " << name() << " READ_IVT_LOCK>"
     2899                                    << "  <MEMC " << name() << " READ_IVT_LOCK>"
     2900                                    << std::hex
    28102901                                    << " Inval req on an NCC line"
     2902                                    << " | owner = " << r_read_copy.read()
     2903                                    << " | nline = " << nline
     2904                                    << std::dec
    28112905                                    << std::endl;
    28122906                            }
     
    28612955                    DirectoryEntry entry;
    28622956                    entry.valid   = true;
    2863                     entry.cache_coherent = r_read_coherent.read() or inst_read or (!(cached_read)) or (r_read_copy.read() != m_cmd_read_srcid_fifo.read());
    2864                     r_read_coherent = r_read_coherent.read() or inst_read or (!(cached_read)) or (r_read_copy.read() != m_cmd_read_srcid_fifo.read());
     2957                    //entry.cache_coherent = r_read_coherent.read() or inst_read or (!(cached_read)) or (r_read_copy.read() != m_cmd_read_srcid_fifo.read());
     2958                    //r_read_coherent = r_read_coherent.read() or inst_read or (!(cached_read)) or (r_read_copy.read() != m_cmd_read_srcid_fifo.read());
     2959
     2960                    entry.cache_coherent = r_read_coherent.read() or inst_read or (!(cached_read));
     2961                    r_read_coherent = r_read_coherent.read() or inst_read or (!(cached_read));
     2962
    28652963                    entry.is_cnt  = is_cnt;
    28662964                    entry.dirty   = r_read_dirty.read();
     
    29843082                        else            // switching to counter mode
    29853083                        {
    2986                             if(r_read_count.read() >1)              // heap must be cleared
     3084                            if(r_read_count.read() > 1)              // heap must be cleared
    29873085                            {
    29883086                                HeapEntry next_entry = m_heap.read(r_read_ptr.read());
     
    30433141                        m_heap.write_free_entry(heap_entry);
    30443142                        m_heap.write_free_ptr(r_read_next_ptr.read());
    3045                         if(r_read_last_free.read())  m_heap.set_full();
     3143
     3144                        if(r_read_last_free.read()) {
     3145                            m_heap.set_full();
     3146                        }
     3147                       
     3148                        // <Activity counters>
     3149                        m_cpt_heap_slot_available--;
     3150                        // </Activity counters>
    30463151
    30473152                        r_read_fsm = READ_RSP;
     
    31073212                        m_heap.write(r_read_ptr.read(),last_entry);
    31083213                        r_read_fsm = READ_RSP;
     3214
     3215                        // <Activity counters>
     3216                        m_cpt_heap_slot_available = m_cpt_heap_slot_available + (r_read_count.read() - 1);
     3217                        // </Activity counters>
    31093218                    }
    31103219                    else
     
    31253234                        r_read_to_tgt_rsp_length = m_cmd_read_length_fifo.read();
    31263235                        r_read_to_tgt_rsp_srcid  = m_cmd_read_srcid_fifo.read();
    3127                         /*RWT*/
    3128                         //BUG pktid
     3236
    31293237                        if (r_read_coherent.read())
    31303238                        {
    31313239                            r_read_to_tgt_rsp_pktid = 0x0 + m_cmd_read_pktid_fifo.read();
    3132                             //std::cout << "READ RSP COHERENT on word" << std::hex << m_x[(addr_t) m_cmd_read_addr_fifo.read()] << std::dec << std::endl;
    31333240                        }
    31343241                        else
     
    34423549                        r_write_coherent   = entry.cache_coherent;
    34433550
     3551                        if((entry.cache_coherent == false) and (entry.count != 0))
     3552                        {
     3553                            m_cpt_write_ncc_miss++;
     3554                        }
     3555
    34443556                        if (entry.cache_coherent or (entry.owner.srcid == r_write_srcid.read()) or (entry.count == 0)) // hit WT
    34453557                        {
     
    34623574                            {
    34633575                                r_write_fsm = WRITE_IVT_LOCK_HIT_WB;
    3464                                 //            if(r_write_pktid.read() == TYPE_SC)
    3465                                 //            {
    3466                                 //              r_write_sc_fail = true;
    3467                                 //            }
    34683576                            }
    34693577                        }
     
    35003608                        addr_t nline = m_nline[(addr_t)(r_write_address.read())];
    35013609
    3502                         //std::cout << "WRITE on NCC on line" << std::hex << nline << std::dec << std::endl;
    35033610                        //if there is a matched updt req, we should wait until it is over. Because
    35043611                        //we need the lastest updt data.
     
    35083615
    35093616                        if( not match_inval                          and
     3617                            not m_ivt.is_full()                      and
    35103618                            not r_write_to_cc_send_req.read()        and
    35113619                            not r_write_to_cc_send_multi_req.read()  and
     
    35333641                        if(m_debug)
    35343642                        {
    3535                             std::cout << "  <MEMC " << name() << " WRITE_IVT_LOCK_HIT_WB> get access to the UPT: "
     3643                            std::cout << "  <MEMC " << name() << " WRITE_IVT_LOCK_HIT_WB> get access to the IVT: "
    35363644                                << " Inval requested =  " << (not match_inval and not r_write_to_cc_send_req.read())
    35373645                                << std::endl;
     
    48084916                        r_ixr_rsp_trt_index = p_vci_ixr.rtrdid.read();
    48094917
    4810                         assert( ((p_vci_ixr.rerror.read() & 0x1) == 0) and
    4811                                 "MEMC ERROR in IXR_RSP state: XRAM response error !");
    4812 
    4813                         if(p_vci_ixr.reop.read())   // PUT
     4918                        if (p_vci_ixr.reop.read() and not
     4919                            p_vci_ixr.rerror.read())   // PUT
    48144920                        {
    48154921                            r_ixr_rsp_fsm = IXR_RSP_TRT_ERASE;
     
    48364942                }
    48374943
    4838                 ////////////////////////
    4839             case IXR_RSP_TRT_ERASE:   // erase the entry in the TRT
    4840                 // decrease the line counter if config request
     4944               ///////////////////////
     4945            case IXR_RSP_TRT_ERASE: // erase the entry in the TRT
     4946                                    // decrease the line counter if config request
    48414947                {
    48424948                    if(r_alloc_trt_fsm.read() == ALLOC_TRT_IXR_RSP)
     
    48464952                        {
    48474953                            config_rsp_lines_ixr_rsp_decr = true;
    4848                             m_trt.erase(index);
    4849                             r_ixr_rsp_fsm = IXR_RSP_IDLE;
    4850                         }
    4851                         else                            // not a config transaction
    4852                         {
    4853                             m_trt.erase(index);
    4854                             r_ixr_rsp_fsm = IXR_RSP_IDLE;
    4855                         }
     4954                        }
     4955                        m_trt.erase(index);
     4956                        r_ixr_rsp_fsm = IXR_RSP_IDLE;
    48564957
    48574958#if DEBUG_MEMC_IXR_RSP
     
    48724973                        bool        eop      = p_vci_ixr.reop.read();
    48734974                        wide_data_t data     = p_vci_ixr.rdata.read();
    4874                         bool        error    = ((p_vci_ixr.rerror.read() & 0x1) == 1);
    4875 
    4876                         assert(((eop == (word == (m_words-2))) or error) and
     4975                        bool        rerror   = ((p_vci_ixr.rerror.read() & 0x1) == 1);
     4976
     4977                        assert(((eop == (word == (m_words-2))) or rerror) and
    48774978                                "MEMC ERROR in IXR_RSP_TRT_READ state : invalid response from XRAM");
    48784979
    4879                         m_trt.write_rsp( index,
    4880                                 word,
    4881                                 data );
     4980                        m_trt.write_rsp( index, word, data, rerror );
    48824981
    48834982                        r_ixr_rsp_cpt = word + 2;
     
    50095108                    r_xram_rsp_victim_is_cnt    = victim.is_cnt;
    50105109                    r_xram_rsp_victim_inval     = inval ;
    5011                     r_xram_rsp_victim_dirty     = victim.dirty or (!victim.cache_coherent && (victim.count == 1)); //a NCC line is by default considered as dirty in the L1: we must take a reservation on a TRT entry
    5012 
    5013                     if( not r_xram_rsp_trt_buf.rerror ) r_xram_rsp_fsm = XRAM_RSP_IVT_LOCK;
    5014                     else                                r_xram_rsp_fsm = XRAM_RSP_ERROR_ERASE;
     5110                    // a NCC line is by default considered as dirty in the L1: we must take a reservation on a TRT entry
     5111                    r_xram_rsp_victim_dirty     = victim.dirty or (!victim.cache_coherent && (victim.count == 1));
     5112
     5113
     5114                    // A line that undergoes a change in its state (ncc to cc), should not be evicted from the memory cache.
     5115                    if((victim.tag * m_sets + set) == r_read_to_cleanup_nline.read() and r_read_to_cleanup_req.read())
     5116                    {
     5117                        r_xram_rsp_fsm = XRAM_RSP_INVAL_WAIT;
     5118
     5119#if DEBUG_MEMC_XRAM_RSP
     5120                        if(m_debug)
     5121                            std::cout << "  <MEMC " << name() << " XRAM_RSP_TRT_COPY>"
     5122                                << " Victim line is in ncc to cc mecanism"
     5123                                << " / nline = " << std::hex << (victim.tag * m_sets + set)
     5124                                << std::endl;
     5125#endif
     5126                    }
     5127                    else if( not r_xram_rsp_trt_buf.rerror )
     5128                    {
     5129                        r_xram_rsp_fsm = XRAM_RSP_IVT_LOCK;
     5130                    }
     5131                    else
     5132                    {
     5133                        r_xram_rsp_fsm = XRAM_RSP_ERROR_ERASE;
     5134                    }
    50155135
    50165136#if DEBUG_MEMC_XRAM_RSP
     
    51955315#endif
    51965316
    5197                     // If the victim is not dirty (RWT: if it is not coherent, we can not know wether it is dirty or not), we don't need another XRAM  put transaction,
    5198                     // and we can erase the TRT entry
     5317                    // If the victim is not dirty (RWT: if it is not coherent,
     5318                    // we can not know wether it is dirty or not), we don't
     5319                    // need another XRAM  put transaction, and we can erase the
     5320                    // TRT entry
    51995321                    if(!r_xram_rsp_victim_dirty.read() and (r_xram_rsp_victim_coherent.read() or (r_xram_rsp_victim_count.read() == 0)))  m_trt.erase(r_xram_rsp_trt_index.read());
    52005322
    52015323                    // Next state
    5202                     if(r_xram_rsp_victim_dirty.read() or (!r_xram_rsp_victim_coherent.read() and (r_xram_rsp_victim_count.read() == 1)))       r_xram_rsp_fsm = XRAM_RSP_TRT_DIRTY;
     5324                    if(r_xram_rsp_victim_dirty.read() or (!r_xram_rsp_victim_coherent.read() and (r_xram_rsp_victim_count.read() == 1)))  r_xram_rsp_fsm = XRAM_RSP_TRT_DIRTY;
    52035325                    else if(r_xram_rsp_trt_buf.proc_read)    r_xram_rsp_fsm = XRAM_RSP_DIR_RSP;
    52045326                    else if(r_xram_rsp_victim_inval.read())  r_xram_rsp_fsm = XRAM_RSP_INVAL;
     
    52355357#endif
    52365358
    5237                         //        if( not r_xram_rsp_victim_coherent )
    5238                         //            std::cout << "a victim coherent not sent trt index =" << r_xram_rsp_trt_index.read() << std::endl;
    52395359                        if(r_xram_rsp_trt_buf.proc_read)         r_xram_rsp_fsm = XRAM_RSP_DIR_RSP;
    52405360                        else if(r_xram_rsp_victim_inval.read())  r_xram_rsp_fsm = XRAM_RSP_INVAL;
     
    53115431                        else                         r_xram_rsp_fsm = XRAM_RSP_IDLE;
    53125432
    5313                         // std::cout << "cleanup sent for trt index =" << r_xram_rsp_trt_index.read() << std::endl;
    53145433#if DEBUG_MEMC_XRAM_RSP
    53155434                        if(m_debug)
     
    53735492                        HeapEntry entry = m_heap.read(r_xram_rsp_next_ptr.read());
    53745493
    5375                         xram_rsp_to_cc_send_fifo_srcid    = entry.owner.srcid;
     5494                        xram_rsp_to_cc_send_fifo_srcid = entry.owner.srcid;
    53765495                        xram_rsp_to_cc_send_fifo_inst  = entry.owner.inst;
    53775496                        xram_rsp_to_cc_send_fifo_put   = true;
     
    53875506                            {
    53885507                                r_xram_rsp_fsm = XRAM_RSP_HEAP_ERASE;
     5508
    53895509                            }
    53905510                        }
     
    54315551                    m_heap.write(r_xram_rsp_next_ptr.read(),last_entry);
    54325552
     5553                    // <Activity counters>
     5554                    m_cpt_heap_slot_available = m_cpt_heap_slot_available + (r_xram_rsp_victim_count.read() - 1);
     5555                    // </Activity counters>
     5556
    54335557                    r_xram_rsp_fsm = XRAM_RSP_IDLE;
    54345558
     
    54465570
    54475571                    // Next state
    5448                     if(r_xram_rsp_trt_buf.proc_read) r_xram_rsp_fsm = XRAM_RSP_ERROR_RSP;
    5449                     else                             r_xram_rsp_fsm = XRAM_RSP_IDLE;
     5572                    if (r_xram_rsp_trt_buf.proc_read)
     5573                    {
     5574                        r_xram_rsp_fsm = XRAM_RSP_ERROR_RSP;
     5575                    }
     5576                    else
     5577                    {
     5578                        // Trigger an interruption to signal a bus error from
     5579                        // the XRAM because a processor WRITE MISS (XRAM GET
     5580                        // transaction and not processor read).
     5581                        //
     5582                        // To avoid deadlocks we do not wait an error to be
     5583                        // acknowledged before signaling another one.
     5584                        // Therefore, when there is an active error, and other
     5585                        // errors arrive, these are not considered
     5586
     5587                        if (!r_xram_rsp_rerror_irq.read() && r_xram_rsp_rerror_irq_enable.read()
     5588                                && r_xram_rsp_trt_buf.xram_read )
     5589                        {
     5590                            r_xram_rsp_rerror_irq     = true;
     5591                            r_xram_rsp_rerror_address = r_xram_rsp_trt_buf.nline * m_words * 4;
     5592                            r_xram_rsp_rerror_rsrcid  = r_xram_rsp_trt_buf.srcid;
    54505593
    54515594#if DEBUG_MEMC_XRAM_RSP
    5452                     if(m_debug)
     5595                            if (m_debug)
     5596                                std::cout
     5597                                    << "  <MEMC " << name() << " XRAM_RSP_ERROR_ERASE>"
     5598                                    << " Triggering interrupt to signal WRITE MISS bus error"
     5599                                    << " / irq_enable = " << r_xram_rsp_rerror_irq_enable.read()
     5600                                    << " / nline = "      << r_xram_rsp_trt_buf.nline
     5601                                    << " / rsrcid = "     << r_xram_rsp_trt_buf.srcid
     5602                                    << std::endl;
     5603#endif
     5604                        }
     5605
     5606                        r_xram_rsp_fsm = XRAM_RSP_IDLE;
     5607                    }
     5608
     5609#if DEBUG_MEMC_XRAM_RSP
     5610                    if (m_debug)
    54535611                        std::cout << "  <MEMC " << name() << " XRAM_RSP_ERROR_ERASE>"
    54545612                            << " Error reported by XRAM / erase the TRT entry" << std::endl;
     
    55725730                        DspinDhccpParam::dspin_get(flit, DspinDhccpParam::CLEANUP_NLINE_LSB);
    55735731
    5574                     //A MODIFIER POUR DIRTY //
    55755732                    bool eop =
    55765733                        DspinDhccpParam::dspin_get(flit, DspinDhccpParam::P2M_EOP) == 0x1;
     5734
    55775735                    if (! eop)
    55785736                    {
     
    56435801
    56445802                    r_cleanup_fsm = CLEANUP_DIR_LOCK;
    5645                     //std::cout << " MEM_CACHE : CLEANUP_DIR_REQ" << std::endl;
    56465803
    56475804#if DEBUG_MEMC_CLEANUP
     
    56685825                        exit(0);
    56695826                    }
    5670                     //std::cout << " MEM_CACHE : CLEANUP_DIR_LOCK" << std::endl;
    56715827
    56725828                    // Read the directory
     
    57095865                        }
    57105866                    }
    5711                     else                // miss : check UPT for a pending invalidation transaction
     5867                    else           // miss : check IVT for a pending invalidation transaction
    57125868                    {
    57135869                        r_cleanup_fsm = CLEANUP_IVT_LOCK;
     
    57695925                    /*RWT*/
    57705926                    bool   inval_request = (r_read_to_cleanup_req.read() and (r_cleanup_nline.read() == r_read_to_cleanup_nline.read())) // NCC to CC initiated by a read transaction
    5771                         or (r_write_to_cleanup_req.read() and (r_cleanup_nline.read() == r_write_to_cleanup_nline.read())); //NCC to CC initiated by a wrtie transaction
     5927                        or (r_write_to_cleanup_req.read() and (r_cleanup_nline.read() == r_write_to_cleanup_nline.read()));              // NCC to CC initiated by a write transaction
    57725928
    57735929
     
    57945950                        if (r_read_to_cleanup_cached_read.read())
    57955951                        {
    5796                             entry.count          = r_cleanup_count.read();
    5797                             entry.owner.srcid    = r_read_to_cleanup_srcid.read();
    5798                             entry.owner.inst     = 0;
     5952                            entry.count       = r_cleanup_count.read();
     5953                            entry.owner.srcid = r_read_to_cleanup_srcid.read();
     5954                            entry.owner.inst  = r_read_to_cleanup_inst.read();
    57995955                        }
    58005956                        else
    58015957                        {
    5802                             entry.count          = r_cleanup_count.read() - 1;
    5803                             entry.owner.srcid    = r_cleanup_copy.read();
    5804                             entry.owner.inst     = r_cleanup_copy_inst.read();
     5958                            entry.count       = r_cleanup_count.read() - 1;
     5959                            entry.owner.srcid = r_cleanup_copy.read();
     5960                            entry.owner.inst  = r_cleanup_copy_inst.read();
    58055961                        }
    58065962                        if (r_read_to_cleanup_is_ll.read())
     
    58115967                    else
    58125968                    {
    5813                         entry.count          = r_cleanup_count.read() - 1;
    5814                         entry.owner.srcid    = 0;
    5815                         entry.owner.inst     = 0;
     5969                        entry.count       = r_cleanup_count.read() - 1;
     5970                        entry.owner.srcid = 0;
     5971                        entry.owner.inst  = 0;
     5972
     5973#if REVERT_CC_MECANISM
     5974                        // Revert CC to NCC if :
     5975                        //  - no more copy in L1 caches
     5976                        //  - this line is not in counter mode (broadcast)
     5977                        //  - this line is not in NCC to CC mecanism
     5978                        if (((r_cleanup_count.read() - 1) == 0) and (r_cleanup_is_cnt == false) and (inval_request == false))
     5979                        {
     5980                            entry.cache_coherent = false;
     5981                        }
     5982#endif
     5983
     5984#if REVERT_BC_MECANISM
     5985                        if ((r_cleanup_count.read() - 1) == 0)
     5986                        {
     5987                            entry.is_cnt = false;
     5988                        }
     5989#endif
     5990
    58165991                    }
    58175992
     
    58526027                            << " / is_cnt = "  << entry.is_cnt
    58536028                            << " / match_inval = " << inval_request
     6029                            << " / is_coherent = " << entry.cache_coherent
     6030                            << std::dec
    58546031                            << std::endl;
    58556032                    }
     
    58616038            case CLEANUP_IVT_LOCK_DATA://RWT
    58626039                {
    5863                     //Search for a matching inval in the UPT (there must be one) and check if there is a pending read.
     6040                    //Search for a matching inval in the IVT (there must be one) and check if there is a pending read.
    58646041                    if(r_alloc_ivt_fsm.read() == ALLOC_IVT_CLEANUP)
    58656042                    {
     
    58776054                        r_cleanup_fsm = CLEANUP_IVT_CLEAR_DATA;
    58786055                    }
    5879 #if DEBUG_MC_CLEANUP
     6056#if DEBUG_MEMC_CLEANUP
    58806057                    if (m_debug)
    58816058                    {
     
    59026079                        r_cleanup_fsm = CLEANUP_SEND_CLACK;
    59036080                    }
    5904 #if DEBUG_MC_CLEANUP
     6081#if DEBUG_MEMC_CLEANUP
    59056082                    if (m_debug)
    59066083                    {
    59076084                        std::cout
    59086085                            << " <MEMC " << name()
    5909                             << " CLEANUP_IVT_CLEAR_DATA> clear UPT entry"
     6086                            << " CLEANUP_IVT_CLEAR_DATA> clear IVT entry"
    59106087                            << std::endl;
    59116088                    }
     
    59226099                    r_cleanup_to_tgt_rsp_srcid   = r_cleanup_read_srcid.read();
    59236100                    r_cleanup_to_tgt_rsp_trdid   = r_cleanup_read_trdid.read();
    5924                     r_cleanup_to_tgt_rsp_pktid   = 0x0 + r_cleanup_read_pktid.read();//WT
     6101                    r_cleanup_to_tgt_rsp_pktid   = 0x0 + r_cleanup_read_pktid.read();//RWT
    59256102                    r_cleanup_to_tgt_rsp_type    = 0; //Read instruction
    59266103                    r_cleanup_to_tgt_rsp_length  = r_read_to_cleanup_length.read();
     
    59456122                    r_cleanup_fsm                = CLEANUP_SEND_CLACK;
    59466123
    5947 #if DEBUG_MC_CLEANUP
     6124#if DEBUG_MEMC_CLEANUP
    59486125                    if (m_debug)
    59496126                    {
     
    61976374                    m_heap.write_free_ptr(r_cleanup_next_ptr.read());
    61986375                    m_heap.unset_full();
     6376
     6377                    // <Activity counters>
     6378                    m_cpt_heap_slot_available++;
     6379                    // </Activity counters>
    61996380
    62006381                    r_cleanup_fsm = CLEANUP_SEND_CLACK;
     
    63226503                    if(r_cleanup_to_tgt_rsp_req.read()) break;
    63236504
     6505                    assert ( (r_cleanup_ncc.read() == false) and
     6506                            "CLEANUP_WRITE_RSP : Cleanup on NCC line invalid in "
     6507                            "MEM_CACHE with write_rsp needed. STRANGE BEHAVIOUR");
    63246508                    // no pending request
    63256509                    r_cleanup_to_tgt_rsp_req     = true;
     
    63856569                                        data_vector);
    63866570                            }
    6387                             //std::cout << "cleanup with a non coherent ligne in trt index = " << index << std::endl;
    63886571                            r_cleanup_to_ixr_cmd_srcid        = r_cleanup_srcid.read();
    63896572                            r_cleanup_to_ixr_cmd_index        = index;
     
    72427425        //
    72437426        // It implements a round-robin priority between the four possible client FSMs
    7244         //     XRAM_RSP > CAS > WRITE > CONFIG
     7427        //     XRAM_RSP > CAS > READ > WRITE > CONFIG
    72457428        //
    72467429        // Each FSM can request the next services:
     
    73697552                        break;
    73707553                    }
    7371                     // WRITE
     7554                    // READ
    73727555                    if(r_read_to_cc_send_req.read())
    73737556                    {
     
    73757558                        break;
    73767559                    }
    7377 
     7560                    // WRITE
    73787561                    if(r_write_to_cc_send_req.read())
    73797562                    {
     
    73957578                }
    73967579                ///////////////////////////
    7397             case CC_SEND_XRAM_RSP_IDLE:   // CAS FSM has highest priority
    7398                 {
     7580            case CC_SEND_READ_IDLE:
     7581                {
     7582                    // WRITE
     7583                    if(r_write_to_cc_send_req.read())
     7584                    {
     7585                        r_cc_send_fsm = CC_SEND_WRITE_NCC_INVAL_HEADER;
     7586                        break;
     7587                    }
     7588                    if(m_write_to_cc_send_inst_fifo.rok() or
     7589                            r_write_to_cc_send_multi_req.read())
     7590                    {
     7591                        r_cc_send_fsm = CC_SEND_WRITE_UPDT_HEADER;
     7592                        break;
     7593                    }
     7594                    if(r_write_to_cc_send_brdcast_req.read())
     7595                    {
     7596                        r_cc_send_fsm = CC_SEND_WRITE_BRDCAST_HEADER;
     7597                        break;
     7598                    }
     7599                    // CONFIG
     7600                    if(r_config_to_cc_send_multi_req.read())
     7601                    {
     7602                        r_cc_send_fsm = CC_SEND_CONFIG_INVAL_HEADER;
     7603                        break;
     7604                    }
     7605                    if(r_config_to_cc_send_brdcast_req.read())
     7606                    {
     7607                        r_cc_send_fsm = CC_SEND_CONFIG_BRDCAST_HEADER;
     7608                        break;
     7609                    }
     7610                    // XRAM_RSP
     7611                    if(m_xram_rsp_to_cc_send_inst_fifo.rok() or
     7612                            r_xram_rsp_to_cc_send_multi_req.read())
     7613                    {
     7614                        r_cc_send_fsm = CC_SEND_XRAM_RSP_INVAL_HEADER;
     7615                        break;
     7616                    }
     7617                    if(r_xram_rsp_to_cc_send_brdcast_req.read())
     7618                    {
     7619                        r_cc_send_fsm = CC_SEND_XRAM_RSP_BRDCAST_HEADER;
     7620                        break;
     7621                    }
    73997622                    // CAS
    74007623                    if(m_cas_to_cc_send_inst_fifo.rok() or
     
    74097632                        break;
    74107633                    }
    7411 
     7634                    // READ
    74127635                    if(r_read_to_cc_send_req.read())
    74137636                    {
     
    74157638                        break;
    74167639                    }
    7417 
    7418                     if(r_write_to_cc_send_req.read())
    7419                     {
    7420                         r_cc_send_fsm = CC_SEND_WRITE_NCC_INVAL_HEADER;
     7640                    break;
     7641
     7642                }
     7643                ///////////////////////////
     7644            case CC_SEND_XRAM_RSP_IDLE:   // CAS FSM has highest priority
     7645                {
     7646                    // CAS
     7647                    if(m_cas_to_cc_send_inst_fifo.rok() or
     7648                            r_cas_to_cc_send_multi_req.read())
     7649                    {
     7650                        r_cc_send_fsm = CC_SEND_CAS_UPDT_HEADER;
    74217651                        break;
    74227652                    }
    7423 
    7424 
    7425                     // WRITE
     7653                    if(r_cas_to_cc_send_brdcast_req.read())
     7654                    {
     7655                        r_cc_send_fsm = CC_SEND_CAS_BRDCAST_HEADER;
     7656                        break;
     7657                    }
     7658
     7659                    // READ
    74267660                    if(r_read_to_cc_send_req.read())
    74277661                    {
     
    74307664                    }
    74317665
     7666                    // WRITE
    74327667                    if(r_write_to_cc_send_req.read())
    74337668                    {
     
    74737708                }
    74747709                //////////////////////
    7475             case CC_SEND_CAS_IDLE:   // CLEANUP FSM has highest priority
    7476                 {
    7477 
     7710            case CC_SEND_CAS_IDLE:   // READ FSM has highest priority
     7711                {
     7712
     7713                    // READ
    74787714                    if(r_read_to_cc_send_req.read())
    74797715                    {
     
    74817717                        break;
    74827718                    }
    7483 
     7719                    // WRITE
    74847720                    if(r_write_to_cc_send_req.read())
    74857721                    {
     
    74887724                    }
    74897725
    7490 
    74917726                    if(m_write_to_cc_send_inst_fifo.rok() or
    74927727                            r_write_to_cc_send_multi_req.read())
     
    75117746                        break;
    75127747                    }
     7748                    // XRAM RSP
    75137749                    if(m_xram_rsp_to_cc_send_inst_fifo.rok() or
    75147750                            r_xram_rsp_to_cc_send_multi_req.read())
     
    75227758                        break;
    75237759                    }
     7760                    // CAS
    75247761                    if(m_cas_to_cc_send_inst_fifo.rok() or
    75257762                            r_cas_to_cc_send_multi_req.read())
     
    76837920
    76847921                    r_read_to_cc_send_req = false;
    7685                     r_cc_send_fsm = CC_SEND_WRITE_IDLE;
     7922                    r_cc_send_fsm = CC_SEND_READ_IDLE;
    76867923
    76877924#if DEBUG_MEMC_CC_SEND
     
    76917928                            << "  <MEMC " << name()
    76927929                            << " CC_SEND_READ_NCC_INVAL_HEADER> Inval for line "
    7693                             << r_read_to_cc_send_nline.read()
     7930                            << std::hex <<r_read_to_cc_send_nline.read() << std::dec
    76947931                            << std::endl;
    76957932                    }
     
    77207957                            << "  <MEMC " << name()
    77217958                            << " CC_SEND_WRITE_NCC_INVAL_HEADER> Inval for line "
    7722                             << r_write_to_cc_send_nline.read()
     7959                            << std::hex << r_write_to_cc_send_nline.read() << std::dec
    77237960                            << std::endl;
    77247961                    }
     
    83698606                }
    83708607                /////////////////////
    8371             case TGT_RSP_CLEANUP:   // pas clair pour moi (AG)
     8608            case TGT_RSP_CLEANUP:
    83728609                {
    83738610                    if(p_vci_tgt.rspack)
     
    96169853            }
    96179854        }
    9618         //m_cc_receive_to_cleanup_fifo.update( cc_receive_to_cleanup_fifo_get,
    9619         //                                     cc_receive_to_cleanup_fifo_put,
    9620         //                                     p_dspin_p2m.data.read() );
    96219855
    96229856        ////////////////////////////////////////////////////////////////////////////////////
     
    96799913            r_config_rsp_lines = r_config_rsp_lines.read() - 1;
    96809914        }
     9915
     9916        ////////////////////////////////////////////////////////////////////////////////////
     9917        //            Update min m_cpt_heap_min_slot_available.
     9918        // The four sources of (increment / decrement) are READ / CLEANUP / XRAM_RSP / CONFIG FSMs
     9919        ////////////////////////////////////////////////////////////////////////////////////
     9920        assert((m_cpt_heap_slot_available <= m_heap_size) and "m_cpt_heap_slot_available > m_heap_size");
     9921        assert((m_cpt_heap_min_slot_available <= m_heap_size) and "m_cpt_heap_min_slot_available > m_heap_size");
     9922        m_cpt_heap_min_slot_available = min_value(m_cpt_heap_min_slot_available, m_cpt_heap_slot_available);
    96819923
    96829924    } // end transition()
     
    975910001            p_vci_ixr.cmd     = vci_param_ext::CMD_WRITE;
    976010002            p_vci_ixr.cmdval  = true;
    9761             /*p_vci_ixr.address = (addr_t)((r_cleanup_to_ixr_cmd_nline.read() * m_words +
    9762               r_ixr_cmd_word.read()) * 4);*/
    976310003            p_vci_ixr.address = (addr_t)r_ixr_cmd_address.read() + (r_ixr_cmd_word.read()<<2);
    976410004            p_vci_ixr.wdata   = ((wide_data_t)(r_ixr_cmd_wdata[r_ixr_cmd_word.read()].read()) |
     
    998810228
    998910229        ////////////////////////////////////////////////////////////////////
     10230        //  p_irq port
     10231        //
     10232        //  WRITE MISS response error signaling
     10233        ////////////////////////////////////////////////////////////////////
     10234
     10235        p_irq =
     10236            r_xram_rsp_rerror_irq.read() &&
     10237            r_xram_rsp_rerror_irq_enable.read();
     10238
     10239        ////////////////////////////////////////////////////////////////////
    999010240        //  p_dspin_m2p port (CC_SEND FSM)
    999110241        ////////////////////////////////////////////////////////////////////
     
    1002610276                            DspinDhccpParam::MULTI_INVAL_DEST);
    1002710277
    10028                     DspinDhccpParam::dspin_set( flit,
    10029                             m_cc_global_id,
    10030                             DspinDhccpParam::MULTI_INVAL_SRCID);
    10031 
    1003210278                    // MODIFIED FOR CONFIG INVAL (solution 1 bit in flit multi_inval)
    1003310279                    DspinDhccpParam::dspin_set( flit,
     
    1008210328
    1008310329                    DspinDhccpParam::dspin_set( flit,
    10084                             m_cc_global_id,
    10085                             DspinDhccpParam::MULTI_INVAL_SRCID);
    10086 
    10087                     DspinDhccpParam::dspin_set( flit,
    1008810330                            r_xram_rsp_to_cc_send_trdid.read(),
    1008910331                            DspinDhccpParam::MULTI_INVAL_UPDT_INDEX);
     
    1011910361                            m_broadcast_boundaries,
    1012010362                            DspinDhccpParam::BROADCAST_BOX);
    10121                     // MODIFIED FOR CONFIG INVAL (solution 1 bit in flit multi_inval)
     10363                   
    1012210364                    DspinDhccpParam::dspin_set( flit,
    1012310365                            1,
    1012410366                            DspinDhccpParam::MULTI_INVAL_IS_CONFIG);
    10125 
    10126                     DspinDhccpParam::dspin_set( flit,
    10127                             m_cc_global_id,
    10128                             DspinDhccpParam::BROADCAST_SRCID);
    1012910367
    1013010368                    DspinDhccpParam::dspin_set( flit,
     
    1014510383                            m_broadcast_boundaries,
    1014610384                            DspinDhccpParam::BROADCAST_BOX);
    10147 
    10148                     DspinDhccpParam::dspin_set( flit,
    10149                             m_cc_global_id,
    10150                             DspinDhccpParam::BROADCAST_SRCID);
    1015110385
    1015210386                    DspinDhccpParam::dspin_set( flit,
     
    1020410438                    DspinDhccpParam::dspin_set(
    1020510439                            flit,
    10206                             m_cc_global_id,
    10207                             DspinDhccpParam::MULTI_INVAL_SRCID);
    10208 
    10209                     DspinDhccpParam::dspin_set(
    10210                             flit,
    1021110440                            DspinDhccpParam::TYPE_MULTI_INVAL_DATA,
    1021210441                            DspinDhccpParam::M2P_TYPE);
     
    1024610475                            r_write_to_cc_send_dest.read(),
    1024710476                            DspinDhccpParam::MULTI_INVAL_DEST);
    10248 
    10249                     DspinDhccpParam::dspin_set(
    10250                             flit,
    10251                             m_cc_global_id,
    10252                             DspinDhccpParam::MULTI_INVAL_SRCID);
    1025310477
    1025410478                    DspinDhccpParam::dspin_set(
     
    1033310557                    DspinDhccpParam::dspin_set(
    1033410558                            flit,
    10335                             m_cc_global_id,
    10336                             DspinDhccpParam::MULTI_UPDT_SRCID);
    10337 
    10338                     DspinDhccpParam::dspin_set(
    10339                             flit,
    1034010559                            r_write_to_cc_send_trdid.read(),
    1034110560                            DspinDhccpParam::MULTI_UPDT_UPDT_INDEX);
     
    1042310642                            dest,
    1042410643                            DspinDhccpParam::MULTI_UPDT_DEST);
    10425 
    10426                     DspinDhccpParam::dspin_set(
    10427                             flit,
    10428                             m_cc_global_id,
    10429                             DspinDhccpParam::MULTI_UPDT_SRCID);
    1043010644
    1043110645                    DspinDhccpParam::dspin_set(
Note: See TracChangeset for help on using the changeset viewer.