Changeset 805 for branches


Ignore:
Timestamp:
Sep 15, 2014, 11:43:32 AM (10 years ago)
Author:
devigne
Message:

RWT commit :

Update from the trunk (paddr extension)

Location:
branches/RWT/modules/vci_cc_vcache_wrapper/caba/source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/RWT/modules/vci_cc_vcache_wrapper/caba/source/include/vci_cc_vcache_wrapper.h

    r771 r805  
    114114        DCACHE_XTN_IC_FLUSH,
    115115        DCACHE_XTN_IC_INVAL_PA,
     116        DCACHE_XTN_IC_PADDR_EXT,
    116117        DCACHE_XTN_IT_INVAL,
    117118        DCACHE_XTN_DC_FLUSH,
     
    329330    bool                                m_debug_ok;
    330331
     332    uint32_t                            m_dcache_paddr_ext_reset;
     333    uint32_t                            m_icache_paddr_ext_reset;
     334
    331335    ////////////////////////////////////////
    332336    // Communication with processor ISS
     
    396400    sc_signal<bool>         r_icache_tlb_rsp_error;      // tlb miss response error
    397401
     402    // Flip-Flop in ICACHE FSM for saving the cleanup victim request
     403    sc_signal<bool>         r_icache_cleanup_victim_req;
     404    sc_signal<paddr_t>      r_icache_cleanup_victim_nline;
    398405
    399406    // communication between ICACHE FSM and CC_SEND FSM
     
    403410    sc_signal<size_t>       r_icache_cc_send_way;           // ICACHE cc_send way
    404411    sc_signal<size_t>       r_icache_cc_send_updt_tab_idx;  // ICACHE cc_send update table index
    405    
    406     // Filp-Flop in ICACHE FSM for saving the cleanup victim request
    407     sc_signal<bool>         r_icache_cleanup_victim_req;
    408     sc_signal<paddr_t>      r_icache_cleanup_victim_nline;
     412
     413    // Physical address extension for data access
     414    sc_signal<uint32_t>     r_icache_paddr_ext;             // CP2 register (if vci_address > 32)
    409415
    410416    ///////////////////////////////
     
    468474    sc_signal<bool>         r_dcache_cc_need_write;     // activate the cache for writing
    469475    sc_signal<paddr_t>      r_dcache_cc_inval_addr;     // address for a cleanup transaction
    470     sc_signal<uint32_t>     r_dcache_cc_inval_data_cpt; 
     476    sc_signal<uint32_t>     r_dcache_cc_inval_data_cpt;
    471477
    472478    // coherence clack handling
     
    503509    // Filp-Flop in DCACHE FSM for saving the cleanup victim request
    504510    sc_signal<bool>         r_dcache_cleanup_victim_req;
    505     sc_signal<bool>         r_dcache_cleanup_victim_line_ncc; 
    506     sc_signal<bool>         r_dcache_cleanup_victim_updt_data; 
     511    sc_signal<bool>         r_dcache_cleanup_victim_line_ncc;
     512    sc_signal<bool>         r_dcache_cleanup_victim_updt_data;
    507513    sc_signal<paddr_t>      r_dcache_cleanup_victim_nline;
    508514
     
    513519    sc_signal<size_t>       r_dcache_cc_send_way;           // DCACHE cc_send way
    514520    sc_signal<size_t>       r_dcache_cc_send_updt_tab_idx;  // DCACHE cc_send update table index
    515    
     521
    516522    // special registers for RWT
    517523    sc_signal<bool>         r_dcache_cc_cleanup_updt_data;     // Register for cleanup with data (wb updt)
     
    519525    sc_signal<bool>         r_dcache_miss_victim_no_coherence; // Register for victim in no coherence mode
    520526    sc_signal<bool>         r_dcache_line_no_coherence;        // Register for line current in no coherence mode
    521     sc_signal<bool>         r_dcache_dirty_save;             
     527    sc_signal<bool>         r_dcache_dirty_save;
    522528    sc_signal<uint32_t>     r_cc_send_cpt_word;
    523529    sc_signal<uint32_t>     r_dcache_miss_data_cpt;
     
    559565    GenericFifo<uint32_t>   r_vci_rsp_fifo_icache;              // response FIFO to ICACHE FSM
    560566    GenericFifo<uint32_t>   r_vci_rsp_fifo_dcache;              // response FIFO to DCACHE FSM
    561    
     567
    562568
    563569    //RWT
    564570    GenericFifo<bool>       r_vci_rsp_fifo_rpktid;
    565     GenericFifo<uint32_t>   r_cc_send_data_fifo;   
     571    GenericFifo<uint32_t>   r_cc_send_data_fifo;
    566572
    567573    ///////////////////////////////////
     
    626632    sc_signal<bool>                        r_dcache_llsc_valid;
    627633
    628    
     634
    629635    sc_signal<bool>                        r_cache_frozen;
    630636
     
    806812    }
    807813
     814    /////////////////////////////////////////////////////////////
     815    // Set the m_dcache_paddr_ext_reset attribute
     816    //
     817    // The r_dcache_paddr_ext register will be initialized after
     818    // reset with the m_dcache_paddr_ext_reset value
     819    /////////////////////////////////////////////////////////////
     820    inline void set_dcache_paddr_ext_reset(uint32_t v)
     821    {
     822        m_dcache_paddr_ext_reset = v;
     823    }
     824
     825    /////////////////////////////////////////////////////////////
     826    // Set the m_icache_paddr_ext_reset attribute
     827    //
     828    // The r_icache_paddr_ext register will be initialized after
     829    // reset with the m_icache_paddr_ext_reset value
     830    /////////////////////////////////////////////////////////////
     831    inline void set_icache_paddr_ext_reset(uint32_t v)
     832    {
     833        m_icache_paddr_ext_reset = v;
     834    }
     835
    808836private:
    809837    void transition();
  • branches/RWT/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp

    r773 r805  
    2929
    3030#include <cassert>
     31#include <signal.h>
     32
    3133#include "arithmetics.h"
    3234#include "../include/vci_cc_vcache_wrapper.h"
     
    8688        "DCACHE_XTN_IC_FLUSH",
    8789        "DCACHE_XTN_IC_INVAL_PA",
     90        "DCACHE_XTN_IC_PADDR_EXT",
    8891        "DCACHE_XTN_IT_INVAL",
    8992        "DCACHE_XTN_DC_FLUSH",
     
    161164
    162165const char *cc_receive_fsm_state_str[] = {
    163         "CC_RECEIVE_IDLE",                 
    164         "CC_RECEIVE_BRDCAST_HEADER",       
    165         "CC_RECEIVE_BRDCAST_NLINE",       
    166         "CC_RECEIVE_INS_INVAL_HEADER",     
    167         "CC_RECEIVE_INS_INVAL_NLINE",     
    168         "CC_RECEIVE_INS_UPDT_HEADER",     
    169         "CC_RECEIVE_INS_UPDT_NLINE",       
    170         "CC_RECEIVE_INS_UPDT_DATA",       
    171         "CC_RECEIVE_DATA_INVAL_HEADER",   
    172         "CC_RECEIVE_DATA_INVAL_NLINE",     
    173         "CC_RECEIVE_DATA_UPDT_HEADER",     
    174         "CC_RECEIVE_DATA_UPDT_NLINE",     
    175         "CC_RECEIVE_DATA_UPDT_DATA",       
     166        "CC_RECEIVE_IDLE",
     167        "CC_RECEIVE_BRDCAST_HEADER",
     168        "CC_RECEIVE_BRDCAST_NLINE",
     169        "CC_RECEIVE_INS_INVAL_HEADER",
     170        "CC_RECEIVE_INS_INVAL_NLINE",
     171        "CC_RECEIVE_INS_UPDT_HEADER",
     172        "CC_RECEIVE_INS_UPDT_NLINE",
     173        "CC_RECEIVE_INS_UPDT_DATA",
     174        "CC_RECEIVE_DATA_INVAL_HEADER",
     175        "CC_RECEIVE_DATA_INVAL_NLINE",
     176        "CC_RECEIVE_DATA_UPDT_HEADER",
     177        "CC_RECEIVE_DATA_UPDT_NLINE",
     178        "CC_RECEIVE_DATA_UPDT_DATA",
    176179    };
    177180
     
    250253      m_debug_start_cycle( debug_start_cycle ),
    251254      m_debug_ok( debug_ok ),
     255      m_dcache_paddr_ext_reset(0),
     256      m_icache_paddr_ext_reset(0),
    252257
    253258      r_mmu_ptpr("r_mmu_ptpr"),
     
    284289      r_icache_tlb_rsp_error("r_icache_tlb_rsp_error"),
    285290
     291      r_icache_cleanup_victim_req("r_icache_cleanup_victim_req"),
     292      r_icache_cleanup_victim_nline("r_icache_cleanup_victim_nline"),
     293
    286294      r_icache_cc_send_req("r_icache_cc_send_req"),
    287295      r_icache_cc_send_type("r_icache_cc_send_type"),
     
    289297      r_icache_cc_send_way("r_icache_cc_send_way"),
    290298      r_icache_cc_send_updt_tab_idx("r_icache_cc_send_updt_tab_idx"),
    291  
    292       r_icache_cleanup_victim_req("r_icache_cleanup_victim_req"),
    293       r_icache_cleanup_victim_nline("r_icache_cleanup_victim_nline"),
    294299
    295300      r_dcache_fsm("r_dcache_fsm"),
     
    354359      r_dcache_xtn_req("r_dcache_xtn_req"),
    355360      r_dcache_xtn_opcode("r_dcache_xtn_opcode"),
    356      
     361
    357362      r_dcache_cleanup_victim_req("r_dcache_cleanup_victim_req"),
    358363      r_dcache_cleanup_victim_nline("r_dcache_cleanup_victim_nline"),
    359  
     364
    360365      r_dcache_cc_send_req("r_dcache_cc_send_req"),
    361366      r_dcache_cc_send_type("r_dcache_cc_send_type"),
     
    487492{
    488493    // b0 : write buffer trace
    489     // b1 : write buffer verbose
     494    // b1 : dump processor registers
    490495    // b2 : dcache trace
    491496    // b3 : icache trace
    492497    // b4 : dtlb trace
    493498    // b5 : itlb trace
     499
    494500    std::cout << std::dec << "PROC " << name() << std::endl;
    495501
     
    508514              << " | " << cc_send_fsm_state_str[r_cc_send_fsm.read()]
    509515              << " | MMU = " << r_mmu_mode.read();
     516
    510517    if (r_dcache_updt_req.read() ) std::cout << " | P1_UPDT";
    511518    if (r_dcache_wbuf_req.read() ) std::cout << " | P1_WBUF";
     
    514521    if(mode & 0x01)
    515522    {
     523        if ( r_icache_miss_req.read()     ) std::cout << "  IMISS_REQ" << std::endl;
     524        if ( r_icache_unc_req.read()      ) std::cout << "  IUNC_REQ" << std::endl;
     525        if ( r_dcache_vci_miss_req.read() ) std::cout << "  DMISS_REQ" << std::endl;
     526        if ( r_dcache_vci_unc_req.read()  ) std::cout << "  DUNC_REQ" << std::endl;
     527
    516528        r_wbuf.printTrace((mode>>1)&1);
     529    }
     530    if(mode & 0x02)
     531    {
     532        r_iss.dump();
    517533    }
    518534    if(mode & 0x04)
     
    772788
    773789        // reset data physical address extension
    774         r_dcache_paddr_ext = 0;
     790        r_dcache_paddr_ext = m_dcache_paddr_ext_reset;
     791
     792        // reset inst physical address extension
     793        r_icache_paddr_ext = m_icache_paddr_ext_reset;
    775794
    776795        // reset dcache directory extension
     
    800819        // No request from ICACHE_FSM to CC_SEND FSM
    801820        r_icache_cc_send_req       = false;
     821        r_icache_cleanup_victim_req = false;
    802822
    803823        r_icache_clack_req         = false;
     
    879899        m_cpt_data_write_back   = 0;
    880900        m_cpt_data_cleanup      = 0;
    881         m_cpt_cleanup_data_not_dirty = 0; 
     901        m_cpt_cleanup_data_not_dirty = 0;
    882902        m_cpt_ins_miss          = 0;
    883903        m_cpt_unc_read          = 0;
     
    11111131
    11121132        // XTN requests sent by DCACHE FSM
    1113         // These request are not executed in this IDLE state, because
    1114         // they require access to icache or itlb, that are already accessed
     1133        // These request are not executed in this IDLE state (except XTN_INST_PADDR_EXT),
     1134        // because they require access to icache or itlb, that are already accessed
    11151135        if ( r_dcache_xtn_req.read() )
    11161136        {
     
    11341154            else if ( (int)r_dcache_xtn_opcode.read() == (int)iss_t::XTN_MMU_ICACHE_PA_INV)
    11351155            {
    1136                         if (sizeof(paddr_t) <= 32)
     1156                if (sizeof(paddr_t) <= 32)
    11371157                {
    1138                                 assert(r_mmu_word_hi.read() == 0 &&
    1139                                 "illegal XTN request in ICACHE: high bits should be 0 for 32bit paddr");
    1140                                 r_icache_vci_paddr = (paddr_t)r_mmu_word_lo.read();
     1158                    assert(r_mmu_word_hi.read() == 0 &&
     1159                    "illegal XTN request in ICACHE: high bits should be 0 for 32bit paddr");
     1160                    r_icache_vci_paddr = (paddr_t)r_mmu_word_lo.read();
    11411161                }
    11421162                else
    11431163                {
    1144                                 r_icache_vci_paddr = (uint64_t)r_mmu_word_hi.read() << 32 |
    1145                                                          (paddr_t)r_mmu_word_lo.read();
    1146                         }
    1147                 r_icache_fsm         = ICACHE_XTN_CACHE_INVAL_PA;
     1164                    r_icache_vci_paddr = (paddr_t)r_mmu_word_hi.read() << 32 |
     1165                                         (paddr_t)r_mmu_word_lo.read();
     1166                }
     1167                r_icache_fsm = ICACHE_XTN_CACHE_INVAL_PA;
     1168            }
     1169            else if ( (int)r_dcache_xtn_opcode.read() == (int)iss_t::XTN_INST_PADDR_EXT)
     1170            {
     1171                r_icache_paddr_ext = r_dcache_save_wdata.read();
     1172                r_dcache_xtn_req   = false;
    11481173            }
    11491174            else
     
    11851210                                            &paddr,
    11861211                                            &tlb_flags,
    1187                                             &tlb_nline, // unused
    1188                                             &tlb_way,   // unused
    1189                                             &tlb_set ); // unused
    1190             }
    1191             // Not yet supported
    1192             //else if (vci_param::N > 32)
    1193             //{
    1194             //    paddr = paddr | ((paddr_t) r_icache_paddr_ext.read() << 32);
    1195             //}
    1196 
     1212                                            &tlb_nline, // unused
     1213                                            &tlb_way,   // unused
     1214                                            &tlb_set ); // unused
     1215            }
     1216            else if (vci_param::N > 32)
     1217            {
     1218                paddr = paddr | ((paddr_t) r_icache_paddr_ext.read() << 32);
     1219            }
    11971220
    11981221            // systematic icache access (if activated)
     
    12711294            if ( cacheable )
    12721295            {
     1296
    12731297                if (cache_state == CACHE_SLOT_STATE_EMPTY)          // cache miss
    12741298                {
     
    13041328if ( m_debug_activated )
    13051329std::cout << "  <PROC " << name() << " ICACHE_IDLE> READ HIT in icache"
    1306           << " : PADDR = " << std::hex << paddr << std::endl;
     1330          << " : PADDR = " << std::hex << paddr
     1331          << " / INST  = " << cache_inst << std::dec << std::endl;
    13071332#endif
    13081333                }
     
    16071632            break;
    16081633        }
     1634
    16091635
    16101636        bool        found;
     
    17551781    std::cout << "  <PROC " << name()
    17561782              << " ICACHE_MISS_DATA_UPDT> Write one word:"
    1757               << " WDATA = " << r_vci_rsp_fifo_icache.read()
     1783              << " WDATA = " << std::hex << r_vci_rsp_fifo_icache.read()
    17581784              << " WAY = " << r_icache_miss_way.read()
    17591785              << " SET = " << r_icache_miss_set.read()
     
    17821808        if ( m_ireq.valid ) m_cost_ins_miss_frz++;
    17831809
     1810        // send cleanup victim request
    17841811        if ( r_icache_cleanup_victim_req.read() and not r_icache_cc_send_req.read() )
    17851812        {
     
    23152342                // we take into account the paddr extension
    23162343                if (vci_param::N > 32)
    2317                     paddr = paddr | ((uint64_t)(r_dcache_paddr_ext.read()) << 32);
     2344                    paddr = paddr | ((paddr_t)(r_dcache_paddr_ext.read()) << 32);
    23182345            }
    23192346        } // end physical address computation
     
    23222349        if ( r_mmu_mode.read() & DATA_CACHE_MASK)
    23232350        {
     2351
    23242352            if ( m_dreq.valid and r_dcache_updt_req.read() ) // read DIR and write DATA
    23252353            {
     
    25412569                    case iss_t::XTN_DATA_PADDR_EXT:
    25422570                        m_drsp.rdata = r_dcache_paddr_ext.read();
     2571                        m_drsp.valid = true;
     2572                        m_drsp.error = false;
     2573                        break;
     2574
     2575                    case iss_t::XTN_INST_PADDR_EXT:
     2576                        m_drsp.rdata = r_icache_paddr_ext.read();
    25432577                        m_drsp.valid = true;
    25442578                        m_drsp.error = false;
     
    26202654                        else
    26212655                        {
    2622                             r_dcache_save_paddr = (uint64_t)r_mmu_word_hi.read() << 32 |
     2656                            r_dcache_save_paddr = (paddr_t)r_mmu_word_hi.read() << 32 |
    26232657                                                  (paddr_t)r_mmu_word_lo.read();
    26242658                        }
     
    26712705                        m_drsp.valid       = true;
    26722706                        r_dcache_fsm       = DCACHE_IDLE;
     2707                    break;
     2708
     2709                    case iss_t::XTN_INST_PADDR_EXT:     // no cache or tlb access
     2710                        r_dcache_xtn_req = true;
     2711                        r_dcache_fsm     = DCACHE_XTN_IC_PADDR_EXT;
    26732712                    break;
    26742713
     
    28222861std::cout << "  <PROC " << name() << " DCACHE_IDLE>"
    28232862          << " READ HIT in dcache"
    2824           << " / PADDR = " << std::hex << paddr << std::endl;
     2863          << " : PADDR = " << std::hex << paddr
     2864          << " / DATA  = " << std::hex << cache_rdata << std::dec << std::endl;
    28252865#endif
    28262866                            }
     
    34833523                r_cas_local_set  = set;
    34843524                r_cas_local_word = word;
    3485          
     3525
    34863526#if DEBUG_DCACHE
    34873527if ( m_debug_activated )
     
    38783918    }
    38793919    ////////////////////////
    3880     case DCACHE_XTN_IC_FLUSH:           // Waiting completion of an XTN request to the ICACHE FSM
    3881     case DCACHE_XTN_IC_INVAL_VA:        // Caution : the itlb miss requests must be taken
    3882     case DCACHE_XTN_IC_INVAL_PA:        // because the XTN_ICACHE_INVAL request to icache
    3883     case DCACHE_XTN_IT_INVAL:           // can generate an itlb miss,
    3884                                     // and because it can exist a simultaneous ITLB miss
     3920    case DCACHE_XTN_IC_FLUSH:       // Waiting completion of an XTN request to the ICACHE FSM
     3921    case DCACHE_XTN_IC_INVAL_VA:    // Caution : the itlb miss requests must be taken
     3922    case DCACHE_XTN_IC_INVAL_PA:    // because the XTN_ICACHE_INVAL request to icache
     3923    case DCACHE_XTN_IC_PADDR_EXT:   // can generate an itlb miss,
     3924    case DCACHE_XTN_IT_INVAL:       // and because it can exist a simultaneous ITLB miss
     3925
    38853926    {
    38863927        // coherence clack request (from DSPIN CLACK)
     
    41114152        {
    41124153            paddr = (paddr_t)r_dcache_save_wdata.read();
     4154            if (vci_param::N > 32)
     4155                paddr = paddr | ((paddr_t)(r_dcache_paddr_ext.read()) << 32);
    41134156            hit   = true;
    41144157        }
     
    42844327    }
    42854328
    4286     /*ODCCP*/
     4329    /*RWT*/
    42874330    //////////////////////////////
    42884331    case DCACHE_XTN_DC_INVAL_DATA:
     
    60416084            if (p_vci.rspval.read())
    60426085            {
    6043                 /**/
    6044                 if( p_vci.reop.read() ==0)
    6045                 {
    6046                     std::cout << "PROC " << m_srcid
    6047                               << "/ CYCLE " << m_cpt_total_cycles
    6048                               <<std::endl;
    6049                 }
    60506086                assert( p_vci.reop.read() and
    60516087                "a VCI response packet must contain one flit for a write transaction");
Note: See TracChangeset for help on using the changeset viewer.