Changeset 68


Ignore:
Timestamp:
Aug 2, 2010, 6:53:05 PM (14 years ago)
Author:
bouyer
Message:

A SC cause the dcache entry to be updated by the memcache, and the
tlb entry to be invalidated. So just go back to DCACHE_IDLE to redo a lookup.
Assert that the data is not in dcache in CC_CHECK when we're not going
to update/invalidate the cache or tlb.
Drop DCACHE_WRITE_DIRTY state, it's not used any more.

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

Legend:

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

    r50 r68  
    114114        DCACHE_SC_DIRTY_WAIT,       // 19
    115115        DCACHE_WRITE_UPDT,          // 1a
    116         DCACHE_WRITE_DIRTY,         // 1b
    117         DCACHE_WRITE_REQ,           // 1c
    118         DCACHE_MISS_WAIT,           // 1d
    119         DCACHE_MISS_UPDT,           // 1e
    120         DCACHE_UNC_WAIT,            // 1f
    121         DCACHE_ERROR,               // 20
    122         DCACHE_ITLB_READ,           // 21
    123         DCACHE_ITLB_UPDT,           // 22
    124         DCACHE_ITLB_LL_WAIT,        // 23
    125         DCACHE_ITLB_SC_WAIT,        // 24
    126         DCACHE_CC_CHECK,            // 25
    127         DCACHE_CC_INVAL,            // 26
    128         DCACHE_CC_UPDT,             // 27
    129         DCACHE_CC_NOP,              // 28
    130         DCACHE_TLB_CC_INVAL,        // 29
    131         DCACHE_ITLB_CLEANUP,        // 2a
     116        DCACHE_WRITE_REQ,           // 1b
     117        DCACHE_MISS_WAIT,           // 1c
     118        DCACHE_MISS_UPDT,           // 1d
     119        DCACHE_UNC_WAIT,            // 1e
     120        DCACHE_ERROR,               // 1f
     121        DCACHE_ITLB_READ,           // 20
     122        DCACHE_ITLB_UPDT,           // 21
     123        DCACHE_ITLB_LL_WAIT,        // 22
     124        DCACHE_ITLB_SC_WAIT,        // 23
     125        DCACHE_CC_CHECK,            // 24
     126        DCACHE_CC_INVAL,            // 25
     127        DCACHE_CC_UPDT,             // 26
     128        DCACHE_CC_NOP,              // 27
     129        DCACHE_TLB_CC_INVAL,        // 28
     130        DCACHE_ITLB_CLEANUP,        // 29
    132131    };
    133132
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r62 r68  
    8585        "DCACHE_SC_DIRTY_WAIT",
    8686        "DCACHE_WRITE_UPDT",
    87         "DCACHE_WRITE_DIRTY",
    8887        "DCACHE_WRITE_REQ", 
    8988        "DCACHE_MISS_WAIT", 
     
    30573056                else
    30583057                {
    3059                     r_dcache_fsm = DCACHE_WRITE_DIRTY;
     3058                    /*
     3059                     * SC succeeded, but has updated the cache and
     3060                     * invalidated the TLB entry. Redo the translation
     3061                     */
     3062                    r_dcache_fsm = DCACHE_IDLE;
    30603063                }
    30613064            }
     
    44824485        break;
    44834486    }
    4484     ////////////////////////
    4485     case DCACHE_WRITE_DIRTY:
    4486     {
    4487         m_cost_data_tlb_update_dirty_frz++;
    4488 
    4489         // external cache invalidate request
    4490         if ( r_tgt_dcache_req )
    4491         {
    4492             r_dcache_fsm = DCACHE_CC_CHECK;
    4493             r_dcache_fsm_save = r_dcache_fsm;
    4494             break;
    4495         }
    4496 
    4497         if ( r_dcache_inval_tlb_rsp ) // Miss read response and tlb invalidation
    4498         {
    4499             r_dcache_fsm = DCACHE_IDLE;
    4500             r_dcache_inval_tlb_rsp = false;
    4501             break;
    4502         }
    4503 
    4504         if ( r_dcache_inval_rsp ) // TLB miss response and cache invalidation
    4505         {
    4506             r_dcache_fsm = DCACHE_IDLE;
    4507             r_dcache_inval_rsp = false;
    4508             break;         
    4509         }
    4510 
    4511         m_cpt_dcache_data_write++;
    4512         r_dcache.write(r_dcache_tlb_paddr, r_dcache_pte_update);
    4513         dcache_tlb.setdirty(r_dcache_tlb_way_save, r_dcache_tlb_set_save);
    4514         r_dcache_fsm = DCACHE_WRITE_REQ;
    4515         drsp.valid = true;
    4516         drsp.rdata = 0;
    4517         break;
    4518     }
    45194487    /////////////////
    45204488    case DCACHE_ERROR:
     
    47584726        }
    47594727
    4760         // DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_WRITE_DIRTY DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
     4728        // DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
    47614729        // DCACHE_TLB2_LL_WAIT  DCACHE_TLB2_SC_WAIT  DCACHE_SC_DIRTY_WAIT
    47624730        if((( /*( r_dcache_fsm_save == DCACHE_UNC_WAIT ) ||*/
     
    47684736             ( r_dcache_fsm_save == DCACHE_TLB1_LL_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_LL_WAIT )   ||
    47694737             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )   ||
    4770              ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  ||
    4771              ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )*/ ) &&
     4738             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  */ ) &&
    47724739           ( (r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) )
    47734740        || (( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) || ( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) /*||
     
    47754742           ( (r_icache_paddr_save.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) ) )
    47764743        {
     4744            data_t dcache_rdata = 0;
     4745            size_t way = 0;
     4746            size_t set = 0;
     4747            bool dcache_hit = r_dcache.read(r_tgt_addr.read(), &dcache_rdata, way, &set);;
     4748            assert(!dcache_hit && "ignored update req should not be in dcache");
     4749
    47774750            r_dcache_inval_rsp = true;
    47784751            r_tgt_dcache_req = false;
     
    49414914             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )        ||
    49424915             ( r_dcache_fsm_save == DCACHE_DTLB1_READ_CACHE ) || ( r_dcache_fsm_save == DCACHE_DTLB2_READ_CACHE ) ||
    4943              ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )    ||
    4944              ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )) &&
     4916             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT ) ) &&
    49454917            (((r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) >> (uint32_log2(m_dcache_words) + 2)) == r_dcache_dtlb_inval_line.read()) )
    49464918        {
Note: See TracChangeset for help on using the changeset viewer.