Ignore:
Timestamp:
Dec 6, 2010, 6:12:46 AM (14 years ago)
Author:
gao
Message:

Modification for synthetisable reason

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

    r88 r119  
    6868        ICACHE_TLB1_READ,           // 02
    6969        ICACHE_TLB1_WRITE,          // 03
    70         ICACHE_TLB1_UPDT,           // 04
    71         ICACHE_TLB2_READ,           // 05
    72         ICACHE_TLB2_WRITE,          // 06
    73         ICACHE_TLB2_UPDT,           // 07
    74         ICACHE_SW_FLUSH,            // 08
    75         ICACHE_TLB_FLUSH,           // 09
    76         ICACHE_CACHE_FLUSH,         // 0a
    77         ICACHE_TLB_INVAL,           // 0b
    78         ICACHE_CACHE_INVAL,         // 0c
    79         ICACHE_CACHE_INVAL_PA,      // 0d
    80         ICACHE_MISS_WAIT,           // 0e
    81         ICACHE_UNC_WAIT,            // 0f
    82         ICACHE_MISS_UPDT,           // 10
    83         ICACHE_ERROR,               // 11
    84         ICACHE_CC_INVAL,            // 12
    85         ICACHE_TLB_CC_INVAL,        // 13
     70        ICACHE_TLB1_UPDT_SEL,       // 04
     71        ICACHE_TLB1_UPDT,           // 05
     72        ICACHE_TLB2_READ,           // 06
     73        ICACHE_TLB2_WRITE,          // 07
     74        ICACHE_TLB2_UPDT_SEL,       // 08
     75        ICACHE_TLB2_UPDT,           // 09
     76        ICACHE_SW_FLUSH,            // 0a
     77        ICACHE_TLB_FLUSH,           // 0b
     78        ICACHE_CACHE_FLUSH,         // 0c
     79        ICACHE_TLB_INVAL,           // 0d
     80        ICACHE_CACHE_INVAL,         // 0e
     81        ICACHE_CACHE_INVAL_PA,      // 0f
     82        ICACHE_MISS_WAIT,           // 10
     83        ICACHE_UNC_WAIT,            // 11
     84        ICACHE_MISS_UPDT,           // 12
     85        ICACHE_ERROR,               // 13
     86        ICACHE_CC_INVAL,            // 14
     87        ICACHE_TLB_CC_INVAL,        // 15
    8688    };
    8789
     
    9496        DCACHE_TLB1_READ,           // 05
    9597        DCACHE_TLB1_READ_UPDT,      // 06
    96         DCACHE_TLB1_UPDT,           // 07
    97         DCACHE_DTLB2_READ_CACHE,    // 08
    98         DCACHE_TLB2_LL_WAIT,        // 09
    99         DCACHE_TLB2_SC_WAIT,        // 0a
    100         DCACHE_TLB2_READ,           // 0b
    101         DCACHE_TLB2_READ_UPDT,      // 0c
    102         DCACHE_TLB2_UPDT,           // 0d
    103         DCACHE_CTXT_SWITCH,         // 0e
    104         DCACHE_ICACHE_FLUSH,        // 0f
    105         DCACHE_DCACHE_FLUSH,        // 10
    106         DCACHE_ITLB_INVAL,          // 11
    107         DCACHE_DTLB_INVAL,          // 12
    108         DCACHE_ICACHE_INVAL,        // 13
    109         DCACHE_DCACHE_INVAL,        // 14
    110             DCACHE_ICACHE_INVAL_PA,     // 15
    111             DCACHE_DCACHE_INVAL_PA,     // 16
    112         DCACHE_DCACHE_SYNC,         // 17
    113         DCACHE_LL_DIRTY_WAIT,       // 18
    114         DCACHE_SC_DIRTY_WAIT,       // 19
    115         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
     98        DCACHE_TLB1_UPDT_SEL,       // 07
     99        DCACHE_TLB1_UPDT,           // 08
     100        DCACHE_DTLB2_READ_CACHE,    // 09
     101        DCACHE_TLB2_LL_WAIT,        // 0a
     102        DCACHE_TLB2_SC_WAIT,        // 0b
     103        DCACHE_TLB2_READ,           // 0c
     104        DCACHE_TLB2_READ_UPDT,      // 0d
     105        DCACHE_TLB2_UPDT_SEL,       // 0e
     106        DCACHE_TLB2_UPDT,           // 0f
     107        DCACHE_CTXT_SWITCH,         // 10
     108        DCACHE_ICACHE_FLUSH,        // 11
     109        DCACHE_DCACHE_FLUSH,        // 12
     110        DCACHE_ITLB_INVAL,          // 13
     111        DCACHE_DTLB_INVAL,          // 14
     112        DCACHE_ICACHE_INVAL,        // 15
     113        DCACHE_DCACHE_INVAL,        // 16
     114            DCACHE_ICACHE_INVAL_PA,     // 17
     115            DCACHE_DCACHE_INVAL_PA,     // 18
     116        DCACHE_DCACHE_SYNC,         // 19
     117        DCACHE_LL_DIRTY_WAIT,       // 1a
     118        DCACHE_SC_DIRTY_WAIT,       // 1b
     119        DCACHE_WRITE_UPDT,          // 1c
     120        DCACHE_WRITE_DIRTY,         // 1d
     121        DCACHE_WRITE_REQ,           // 1e
     122        DCACHE_MISS_WAIT,           // 1f
     123        DCACHE_MISS_UPDT,           // 20
     124        DCACHE_UNC_WAIT,            // 21
     125        DCACHE_ERROR,               // 22
     126        DCACHE_ITLB_READ,           // 23
     127        DCACHE_ITLB_UPDT,           // 24
     128        DCACHE_ITLB_LL_WAIT,        // 25
     129        DCACHE_ITLB_SC_WAIT,        // 26
     130        DCACHE_CC_CHECK,            // 27
     131        DCACHE_CC_INVAL,            // 28
     132        DCACHE_CC_UPDT,             // 29
     133        DCACHE_CC_NOP,              // 2a
     134        DCACHE_TLB_CC_INVAL,        // 2b
     135        DCACHE_ITLB_CLEANUP,        // 2c
    132136    };
    133137
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r108 r119  
    4040        "ICACHE_BIS",       
    4141        "ICACHE_TLB1_READ", 
    42         "ICACHE_TLB1_WRITE", 
     42        "ICACHE_TLB1_WRITE",
     43        "ICACHE_TLB1_UPDT_SEL", 
    4344        "ICACHE_TLB1_UPDT", 
    4445        "ICACHE_TLB2_READ", 
    45         "ICACHE_TLB2_WRITE", 
     46        "ICACHE_TLB2_WRITE",
     47        "ICACHE_TLB2_UPDT_SEL", 
    4648        "ICACHE_TLB2_UPDT", 
    4749        "ICACHE_SW_FLUSH",
     
    6567        "DCACHE_TLB1_SC_WAIT",   
    6668        "DCACHE_TLB1_READ",
    67         "DCACHE_TLB1_READ_UPDT", 
     69        "DCACHE_TLB1_READ_UPDT",
     70        "DCACHE_TLB1_UPDT_SEL", 
    6871        "DCACHE_TLB1_UPDT",
    6972        "DCACHE_DTLB2_READ_CACHE",
     
    7275        "DCACHE_TLB2_READ",
    7376        "DCACHE_TLB2_READ_UPDT", 
     77        "DCACHE_TLB2_UPDT_SEL",
    7478        "DCACHE_TLB2_UPDT",   
    7579        "DCACHE_CTXT_SWITCH",   
     
    11171121                if ( !icache_hit_c )
    11181122                {
    1119                     m_cpt_ins_miss++;
    1120                     m_cost_ins_miss_frz++;
    11211123                    if ( icache_cached )
    11221124                    {
     
    11251127                        r_icache_vaddr_req = ireq.addr;
    11261128                        r_icache_fsm = ICACHE_MISS_WAIT;
     1129                        m_cpt_ins_miss++;
     1130                        m_cost_ins_miss_frz++;
    11271131                    }
    11281132                    else
     
    11501154    case ICACHE_BIS:
    11511155    {
     1156        if ( ireq.valid ) m_cost_ins_miss_frz++;
     1157
    11521158        // external cache invalidate request
    11531159        if ( r_tgt_icache_req )
    11541160        {
    1155             if ( ireq.valid ) m_cost_ins_miss_frz++;
    11561161            r_icache_fsm = ICACHE_CC_INVAL;
    11571162            r_icache_fsm_save = r_icache_fsm;
     
    11621167        if ( r_dcache_itlb_inval_req )
    11631168        {
    1164             if ( ireq.valid ) m_cost_ins_miss_frz++;
    11651169            r_itlb_inval_req = true;
    11661170            r_icache_fsm = ICACHE_TLB_CC_INVAL;
     
    11721176        if ( r_icache_inval_tlb_rsp )
    11731177        {
    1174             if ( ireq.valid ) m_cost_ins_miss_frz++;
    11751178            r_icache_inval_tlb_rsp = false;
    11761179            r_icache_fsm = ICACHE_IDLE;
     
    12841287                            {
    12851288                                r_icache_pte_update = r_dcache_rsp_itlb_miss;
    1286                                 r_icache_fsm        = ICACHE_TLB1_UPDT;
     1289                                r_icache_fsm        = ICACHE_TLB1_UPDT_SEL;
    12871290                            }
    12881291                            else
     
    13001303                            {
    13011304                                r_icache_pte_update = r_dcache_rsp_itlb_miss;
    1302                                 r_icache_fsm        = ICACHE_TLB1_UPDT;
     1305                                r_icache_fsm        = ICACHE_TLB1_UPDT_SEL;
    13031306                            }
    13041307                            else
     
    13771380                else 
    13781381                {
    1379                     r_icache_fsm = ICACHE_TLB1_UPDT
     1382                    r_icache_fsm = ICACHE_TLB1_UPDT_SEL
    13801383                }
    13811384            }
     
    14051408    }
    14061409    //////////////////////
    1407     case ICACHE_TLB1_UPDT:
     1410    case ICACHE_TLB1_UPDT_SEL:
    14081411    {
    14091412        if ( ireq.valid ) m_cost_ins_tlb_miss_frz++;
     1413        m_cost_ins_tlb_update_acc_frz++;
    14101414
    14111415        // external cache invalidate request
     
    14261430        }
    14271431
    1428         // TLB update and invalidate different PTE
    1429         if ( !r_dcache_itlb_cleanup_req && !r_icache_inval_tlb_rsp ) 
    1430         {
    1431             paddr_t victim_index = 0;
    1432             r_dcache_itlb_cleanup_req = icache_tlb.update(r_icache_pte_update,r_icache_vaddr_req.read(),(r_icache_paddr_save.read() >> (uint32_log2(m_dcache_words)+2)),&victim_index);
    1433             r_dcache_itlb_cleanup_line = victim_index;
    1434             m_cpt_cc_cleanup_ins++;
    1435             r_icache_fsm = ICACHE_IDLE;
    1436         }
    1437 
    14381432        // TLB update and invalidate same PTE
    14391433        if ( r_icache_inval_tlb_rsp )                                 
     
    14411435            r_icache_inval_tlb_rsp = false;
    14421436            r_icache_fsm = ICACHE_IDLE;
    1443         }
     1437            break;
     1438        }
     1439
     1440        if ( r_dcache_itlb_cleanup_req ) break;
     1441
     1442        size_t way = 0;
     1443        size_t set = 0;
     1444        paddr_t victim_index = 0;
     1445
     1446        bool cleanup = icache_tlb.select((r_icache_vaddr_req.read()>> PAGE_M_NBITS),&victim_index,&way,&set);
     1447        r_icache_way = way;
     1448        r_icache_set = set;
     1449        if (cleanup)
     1450        {
     1451            r_dcache_itlb_cleanup_req = true;
     1452            r_dcache_itlb_cleanup_line = victim_index;
     1453            m_cpt_cc_cleanup_ins++;
     1454        }
     1455        r_icache_fsm = ICACHE_TLB1_UPDT;
     1456        break;
     1457    }
     1458    /////////////////////
     1459    case ICACHE_TLB1_UPDT:
     1460    {
     1461        if ( ireq.valid ) m_cost_ins_tlb_miss_frz++;
     1462        m_cost_ins_tlb_update_acc_frz++;
     1463
     1464        icache_tlb.update(r_icache_pte_update,r_icache_vaddr_req.read(),r_icache_way.read(),r_icache_set.read(),(r_icache_paddr_save.read() >> (uint32_log2(m_dcache_words)+2)));
     1465        r_icache_fsm = ICACHE_IDLE;
    14441466        break;
    14451467    }
     
    14941516                            if ( (r_dcache_rsp_itlb_miss & PTE_L_MASK ) >> PTE_L_SHIFT ) // L bit is set
    14951517                            {
    1496                                 r_icache_fsm        = ICACHE_TLB2_UPDT;
     1518                                r_icache_fsm        = ICACHE_TLB2_UPDT_SEL;
    14971519                                r_icache_pte_update = r_dcache_rsp_itlb_miss;
    14981520                            }
     
    15101532                            if ( (r_dcache_rsp_itlb_miss & PTE_R_MASK ) >> PTE_R_SHIFT ) // R bit is set
    15111533                            {
    1512                                 r_icache_fsm        = ICACHE_TLB2_UPDT;
     1534                                r_icache_fsm        = ICACHE_TLB2_UPDT_SEL;
    15131535                                r_icache_pte_update = r_dcache_rsp_itlb_miss;
    15141536                            }
     
    15881610                else 
    15891611                {
    1590                     r_icache_fsm = ICACHE_TLB2_UPDT
     1612                    r_icache_fsm = ICACHE_TLB2_UPDT_SEL
    15911613                }
    15921614            }
     
    16151637        break;
    16161638    }
    1617     /////////////////////
    1618     case ICACHE_TLB2_UPDT:
     1639    //////////////////////////
     1640    case ICACHE_TLB2_UPDT_SEL:
    16191641    {
    16201642        if ( ireq.valid ) m_cost_ins_tlb_miss_frz++;
     1643        m_cost_ins_tlb_update_acc_frz++;
    16211644
    16221645        // external cache invalidate request
     
    16371660        }
    16381661
    1639         // TLB update and invalidate different PTE
    1640         if ( !r_dcache_itlb_cleanup_req && !r_icache_inval_tlb_rsp )
    1641         {
    1642             paddr_t victim_index = 0;
    1643             r_dcache_itlb_cleanup_req = icache_tlb.update(r_icache_pte_update,r_dcache_rsp_itlb_ppn,r_icache_vaddr_req.read(),(r_icache_paddr_save.read() >> (uint32_log2(m_dcache_words)+2)),&victim_index);
    1644             r_dcache_itlb_cleanup_line = victim_index;
    1645             m_cpt_cc_cleanup_ins++;
    1646             r_icache_fsm = ICACHE_IDLE;
    1647         }
    16481662        // TLB update and invalidate same PTE
    16491663        if ( r_icache_inval_tlb_rsp )                           
     
    16511665            r_icache_inval_tlb_rsp = false;
    16521666            r_icache_fsm = ICACHE_IDLE;
    1653         }
    1654         break;
     1667            break;
     1668        }
     1669
     1670        if ( r_dcache_itlb_cleanup_req ) break;
     1671
     1672        size_t way = 0;
     1673        size_t set = 0;
     1674        paddr_t victim_index = 0;
     1675
     1676        bool cleanup = icache_tlb.select((r_icache_vaddr_req.read()>> PAGE_K_NBITS),&victim_index,&way,&set);
     1677        r_icache_way = way;
     1678        r_icache_set = set;
     1679        if (cleanup)
     1680        {
     1681            r_dcache_itlb_cleanup_req = true;
     1682            r_dcache_itlb_cleanup_line = victim_index;
     1683            m_cpt_cc_cleanup_ins++;
     1684        }
     1685        r_icache_fsm = ICACHE_TLB2_UPDT;
     1686        break;
     1687    }
     1688    /////////////////////
     1689    case ICACHE_TLB2_UPDT:
     1690    {
     1691        if ( ireq.valid ) m_cost_ins_tlb_miss_frz++;
     1692        m_cost_ins_tlb_update_acc_frz++;
     1693
     1694        icache_tlb.update(r_icache_pte_update,r_dcache_rsp_itlb_ppn,r_icache_vaddr_req.read(),r_icache_way.read(),r_icache_set.read(),(r_icache_paddr_save.read() >> (uint32_log2(m_dcache_words)+2)));
     1695        r_icache_fsm = ICACHE_IDLE;
     1696        break;
    16551697    }
    16561698    /////////////////////////////
     
    19882030
    19892031                r_icache_cleanup_req = r_icache.update(r_icache_paddr_save.read(), buf, &victim_index);
    1990                 r_icache_cleanup_line = victim_index;                        m_cpt_cc_cleanup_ins++;
     2032                r_icache_cleanup_line = victim_index;                       
     2033                m_cpt_cc_cleanup_ins++;
    19912034                r_icache_fsm = ICACHE_IDLE;
    19922035            }
     
    20142057            m_cost_ins_miss_frz++;
    20152058        }
    2016         if( (( r_icache_fsm_save == ICACHE_TLB1_READ )   || ( r_icache_fsm_save == ICACHE_TLB2_READ )    ||
    2017              ( r_icache_fsm_save == ICACHE_TLB1_WRITE )  || ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
    2018              ( r_icache_fsm_save == ICACHE_TLB1_UPDT )   || ( r_icache_fsm_save == ICACHE_TLB2_UPDT ))  && (ireq.valid) )
     2059        if( (( r_icache_fsm_save == ICACHE_TLB1_READ )     || ( r_icache_fsm_save == ICACHE_TLB2_READ )      ||
     2060             ( r_icache_fsm_save == ICACHE_TLB1_WRITE )    || ( r_icache_fsm_save == ICACHE_TLB2_WRITE )    ||
     2061             ( r_icache_fsm_save == ICACHE_TLB1_UPDT_SEL ) || ( r_icache_fsm_save == ICACHE_TLB2_UPDT_SEL )) && (ireq.valid) )
    20192062        {
    20202063            m_cost_ins_tlb_miss_frz++;
     
    20452088            m_cost_ins_miss_frz++;
    20462089        }
    2047         if( (( r_icache_fsm_save == ICACHE_TLB1_READ )   || ( r_icache_fsm_save == ICACHE_TLB2_READ )  ||
    2048              ( r_icache_fsm_save == ICACHE_TLB1_WRITE )  || ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
    2049              ( r_icache_fsm_save == ICACHE_TLB1_UPDT )   || ( r_icache_fsm_save == ICACHE_TLB2_UPDT ))  && (ireq.valid) )
     2090        if( (( r_icache_fsm_save == ICACHE_TLB1_READ )     || ( r_icache_fsm_save == ICACHE_TLB2_READ )      ||
     2091             ( r_icache_fsm_save == ICACHE_TLB1_WRITE )    || ( r_icache_fsm_save == ICACHE_TLB2_WRITE )    ||
     2092             ( r_icache_fsm_save == ICACHE_TLB1_UPDT_SEL ) || ( r_icache_fsm_save == ICACHE_TLB2_UPDT_SEL )) && (ireq.valid) )
    20502093        {
    20512094            m_cost_ins_tlb_miss_frz++;
     
    20542097        if ( r_itlb_inval_req ) break;
    20552098        // invalidate cache
    2056         if( (( r_icache_fsm_save == ICACHE_TLB1_READ ) || ( r_icache_fsm_save == ICACHE_TLB2_READ )  ||
    2057              ( r_icache_fsm_save == ICACHE_TLB1_WRITE )|| ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
    2058              ( r_icache_fsm_save == ICACHE_TLB1_UPDT ) || ( r_icache_fsm_save == ICACHE_TLB2_UPDT )) &&
     2099        if( (( r_icache_fsm_save == ICACHE_TLB1_READ )     || ( r_icache_fsm_save == ICACHE_TLB2_READ )  ||
     2100             ( r_icache_fsm_save == ICACHE_TLB1_WRITE )    || ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
     2101             ( r_icache_fsm_save == ICACHE_TLB1_UPDT_SEL ) || ( r_icache_fsm_save == ICACHE_TLB2_UPDT_SEL )) &&
    20592102            (((r_icache_paddr_save.read() & ~((m_icache_words<<2)-1)) >> (uint32_log2(m_icache_words) + 2) ) == r_dcache_itlb_inval_line.read()) )
    20602103        {
     
    20742117    }
    20752118    } // end switch r_icache_fsm
    2076 
    20772119#ifdef SOCLIB_MODULE_DEBUG
    20782120    std::cout << name() << " Instruction Response: " << irsp << std::endl;
     
    22932335        else if ( r_itlb_acc_dcache_req ) // ins tlb write access bit
    22942336        {
     2337            if ( dreq.valid ) m_cost_ins_tlb_occup_cache_frz++;
     2338
    22952339            data_t rsp_itlb_miss;
    22962340            bool itlb_hit_dcache = r_dcache.read(r_icache_paddr_save, &rsp_itlb_miss);
     
    27652809                        }
    27662810                        break;
    2767 /*
    2768                     case iss_t::DATA_READ:
    2769                         m_cpt_read++;
    2770                         if ( dcache_hit_c )
    2771                         {
    2772                             r_dcache_buf_unc_valid = false;
    2773                             r_dcache_fsm = DCACHE_IDLE;
    2774                             drsp.valid = true;
    2775                             drsp.rdata = dcache_rdata;
    2776                         }
    2777                         else
    2778                         {
    2779                             if ( dcache_cached )
    2780                             {
    2781                                 r_dcache_miss_req = true;
    2782                                 r_dcache_fsm = DCACHE_MISS_WAIT;
    2783                                 m_cpt_data_miss++;
    2784                                 m_cost_data_miss_frz++;
    2785                             }
    2786                             else
    2787                             {
    2788                                 r_dcache_unc_req = true;
    2789                                 r_dcache_fsm = DCACHE_UNC_WAIT;
    2790                                 m_cpt_unc_read++;
    2791                                 m_cost_unc_read_frz++;
    2792                             }
    2793                         }
    2794                         break;
    2795                     case iss_t::DATA_LL:
    2796                         if (r_dcache_llsc_reserved && (r_dcache_llsc_addr_save == tlb_dpaddr) && r_dcache_buf_unc_valid)
    2797                         {
    2798                             r_dcache_buf_unc_valid = false;
    2799                             r_dcache_fsm = DCACHE_IDLE;
    2800                             drsp.valid = true;
    2801                             drsp.rdata = dcache_rdata;
    2802                         }
    2803                         else
    2804                         {
    2805                             r_dcache_llsc_reserved = true;
    2806                             r_dcache_llsc_addr_save = tlb_dpaddr;
    2807                             r_dcache_unc_req = true;
    2808                             r_dcache_fsm = DCACHE_UNC_WAIT;
    2809                         }
    2810                         break;
    2811                     case iss_t::DATA_SC:
    2812                         if (r_dcache_llsc_reserved && (r_dcache_llsc_addr_save == tlb_dpaddr))
    2813                         {
    2814                             r_dcache_llsc_reserved = false;
    2815                             r_dcache_unc_req = true;
    2816                             r_dcache_fsm = DCACHE_UNC_WAIT;
    2817                         }
    2818                         else
    2819                         {   
    2820                             if ( r_dcache_buf_unc_valid )
    2821                             {                         
    2822                                 r_dcache_llsc_reserved = false;
    2823                                 r_dcache_buf_unc_valid = false;
    2824                                 drsp.valid = true;
    2825                                 drsp.rdata = dcache_rdata;
    2826                             }
    2827                             r_dcache_fsm = DCACHE_IDLE;
    2828                         }                       
    2829                         break;
    2830 */
    28312811                    case iss_t::DATA_WRITE:
    28322812                        m_cpt_write++;
     
    29182898    case DCACHE_BIS:
    29192899    {
     2900        if ( dreq.valid ) m_cost_data_miss_frz++;
     2901
    29202902        // external cache invalidate request
    29212903        if ( r_tgt_dcache_req )   
     
    29232905            r_dcache_fsm = DCACHE_CC_CHECK;
    29242906            r_dcache_fsm_save = r_dcache_fsm;
    2925             if ( dreq.valid ) m_cost_data_miss_frz++;
    29262907            break;
    29272908        }
     
    29322913            r_dcache_inval_tlb_rsp = false;
    29332914            r_dcache_fsm = DCACHE_IDLE;
    2934             if ( dreq.valid ) m_cost_data_miss_frz++;
    29352915            break;
    29362916        }
     
    32283208                        r_dcache_tlb_ll_dirty_req = true;
    32293209                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3230                         //m_cpt_dcache_data_write++;
    32313210                        m_cpt_data_tlb_update_dirty++;
    32323211                        m_cost_data_tlb_update_dirty_frz++;
     
    32513230                    {
    32523231                        r_dcache_pte_update = tlb_data;
    3253                         r_dcache_fsm = DCACHE_TLB1_UPDT;
     3232                        r_dcache_fsm = DCACHE_TLB1_UPDT_SEL;
    32543233                    }
    32553234                    else
     
    32673246                    {
    32683247                        r_dcache_pte_update = tlb_data;
    3269                         r_dcache_fsm = DCACHE_TLB1_UPDT;
     3248                        r_dcache_fsm = DCACHE_TLB1_UPDT_SEL;
    32703249                    }
    32713250                    else
     
    32923271    {
    32933272        if ( dreq.valid ) m_cost_data_tlb_miss_frz++;
    3294         m_cost_data_tlb_update_acc_frz++;           
     3273        m_cost_data_tlb_update_acc_frz++;
     3274           
    32953275        // external cache invalidate request
    32963276        if ( r_tgt_dcache_req )   
     
    34143394                    bool write_hit = r_dcache.write(r_dcache_tlb_paddr,r_dcache_pte_update); 
    34153395                    assert(write_hit && "Write on miss ignores data for data MMU update data access bit");
    3416                     r_dcache_fsm = DCACHE_TLB1_UPDT;
     3396                    r_dcache_fsm = DCACHE_TLB1_UPDT_SEL;
    34173397                    m_cpt_dcache_data_write++;
    34183398                }
     
    35793559                        r_dcache_tlb_ll_dirty_req = true;
    35803560                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3581                         //m_cpt_dcache_data_write++;
    35823561                        m_cpt_data_tlb_update_dirty++;
    35833562                        m_cost_data_tlb_update_dirty_frz++;
     
    36013580                    {
    36023581                        r_dcache_pte_update = rsp_dtlb_miss;
    3603                         r_dcache_fsm        = DCACHE_TLB1_UPDT;
     3582                        r_dcache_fsm        = DCACHE_TLB1_UPDT_SEL;
    36043583                    }
    36053584                    else
     
    36173596                    {
    36183597                        r_dcache_pte_update = rsp_dtlb_miss;
    3619                         r_dcache_fsm        = DCACHE_TLB1_UPDT;
     3598                        r_dcache_fsm        = DCACHE_TLB1_UPDT_SEL;
    36203599                    }
    36213600                    else
     
    36323611        break;
    36333612    }
    3634     //////////////////////
    3635     case DCACHE_TLB1_UPDT:
     3613    /////////////////////////
     3614    case DCACHE_TLB1_UPDT_SEL:
    36363615    {
    36373616        m_cost_data_tlb_miss_frz++;
    3638 
     3617        m_cost_data_tlb_update_acc_frz++;
     3618       
    36393619        // external cache invalidate request
    36403620        if ( r_tgt_dcache_req )   
     
    36473627        if ( !r_dcache_inval_tlb_rsp && !r_dcache_inval_rsp )
    36483628        {
     3629            size_t way = 0;
     3630            size_t set = 0;
    36493631            paddr_t victim_index = 0;
    3650             if (dcache_tlb.update(r_dcache_pte_update,dreq.addr,(r_dcache_tlb_paddr.read() >> (uint32_log2(m_dcache_words)+2)),&victim_index))
    3651             {
    3652                 r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
    3653             }
    3654             bool set_hit = r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
    3655             assert(set_hit && "TLB1_UPDT set hit error"); 
    3656             r_dcache_fsm = DCACHE_IDLE;
     3632            bool cleanup = dcache_tlb.select((dreq.addr >> PAGE_M_NBITS),&victim_index,&way,&set);
     3633            if (cleanup)
     3634            {
     3635                r_dcache_dtlb_cleanup_req = true;
     3636                r_dcache_dtlb_cleanup_line = victim_index;
     3637                m_cpt_cc_cleanup_data++;
     3638            }
     3639            r_dcache_way = way;
     3640            r_dcache_set = set;
     3641            r_dcache_fsm = DCACHE_TLB1_UPDT;
    36573642        }
    36583643        else 
     
    36633648        }
    36643649        break;
     3650    }
     3651    //////////////////////
     3652    case DCACHE_TLB1_UPDT:
     3653    {
     3654        m_cost_data_tlb_miss_frz++;
     3655        m_cost_data_tlb_update_acc_frz++;
     3656
     3657        if (r_dcache_dtlb_cleanup_req) r_dcache.setinbit(r_dcache_dtlb_cleanup_line.read() << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
     3658        bool set_hit = r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     3659        assert(set_hit && "TLB1_UPDT set hit error"); 
     3660        dcache_tlb.update(r_dcache_pte_update,dreq.addr,r_dcache_way.read(),r_dcache_set.read(),(r_dcache_tlb_paddr.read() >> (uint32_log2(m_dcache_words)+2)));
     3661        r_dcache_fsm = DCACHE_IDLE;
     3662        break;
    36653663    }
    36663664    /////////////////////////////
     
    37153713                r_dcache_pte_update = tlb_data;
    37163714                r_dcache_ppn_update = tlb_data_ppn;
    3717                 r_dcache_fsm = DCACHE_TLB2_UPDT;
     3715                r_dcache_fsm = DCACHE_TLB2_UPDT_SEL;
    37183716            }
    37193717            else
     
    37263724                        r_dcache_pte_update = tlb_data;
    37273725                        r_dcache_ppn_update = tlb_data_ppn;
    3728                         r_dcache_fsm        = DCACHE_TLB2_UPDT;
     3726                        r_dcache_fsm        = DCACHE_TLB2_UPDT_SEL;
    37293727                    }
    37303728                    else
     
    37443742                        r_dcache_pte_update = tlb_data;
    37453743                        r_dcache_ppn_update = tlb_data_ppn;
    3746                         r_dcache_fsm        = DCACHE_TLB2_UPDT;
     3744                        r_dcache_fsm        = DCACHE_TLB2_UPDT_SEL;
    37473745                    }
    37483746                    else
     
    38933891                    bool write_hit = r_dcache.write(r_dcache_tlb_paddr,r_dcache_pte_update); 
    38943892                    assert(write_hit && "Write on miss ignores data for data MMU update data access bit");
    3895                     r_dcache_fsm = DCACHE_TLB2_UPDT;
     3893                    r_dcache_fsm = DCACHE_TLB2_UPDT_SEL;
    38963894                    m_cpt_dcache_data_write++;
    38973895                }
     
    40444042                r_dcache_pte_update = rsp_dtlb_miss;
    40454043                r_dcache_ppn_update = tlb_data_ppn;
    4046                 r_dcache_fsm = DCACHE_TLB2_UPDT;
     4044                r_dcache_fsm = DCACHE_TLB2_UPDT_SEL;
    40474045            }
    40484046            else
     
    40544052                        r_dcache_pte_update = rsp_dtlb_miss;
    40554053                        r_dcache_ppn_update = tlb_data_ppn;
    4056                         r_dcache_fsm        = DCACHE_TLB2_UPDT;
     4054                        r_dcache_fsm        = DCACHE_TLB2_UPDT_SEL;
    40574055                    }
    40584056                    else
     
    40724070                        r_dcache_pte_update = rsp_dtlb_miss;
    40734071                        r_dcache_ppn_update = tlb_data_ppn;
    4074                         r_dcache_fsm        = DCACHE_TLB2_UPDT;
     4072                        r_dcache_fsm        = DCACHE_TLB2_UPDT_SEL;
    40754073                    }
    40764074                    else
     
    40884086        break;
    40894087    }
    4090     //////////////////////
    4091     case DCACHE_TLB2_UPDT
     4088    //////////////////////////
     4089    case DCACHE_TLB2_UPDT_SEL
    40924090    {
    40934091        m_cost_data_tlb_miss_frz++;
     4092        m_cost_data_tlb_update_acc_frz++;
    40944093
    40954094        // external cache invalidate request
     
    41034102        if ( !r_dcache_inval_tlb_rsp && !r_dcache_inval_rsp )
    41044103        {
     4104            size_t way = 0;
     4105            size_t set = 0;
    41054106            paddr_t victim_index = 0;
    4106             if (dcache_tlb.update(r_dcache_pte_update,r_dcache_ppn_update,dreq.addr,(r_dcache_tlb_paddr.read() >> (uint32_log2(m_dcache_words)+2)),&victim_index))
    4107             {
    4108                 r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
    4109             }
    4110             bool set_hit = r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
    4111             assert(set_hit && "TLB2_UPDT set hit error"); 
    4112             r_dcache_fsm = DCACHE_IDLE;
     4107            bool cleanup = dcache_tlb.select((dreq.addr >> PAGE_K_NBITS),&victim_index,&way,&set);
     4108            if (cleanup)
     4109            {
     4110                r_dcache_dtlb_cleanup_req = true;
     4111                r_dcache_dtlb_cleanup_line = victim_index;
     4112                m_cpt_cc_cleanup_data++;
     4113            }
     4114            r_dcache_way = way;
     4115            r_dcache_set = set;
     4116            r_dcache_fsm = DCACHE_TLB2_UPDT;
    41134117        }
    41144118        else 
     
    41194123        }
    41204124        break;
     4125    }
     4126    //////////////////////
     4127    case DCACHE_TLB2_UPDT: 
     4128    {
     4129        m_cost_data_tlb_miss_frz++;
     4130        m_cost_data_tlb_update_acc_frz++;
     4131
     4132        if (r_dcache_dtlb_cleanup_req) r_dcache.setinbit(r_dcache_dtlb_cleanup_line.read() << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
     4133        bool set_hit = r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     4134        assert(set_hit && "TLB2_UPDT set hit error"); 
     4135        dcache_tlb.update(r_dcache_pte_update,r_dcache_ppn_update,dreq.addr,r_dcache_way.read(),r_dcache_set.read(),(r_dcache_tlb_paddr.read() >> (uint32_log2(m_dcache_words)+2)));
     4136        r_dcache_fsm = DCACHE_IDLE;
     4137        break;
    41214138    }
    41224139    ///////////////////////
     
    48894906             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )     ||
    48904907             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT )   || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT )   ||
    4891              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )) && (dreq.valid) )
     4908             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL )    || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL )) && (dreq.valid) )
    48924909        {
    48934910            m_cost_data_tlb_miss_frz++;
     
    49334950            if ( dcache_hit )
    49344951            {
    4935                 if (((( r_dcache_fsm_save == DCACHE_TLB1_UPDT )     || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )    ||
     4952                if (((( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL ) || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL ) ||
    49364953                      ( r_dcache_fsm_save == DCACHE_TLB1_LL_WAIT )  || ( r_dcache_fsm_save == DCACHE_TLB2_LL_WAIT )  ||
    49374954                      ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )  || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )  ||
     
    49925009             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )     ||
    49935010             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT )   || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT )   ||
    4994              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )) && (dreq.valid) )
     5011             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL )    || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL )) && (dreq.valid) )
    49955012        {
    49965013            m_cost_data_tlb_miss_frz++;
     
    50235040             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )     ||
    50245041             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT )   || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT )   ||
    5025              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )) && (dreq.valid) )
     5042             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL )    || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL )) && (dreq.valid) )
    50265043        {
    50275044            m_cost_data_tlb_miss_frz++;
     
    50465063             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )     ||
    50475064             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT )   || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT )   ||
    5048              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )) && (dreq.valid) )
     5065             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL )    || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL )) && (dreq.valid) )
    50495066        {
    50505067            m_cost_data_tlb_miss_frz++;
     
    50775094             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )     ||
    50785095             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT )   || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT )   ||
    5079              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )) && (dreq.valid) )
     5096             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL )    || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL )) && (dreq.valid) )
    50805097        {
    50815098            m_cost_data_tlb_miss_frz++;
     
    50885105             ( r_dcache_fsm_save == DCACHE_TLB1_LL_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_LL_WAIT )     ||
    50895106             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )     || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )     ||
    5090              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )        ||
     5107             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT_SEL )    || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT_SEL )    ||
    50915108             ( r_dcache_fsm_save == DCACHE_DTLB1_READ_CACHE ) || ( r_dcache_fsm_save == DCACHE_DTLB2_READ_CACHE ) ||
    50925109             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )    ||
     
    60456062
    60466063    } // end switch TGT_FSM
     6064
    60476065#ifdef SOCLIB_MODULE_DEBUG
    60486066   std::cout << name()
Note: See TracChangeset for help on using the changeset viewer.