Ignore:
Timestamp:
Aug 27, 2010, 10:47:54 PM (14 years ago)
Author:
gao
Message:

Correction of dirty bit and access bit in data cache

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

    r68 r79  
    114114        DCACHE_SC_DIRTY_WAIT,       // 19
    115115        DCACHE_WRITE_UPDT,          // 1a
    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
     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
    131132    };
    132133
     
    309310    sc_signal<bool>         r_dcache_tlb_ll_dirty_req;  // used for tlb dirty bit update
    310311    sc_signal<bool>         r_dcache_tlb_sc_dirty_req;  // used for tlb dirty bit update
     312    sc_signal<bool>         r_dcache_sc_updt_dirty;     // used for tlb dirty bit update
    311313    sc_signal<bool>         r_dcache_tlb_ptba_read;     // used for tlb ptba read when write dirty bit
    312314    sc_signal<bool>         r_dcache_xtn_req;           // used for xtn write for ICACHE
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r73 r79  
    8585        "DCACHE_SC_DIRTY_WAIT",
    8686        "DCACHE_WRITE_UPDT",
     87        "DCACHE_WRITE_DIRTY",
    8788        "DCACHE_WRITE_REQ", 
    8889        "DCACHE_MISS_WAIT", 
     
    459460        r_dcache_tlb_sc_acc_req   = false;   
    460461        r_dcache_tlb_ll_dirty_req = false;   
    461         r_dcache_tlb_sc_dirty_req = false;   
     462        r_dcache_tlb_sc_dirty_req = false;
     463        r_dcache_sc_updt_dirty    = false;     
    462464        r_dcache_itlb_ll_acc_req  = false;   
    463465        r_dcache_itlb_sc_acc_req  = false;   
     
    10071009        else                                                                // MMU activated
    10081010        {
    1009             size_t c_way, c_set;
    10101011            m_cpt_ins_tlb_read++;
    10111012            icache_hit_t  = icache_tlb.cctranslate(ireq.addr, &tlb_ipaddr, &icache_pte_info,
     
    10151016            spc_ipaddr    = ((paddr_t)r_icache_ppn_save << PAGE_K_NBITS) | (paddr_t)(ireq.addr & PAGE_K_MASK);
    10161017            icache_cached = icache_pte_info.c;
    1017             if (icache_hit_t) {
    1018                if (!r_dcache.read(icache_tlb_nline << (uint32_log2(m_dcache_words) + 2), &icache_ins, &c_way, &c_set)) {
    1019                 std::cout << "itlb PTE " << std::hex << icache_tlb_nline << " " << (icache_tlb_nline << (uint32_log2(m_dcache_words) + 2)) << " not in cache" << std::endl;
    1020                 abort();
    1021               }
    1022               if (!r_dcache_in_itlb[m_dcache_sets*c_way+c_set]) {
    1023                 std::cout << "itlb PTE " << std::hex << icache_tlb_nline << " "
    1024                     << (icache_tlb_nline << (uint32_log2(m_dcache_words) + 2)) <<
    1025                     " " << c_way << "," << c_set << " @" << &r_dcache_in_itlb[m_dcache_sets*c_way+c_set] << " not in_itlb" << std::endl;
    1026                 abort();
    1027               }
    1028            }
    10291018        }
    10301019
     
    13291318                }
    13301319            }
    1331 
    1332             if ( r_icache_inval_tlb_rsp ) // TLB miss read response and invalidation
     1320            else  // TLB miss read response and invalidation
    13331321            {
    13341322                if ( r_dcache_rsp_itlb_error )
     
    13851373                }
    13861374            }
    1387 
    1388             if ( r_icache_inval_tlb_rsp) // TLB ET write response and invalidation     
     1375            else   // TLB ET write response and invalidation     
    13891376            {   
    13901377                if ( r_dcache_rsp_itlb_error )
     
    15311518                }
    15321519            }
    1533            
    1534             if ( r_icache_inval_tlb_rsp ) // TLB miss read response and invalidation
     1520            else  // TLB miss read response and invalidation
    15351521            {
    15361522                if ( r_dcache_rsp_itlb_error )
     
    15871573                }
    15881574            }
    1589  
    1590             if ( r_icache_inval_tlb_rsp ) // TLB ET write response and invalidation     
     1575            else // TLB ET write response and invalidation     
    15911576            {   
    15921577                if ( r_dcache_rsp_itlb_error )
     
    20342019            m_cost_ins_miss_frz++;
    20352020        }
    2036         if( (( r_icache_fsm_save == ICACHE_TLB1_READ )   || ( r_icache_fsm_save == ICACHE_TLB2_READ )    ||
     2021        if( (( r_icache_fsm_save == ICACHE_TLB1_READ )   || ( r_icache_fsm_save == ICACHE_TLB2_READ )  ||
    20372022             ( r_icache_fsm_save == ICACHE_TLB1_WRITE )  || ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
    20382023             ( r_icache_fsm_save == ICACHE_TLB1_UPDT )   || ( r_icache_fsm_save == ICACHE_TLB2_UPDT ))   && (ireq.valid) )
     
    20442029        // invalidate cache
    20452030        if( (( r_icache_fsm_save == ICACHE_TLB1_READ ) || ( r_icache_fsm_save == ICACHE_TLB2_READ )  ||
    2046           ( r_icache_fsm_save == ICACHE_TLB1_WRITE )|| ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
     2031             ( r_icache_fsm_save == ICACHE_TLB1_WRITE )|| ( r_icache_fsm_save == ICACHE_TLB2_WRITE ) ||
    20472032             ( r_icache_fsm_save == ICACHE_TLB1_UPDT ) || ( r_icache_fsm_save == ICACHE_TLB2_UPDT )) &&
    20482033            (((r_icache_paddr_save.read() & ~((m_icache_words<<2)-1)) >> (uint32_log2(m_icache_words) + 2) ) == r_dcache_itlb_inval_line.read()) )
     
    25692554            else                                                            // MMU activated
    25702555            {
    2571                 size_t c_way, c_set;
    25722556                m_cpt_data_tlb_read++;
    25732557                dcache_hit_t  = dcache_tlb.cctranslate(dreq.addr, &tlb_dpaddr, &dcache_pte_info,
     
    25792563                                ((dreq.type != iss_t::DATA_LL)  && (dreq.type != iss_t::DATA_SC) &&
    25802564                                 (dreq.type != iss_t::XTN_READ) && (dreq.type != iss_t::XTN_WRITE));   
    2581                if (dcache_hit_t) {
    2582                    if (!r_dcache.read(dcache_tlb_nline << (uint32_log2(m_dcache_words) + 2), &dcache_rdata, &c_way, &c_set)) {
    2583                     std::cout << "dtlb PTE " << std::hex << dcache_tlb_nline << " " << (dcache_tlb_nline << (uint32_log2(m_dcache_words) + 2)) << " not in cache" << std::endl;
    2584                     abort();
    2585                   }
    2586                   if (!r_dcache_in_dtlb[m_dcache_sets*c_way+c_set]) {
    2587                     std::cout << "dtlb PTE " << std::hex << dcache_tlb_nline <<
    2588                         " " << c_way << "," << c_set << " not in_dtlb" <<
    2589                         std::endl;
    2590                     abort();
    2591                   }
    2592               }
    25932565            }
    25942566
     
    27042676                            else
    27052677                            {
    2706                                 if (dreq.type == iss_t::DATA_SC &&
    2707                                     (r_mmu_mode.read() & DATA_TLB_MASK) &&
    2708                                     !dcache_pte_info.d)
     2678                                if ((dreq.type == iss_t::DATA_SC) && !dcache_pte_info.d && (r_mmu_mode.read() & DATA_TLB_MASK))
    27092679                                {
    2710                                     /* dirty bit update */
    2711                                     m_cpt_data_tlb_update_dirty++;
    2712                                     m_cost_data_tlb_update_dirty_frz++;
    2713                                     if ( dcache_tlb.getpagesize(dcache_tlb_way, dcache_tlb_set) )       // 2M page size, one level page table
    2714                                     {
    2715                                         r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
    2716                                         r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
    2717                                         r_dcache_tlb_ll_dirty_req = true;
    2718                                         r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    2719                                     }
    2720                                     else        // 4k page size, two levels page table
    2721                                     {   
    2722                                         if (dcache_hit_p)
    2723                                         {
    2724                                             r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
    2725                                             r_dcache_tlb_paddr = (paddr_t)r_dcache_ptba_save | (paddr_t)(((dreq.addr&PTD_ID2_MASK)>>PAGE_K_NBITS) << 3);
    2726                                             r_dcache_tlb_ll_dirty_req = true;
    2727                                             r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    2728                                         }
    2729                                         else    // get PTBA to calculate the physical address of PTE
    2730                                         {
    2731                                             r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
    2732                                             r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
    2733                                             r_dcache_tlb_ptba_read = true;
    2734                                             r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
    2735                                         }
    2736                                     }
     2680                                    m_cpt_data_tlb_update_dirty++;
     2681                                    m_cost_data_tlb_update_dirty_frz++;
     2682                                    r_dcache_sc_updt_dirty = true;
     2683                                    if ( dcache_tlb.getpagesize(dcache_tlb_way, dcache_tlb_set) )       // 2M page size, one level page table
     2684                                    {
     2685                                        r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
     2686                                        r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
     2687                                        r_dcache_tlb_ll_dirty_req = true;
     2688                                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     2689                                    }
     2690                                    else        // 4k page size, two levels page table
     2691                                    {   
     2692                                        if (dcache_hit_p)
     2693                                        {
     2694                                            r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
     2695                                            r_dcache_tlb_paddr = (paddr_t)r_dcache_ptba_save | (paddr_t)(((dreq.addr&PTD_ID2_MASK)>>PAGE_K_NBITS) << 3);
     2696                                            r_dcache_tlb_ll_dirty_req = true;
     2697                                            r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     2698                                        }
     2699                                        else    // get PTBA to calculate the physical address of PTE
     2700                                        {
     2701                                            r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
     2702                                            r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
     2703                                            r_dcache_tlb_ptba_read = true;
     2704                                            r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     2705                                        }
     2706                                    }                           
    27372707                                }
    27382708                                else
    2739                                 {
     2709                                {       
    27402710                                    r_dcache_unc_req = true;
    27412711                                    r_dcache_fsm = DCACHE_UNC_WAIT;
    27422712                                    m_cpt_unc_read++;
    2743                                     m_cost_unc_read_frz++;
    27442713                                }
     2714                                m_cost_unc_read_frz++;
    27452715                            }
    27462716                        }
     
    30222992                if (r_dcache_inval_tlb_rsp) r_dcache_inval_tlb_rsp = false;
    30232993                if (r_dcache_inval_rsp) r_dcache_inval_rsp = false;
     2994                if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    30242995            }
    30252996            else
     
    30403011                    if (r_dcache_inval_tlb_rsp) r_dcache_inval_tlb_rsp = false;
    30413012                    if (r_dcache_inval_rsp) r_dcache_inval_rsp = false;
     3013                    if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    30423014                }
    30433015                else if ( r_dcache_inval_tlb_rsp )
     
    30453017                    r_dcache_inval_tlb_rsp = false;
    30463018                    r_dcache_fsm = DCACHE_IDLE;
     3019                    if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    30473020                }
    30483021                else if ( r_dcache_inval_rsp )
     
    30503023                    r_dcache_inval_rsp = false;
    30513024                    r_dcache_fsm = DCACHE_IDLE;
     3025                    if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    30523026                }
    30533027                else
     
    30903064                if (r_dcache_inval_tlb_rsp) r_dcache_inval_tlb_rsp = false;
    30913065                if (r_dcache_inval_rsp) r_dcache_inval_rsp = false;                         
     3066                if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    30923067            }
    30933068            else
     
    30993074                    r_dcache_fsm = DCACHE_IDLE;
    31003075                    if (r_dcache_tlb_sc_fail) r_dcache_tlb_sc_fail = false;
     3076                    if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    31013077                }
    31023078                else if ( r_dcache_inval_rsp )
    31033079                {
    31043080                    r_dcache_inval_rsp = false;
     3081                    r_dcache_fsm = DCACHE_IDLE;
    31053082                    if (r_dcache_tlb_sc_fail) r_dcache_tlb_sc_fail = false;
    3106                     r_dcache_fsm = DCACHE_IDLE;
     3083                    if (r_dcache_sc_updt_dirty) r_dcache_sc_updt_dirty = false;
    31073084                }
    31083085                else if ( r_dcache_tlb_sc_fail )
     
    31153092                else
    31163093                {
    3117                     /*
    3118                      * SC succeeded, but has updated the cache and
    3119                      * invalidated the TLB entry. Redo the translation
    3120                      */
    3121                     r_dcache_fsm = DCACHE_IDLE;
     3094                    bool write_hit = r_dcache.write(r_dcache_tlb_paddr, r_dcache_pte_update);
     3095                    assert(write_hit && "Write on miss ignores data for data MMU update dirty bit");
     3096                    r_dcache_fsm = DCACHE_WRITE_DIRTY;
     3097                    m_cpt_dcache_data_write++;
    31223098                }
    31233099            }
     
    31473123
    31483124        data_t tlb_data = 0;
    3149         bool write_hit = false;
    31503125        bool tlb_hit_cache = r_dcache.read(r_dcache_tlb_paddr, &tlb_data);
    31513126
     
    31773152                {
    31783153                    r_dcache_tlb_ptba_read = false;
     3154                    //write_hit = r_dcache.write(((paddr_t)(tlb_data & ((1<<(m_paddr_nbits - PAGE_K_NBITS))-1)) << PAGE_K_NBITS | (paddr_t)(((dreq.addr & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3)), r_dcache_pte_update);
     3155                    //assert(write_hit && "Write on miss ignores data");
    31793156                    r_dcache_tlb_ll_dirty_req = true;
    31803157                    r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3181                     m_cpt_dcache_data_write++;
     3158                    //m_cpt_dcache_data_write++;
    31823159                    m_cost_data_tlb_update_dirty_frz++;
    31833160                }
     
    32023179                        r_dcache_pte_update = tlb_data | PTE_L_MASK;
    32033180                        r_dcache_tlb_ll_acc_req = true;
     3181                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_L_MASK)); 
     3182                        //assert(write_hit && "Write on miss ignores data"); 
    32043183                        r_dcache_fsm = DCACHE_TLB1_LL_WAIT;
    3205                         m_cpt_dcache_data_write++;
     3184                        //m_cpt_dcache_data_write++;
    32063185                        m_cpt_data_tlb_update_acc++;
    32073186                        m_cost_data_tlb_update_acc_frz++;
     
    32193198                        r_dcache_pte_update = tlb_data | PTE_R_MASK;
    32203199                        r_dcache_tlb_ll_acc_req = true;
     3200                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_R_MASK)); 
     3201                        //assert(write_hit && "Write on miss ignores data"); 
    32213202                        r_dcache_fsm = DCACHE_TLB1_LL_WAIT;
    3222                         m_cpt_dcache_data_write++;
     3203                        //m_cpt_dcache_data_write++;
    32233204                        m_cpt_data_tlb_update_acc++;
    32243205                        m_cost_data_tlb_update_acc_frz++;
     
    33593340                else
    33603341                {
     3342                    bool write_hit = r_dcache.write(r_dcache_tlb_paddr,r_dcache_pte_update); 
     3343                    assert(write_hit && "Write on miss ignores data for data MMU update data access bit");
    33613344                    r_dcache_fsm = DCACHE_TLB1_UPDT;
     3345                    m_cpt_dcache_data_write++;
    33623346                }
    33633347            }
     
    34473431            data_t   rsp_dtlb_miss = 0;
    34483432            paddr_t  victim_index = 0;
    3449             bool write_hit = false;
     3433            //bool write_hit = false;
    34503434            size_t way = 0;
    34513435            size_t set = 0;
     
    35123496                {
    35133497                    r_dcache_tlb_ptba_read = false;
     3498                    //write_hit = r_dcache.write(((paddr_t)(rsp_dtlb_miss & ((1<<(m_paddr_nbits - PAGE_K_NBITS))-1)) << PAGE_K_NBITS | (paddr_t)(((dreq.addr & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3)),r_dcache_pte_update);
     3499                    //assert(write_hit && "Write on miss ignores data");
    35143500                    r_dcache_tlb_ll_dirty_req = true;
    35153501                    r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3516                     m_cpt_dcache_data_write++;
     3502                    //m_cpt_dcache_data_write++;
    35173503                    m_cpt_data_tlb_update_dirty++;
    35183504                    m_cost_data_tlb_update_dirty_frz++;
     
    35373523                        r_dcache_pte_update = rsp_dtlb_miss | PTE_L_MASK;
    35383524                        r_dcache_tlb_ll_acc_req = true;
     3525                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_L_MASK)); 
     3526                        //assert(write_hit && "Write on miss ignores data"); 
    35393527                        r_dcache_fsm        = DCACHE_TLB1_LL_WAIT;
    3540                         m_cpt_dcache_data_write++;
     3528                        //m_cpt_dcache_data_write++;
    35413529                        m_cpt_data_tlb_update_acc++;
    35423530                        m_cost_data_tlb_update_acc_frz++;
     
    35543542                        r_dcache_pte_update = rsp_dtlb_miss | PTE_R_MASK;
    35553543                        r_dcache_tlb_ll_acc_req = true;
     3544                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_R_MASK)); 
     3545                        //assert(write_hit && "Write on miss ignores data"); 
    35563546                        r_dcache_fsm        = DCACHE_TLB1_LL_WAIT;
    3557                         m_cpt_dcache_data_write++;
     3547                        //m_cpt_dcache_data_write++;
    35583548                        m_cpt_data_tlb_update_acc++;
    35593549                        m_cost_data_tlb_update_acc_frz++;
     
    35823572            if (dcache_tlb.update(r_dcache_pte_update,dreq.addr,(r_dcache_tlb_paddr.read() >> (uint32_log2(m_dcache_words)+2)),&victim_index))
    35833573            {
    3584                 r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words) + 2), r_dcache_in_dtlb, false);
     3574                r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
    35853575            }
    35863576            r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     
    36183608        data_t tlb_data = 0;
    36193609        data_t tlb_data_ppn = 0;
    3620         bool write_hit = false;
     3610        //bool write_hit = false;
    36213611        bool tlb_hit_cache = r_dcache.read(r_dcache_tlb_paddr, &tlb_data);
    36223612
     
    36653655                        r_dcache_ppn_update = tlb_data_ppn;
    36663656                        r_dcache_tlb_ll_acc_req = true;
     3657                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_L_MASK)); 
     3658                        //assert(write_hit && "Write on miss ignores data"); 
    36673659                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    3668                         m_cpt_dcache_data_write++;
     3660                        //m_cpt_dcache_data_write++;
    36693661                        m_cpt_data_tlb_update_acc++;
    36703662                        m_cost_data_tlb_update_acc_frz++;
     
    36843676                        r_dcache_ppn_update = tlb_data_ppn;
    36853677                        r_dcache_tlb_ll_acc_req = true;
     3678                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_R_MASK)); 
     3679                        //assert(write_hit && "Write on miss ignores data"); 
    36863680                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    3687                         m_cpt_dcache_data_write++;
     3681                        //m_cpt_dcache_data_write++;
    36883682                        m_cpt_data_tlb_update_acc++;
    36893683                        m_cost_data_tlb_update_acc_frz++;
     
    38253819                else
    38263820                {
     3821                    bool write_hit = r_dcache.write(r_dcache_tlb_paddr,r_dcache_pte_update); 
     3822                    assert(write_hit && "Write on miss ignores data for data MMU update data access bit");
    38273823                    r_dcache_fsm = DCACHE_TLB2_UPDT;
     3824                    m_cpt_dcache_data_write++;
    38283825                }
    38293826            }
     
    39133910            data_t rsp_dtlb_miss;
    39143911            data_t tlb_data_ppn;
    3915             bool write_hit = false;
     3912            //bool write_hit = false;
    39163913            paddr_t  victim_index = 0;
    39173914            size_t way = 0;
     
    39923989                        r_dcache_ppn_update = tlb_data_ppn;
    39933990                        r_dcache_tlb_ll_acc_req = true;
     3991                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_L_MASK)); 
     3992                        //assert(write_hit && "Write on miss ignores data"); 
    39943993                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    3995                         m_cpt_dcache_data_write++;
     3994                        //m_cpt_dcache_data_write++;
    39963995                        m_cpt_data_tlb_update_acc++;
    39973996                        m_cost_data_tlb_update_acc_frz++;
     
    40114010                        r_dcache_ppn_update = tlb_data_ppn;
    40124011                        r_dcache_tlb_ll_acc_req = true;
     4012                        //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_R_MASK)); 
     4013                        //assert(write_hit && "Write on miss ignores data"); 
    40134014                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    4014                         m_cpt_dcache_data_write++;
     4015                        //m_cpt_dcache_data_write++;
    40154016                        m_cpt_data_tlb_update_acc++;
    40164017                        m_cost_data_tlb_update_acc_frz++;
     
    40394040            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))
    40404041            {
    4041                 r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words) + 2), r_dcache_in_dtlb, false);
     4042                r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
    40424043            }
    40434044            r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     
    40624063        if ( r_dcache_itlb_cleanup_req )
    40634064        {   
    4064             r_dcache.setinbit(((paddr_t)r_dcache_itlb_cleanup_line.read() << (uint32_log2(m_dcache_words) + 2)), r_dcache_in_itlb, false);
     4065            r_dcache.setinbit(((paddr_t)r_dcache_itlb_cleanup_line.read() << (uint32_log2(m_dcache_words)+2)), r_dcache_in_itlb, false);
    40654066            r_dcache_itlb_cleanup_req = false;
    40664067        }
     
    40724073                if(dcache_tlb.checkcleanup(way, set, &victim_index))
    40734074                {
    4074                     /*
    4075                      * this is correct because checkcleanup returns true only
    4076                      * if none of the PTE entries of the line is global.
    4077                      */
    4078                     r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words) + 2), r_dcache_in_dtlb, false);
     4075                    r_dcache.setinbit((paddr_t)(victim_index << (uint32_log2(m_dcache_words)+2)), r_dcache_in_dtlb, false);
    40794076                }
    40804077            }
     
    41734170        if ( dcache_tlb.inval(r_dcache_wdata_save, &victim_index) )
    41744171        { 
    4175             r_dcache.setinbit((paddr_t)(victim_index << (uint32_log2(m_dcache_words) + 2)), r_dcache_in_dtlb, false);
     4172            r_dcache.setinbit((paddr_t)(victim_index << (uint32_log2(m_dcache_words)+2)), r_dcache_in_dtlb, false);
    41764173        }
    41774174        r_dtlb_translation_valid = false;
     
    44094406                r_dcache_cleanup_line = victim_index;
    44104407                m_cpt_cc_cleanup_data++;
    4411                 r_dcache_fsm = DCACHE_TLB_CC_INVAL;
    4412                 r_dcache_fsm_save = r_dcache_fsm;
    4413                 break;
     4408                if ( r_dcache_in_itlb[m_dcache_sets*way+set] || r_dcache_in_dtlb[m_dcache_sets*way+set] )
     4409                {
     4410                    r_dcache_fsm = DCACHE_TLB_CC_INVAL;
     4411                    r_dcache_fsm_save = r_dcache_fsm;
     4412                    break;
     4413                }
    44144414            }
    44154415            m_cpt_dcache_dir_write++;
     
    45234523        break;
    45244524    }
     4525    ////////////////////////
     4526    case DCACHE_WRITE_DIRTY:
     4527    {
     4528        m_cost_data_tlb_update_dirty_frz++;
     4529
     4530        // external cache invalidate request
     4531        if ( r_tgt_dcache_req )
     4532        {
     4533            r_dcache_fsm = DCACHE_CC_CHECK;
     4534            r_dcache_fsm_save = r_dcache_fsm;
     4535            break;
     4536        }
     4537
     4538        if ( r_dcache_inval_tlb_rsp ) // Miss read response and tlb invalidation
     4539        {
     4540            r_dcache_fsm = DCACHE_IDLE;
     4541            if ( r_dcache_sc_updt_dirty ) r_dcache_sc_updt_dirty = false;
     4542            r_dcache_inval_tlb_rsp = false;
     4543            break;
     4544        }
     4545
     4546        if ( r_dcache_inval_rsp ) // TLB miss response and cache invalidation
     4547        {
     4548            r_dcache_fsm = DCACHE_IDLE;
     4549            if ( r_dcache_sc_updt_dirty ) r_dcache_sc_updt_dirty = false;
     4550            r_dcache_inval_rsp = false;
     4551            break;         
     4552        }
     4553
     4554        dcache_tlb.setdirty(r_dcache_tlb_way_save, r_dcache_tlb_set_save);
     4555        if (  r_dcache_sc_updt_dirty )
     4556        {
     4557            r_dcache_sc_updt_dirty = false;
     4558            r_dcache_unc_req = true;
     4559            r_dcache_fsm = DCACHE_UNC_WAIT;
     4560            m_cpt_unc_read++;
     4561        }
     4562        else
     4563        {
     4564            r_dcache_fsm = DCACHE_WRITE_REQ;
     4565            drsp.valid = true;
     4566            drsp.rdata = 0;     
     4567        }       
     4568        break;
     4569    }
    45254570    /////////////////
    45264571    case DCACHE_ERROR:
     
    46234668                r_dcache_cleanup_line = victim_index;
    46244669                m_cpt_cc_cleanup_data++;
    4625                 r_dcache_fsm = DCACHE_TLB_CC_INVAL;
    4626                 r_dcache_fsm_save = r_dcache_fsm;
    4627                 break;
     4670                if ( r_dcache_in_itlb[m_dcache_sets*way+set] || r_dcache_in_dtlb[m_dcache_sets*way+set] )
     4671                {
     4672                    r_dcache_fsm = DCACHE_TLB_CC_INVAL;
     4673                    r_dcache_fsm_save = r_dcache_fsm;
     4674                    break;
     4675                }
    46284676            }
    46294677
     
    47334781                else
    47344782                {
     4783                    bool write_hit = r_dcache.write(r_icache_paddr_save, r_icache_pte_update);
     4784                    assert(write_hit && "Write on miss ignores data for data MMU update ins access bit");
    47354785                    r_itlb_acc_dcache_req = false;
    47364786                    r_dcache_fsm = DCACHE_IDLE;
     
    47614811        }
    47624812
    4763         // DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
     4813        // DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_WRITE_DIRTY DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
    47644814        // DCACHE_TLB2_LL_WAIT  DCACHE_TLB2_SC_WAIT  DCACHE_SC_DIRTY_WAIT
    47654815        if((( /*( r_dcache_fsm_save == DCACHE_UNC_WAIT ) ||*/
     
    47674817           ( (r_dcache_paddr_save.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))))
    47684818        || (( ( r_dcache_fsm_save == DCACHE_TLB1_READ )      || ( r_dcache_fsm_save == DCACHE_TLB2_READ )      ||
    4769              ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT ) || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT) /* ||
     4819             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT ) || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT ) ||
     4820             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )      || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )         /* ||
    47704821             ( r_dcache_fsm_save == DCACHE_TLB1_LL_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_LL_WAIT )   ||
    47714822             ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )   ||
    4772              ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  */ ) &&
     4823             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  ||
     4824             ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )*/ ) &&
    47734825           ( (r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) )
    47744826        || (( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) || ( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) /*||
     
    47764828           ( (r_icache_paddr_save.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) ) )
    47774829        {
    4778             data_t dcache_rdata = 0;
    4779             size_t way = 0;
    4780             size_t set = 0;
    4781             bool dcache_hit = r_dcache.read(r_tgt_addr.read(), &dcache_rdata, &way, &set);
    4782             assert(!dcache_hit && "ignored update req should not be in dcache");
    4783 
    47844830            r_dcache_inval_rsp = true;
    47854831            r_tgt_dcache_req = false;
     
    48044850            if ( dcache_hit )
    48054851            {
    4806                 if (((r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) ==
    4807                      (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) &&
    4808                     (r_dcache_fsm_save == DCACHE_TLB1_UPDT ||
    4809                      r_dcache_fsm_save == DCACHE_TLB2_UPDT))
    4810                         r_dcache_inval_rsp = true;
    48114852                if ( r_dcache_in_dtlb[m_dcache_sets*way+set] || r_dcache_in_itlb[m_dcache_sets*way+set] )
    48124853                {
     
    49534994             ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )        || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )        ||
    49544995             ( r_dcache_fsm_save == DCACHE_DTLB1_READ_CACHE ) || ( r_dcache_fsm_save == DCACHE_DTLB2_READ_CACHE ) ||
    4955              ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT ) ) &&
     4996             ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )    || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )    ||
     4997             ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )) &&
    49564998            (((r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) >> (uint32_log2(m_dcache_words) + 2)) == r_dcache_dtlb_inval_line.read()) )
    49574999        {
     
    49845026        if ( dreq.valid ) m_cost_data_miss_frz++;
    49855027
    4986         r_dcache.setinbit((paddr_t)r_dcache_itlb_cleanup_line.read() << (uint32_log2(m_dcache_words) + 2), r_dcache_in_itlb, false);
     5028        r_dcache.setinbit(((paddr_t)r_dcache_itlb_cleanup_line.read()<<(uint32_log2(m_dcache_words)+2)), r_dcache_in_itlb, false);
    49875029        r_dcache_itlb_cleanup_req = false;
    49885030        r_dcache_fsm = DCACHE_IDLE;
Note: See TracChangeset for help on using the changeset viewer.