Changeset 88


Ignore:
Timestamp:
Sep 6, 2010, 1:57:15 PM (14 years ago)
Author:
gao
Message:

Correction of itlb access bit set and dtlb dirty bit set

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

    r79 r88  
    350350    sc_signal<bool>             r_itlb_k_read_dcache;       // used for instruction tlb miss, request in data cache
    351351    sc_signal<bool>             r_itlb_acc_dcache_req;      // used for itlb update access bit via dcache
     352    sc_signal<bool>             r_itlb_acc_redo_req;        // used for itlb update access bit via dcache
    352353    sc_signal<bool>             r_dcache_rsp_itlb_error;    // used for data cache rsp error when itlb miss
    353354    sc_signal<data_t>       r_dcache_rsp_itlb_miss;         // used for dcache rsp data when itlb miss
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r84 r88  
    447447        r_itlb_k_read_dcache      = false;     
    448448        r_itlb_acc_dcache_req     = false;   
     449        r_itlb_acc_redo_req       = false;
    449450        r_dcache_rsp_itlb_error   = false;
    450451 
     
    13681369                    r_icache_fsm = ICACHE_ERROR;
    13691370                }
     1371                else if ( r_itlb_acc_redo_req )
     1372                {
     1373                    r_itlb_acc_redo_req = false;
     1374                    r_icache_fsm = ICACHE_IDLE;   
     1375                }
    13701376                else 
    13711377                {
     
    13821388                    r_icache_fsm = ICACHE_ERROR;
    13831389                }
     1390                else if ( r_itlb_acc_redo_req )
     1391                {
     1392                    r_itlb_acc_redo_req = false;
     1393                    r_icache_inval_tlb_rsp = false;
     1394                    r_icache_fsm = ICACHE_IDLE;   
     1395                }
    13841396                else 
    13851397                {
     
    15681580                    r_icache_fsm = ICACHE_ERROR;
    15691581                }
     1582                else if ( r_itlb_acc_redo_req )
     1583                {
     1584                    r_itlb_acc_redo_req = false;
     1585                    r_icache_fsm = ICACHE_IDLE;   
     1586                }
    15701587                else 
    15711588                {
     
    15821599                    r_icache_fsm = ICACHE_ERROR;
    15831600                }
     1601                else if ( r_itlb_acc_redo_req )
     1602                {
     1603                    r_itlb_acc_redo_req = false;
     1604                    r_icache_inval_tlb_rsp = false;
     1605                    r_icache_fsm = ICACHE_IDLE;   
     1606                }
    15841607                else 
    15851608                {
     
    22582281                if ( !((rsp_itlb_miss & PTE_T_MASK ) >> PTE_T_SHIFT) )
    22592282                {
    2260                     r_dcache.setinbit(r_icache_paddr_save, r_dcache_in_itlb, true);
     2283                    bool set_hit = r_dcache.setinbit(r_icache_paddr_save, r_dcache_in_itlb, true);
     2284                    assert(set_hit && "D$ IDLE ITLB set hit error"); 
    22612285                }
    22622286            }
     
    25812605                dcache_hit_c = false;
    25822606            }
    2583 
    25842607            if ( r_mmu_mode.read() & DATA_TLB_MASK )
    25852608            {
     
    27012724                                        else    // get PTBA to calculate the physical address of PTE
    27022725                                        {
    2703                                             r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
    2704                                             r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
    2705                                             r_dcache_tlb_ptba_read = true;
    2706                                             r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     2726                                            data_t ptba;
     2727                                            if (r_dcache.read((paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2), &ptba))
     2728                                            {
     2729                                                r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
     2730                                                r_dcache_tlb_paddr = (paddr_t)(ptba & ((1<<(m_paddr_nbits - PAGE_K_NBITS))-1)) << PAGE_K_NBITS |
     2731                                     (paddr_t)(((dreq.addr & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3);
     2732                                                r_dcache_tlb_ll_dirty_req = true;
     2733                                                r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     2734                                               
     2735                                            }
     2736                                            else
     2737                                            {
     2738                                                r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
     2739                                                r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
     2740                                                r_dcache_tlb_ptba_read = true;
     2741                                                r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     2742                                            }
    27072743                                        }
    27082744                                    }                           
     
    28132849                                {
    28142850                                    r_dcache_pte_update = dcache_tlb.getpte(dcache_tlb_way, dcache_tlb_set) | PTE_D_MASK;
    2815                                     r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
    2816                                     r_dcache_tlb_ptba_read = true;
    2817                                     r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     2851                                    data_t ptba;
     2852                                    if (r_dcache.read((paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2), &ptba))
     2853                                    {
     2854                                        r_dcache_tlb_paddr = (paddr_t)(ptba & ((1<<(m_paddr_nbits - PAGE_K_NBITS))-1)) << PAGE_K_NBITS | (paddr_t)(((dreq.addr & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3);
     2855                                        r_dcache_tlb_ll_dirty_req = true;
     2856                                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     2857                                    }
     2858                                    else
     2859                                    {
     2860                                        r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
     2861                                        r_dcache_tlb_ptba_read = true;
     2862                                        r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     2863                                    }
    28182864                                }
    28192865                            }
     
    29412987                        {
    29422988                            r_dcache_pte_update = dcache_tlb.getpte(r_dcache_tlb_way_save, r_dcache_tlb_set_save) | PTE_D_MASK;
    2943                             r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
    2944                             r_dcache_tlb_ptba_read = true;
    2945                             r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     2989                            data_t ptba;
     2990                            if (r_dcache.read((paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2), &ptba))
     2991                            {
     2992                                r_dcache_tlb_paddr = (paddr_t)(ptba & ((1<<(m_paddr_nbits - PAGE_K_NBITS))-1)) << PAGE_K_NBITS | (paddr_t)(((dreq.addr & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3);
     2993                                r_dcache_tlb_ll_dirty_req = true;
     2994                                r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     2995                            }
     2996                            else
     2997                            {
     2998                                r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
     2999                                r_dcache_tlb_ptba_read = true;
     3000                                r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     3001                            }
    29463002                        }
    29473003                    }
     
    31213177            r_dcache_inval_tlb_rsp = false;
    31223178            r_dcache_fsm = DCACHE_IDLE;
     3179            if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    31233180            break;
    31243181        }
     
    31533210                if ( r_dcache_tlb_ptba_read )
    31543211                {
     3212                    paddr_t tlb_dpaddr;
     3213                    data_t data;
    31553214                    r_dcache_tlb_ptba_read = false;
    3156                     //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);
    3157                     //assert(write_hit && "Write on miss ignores data");
    3158                     r_dcache_tlb_ll_dirty_req = true;
    3159                     r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3160                     //m_cpt_dcache_data_write++;
    3161                     m_cost_data_tlb_update_dirty_frz++;
     3215                    if (dcache_tlb.translate(dreq.addr, &tlb_dpaddr) && r_dcache.read( (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) ,&data))
     3216                    {
     3217                        r_dcache_tlb_ll_dirty_req = true;
     3218                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     3219                        //m_cpt_dcache_data_write++;
     3220                        m_cpt_data_tlb_update_dirty++;
     3221                        m_cost_data_tlb_update_dirty_frz++;
     3222                    }           
     3223                    else
     3224                    {
     3225                        r_dcache_fsm = DCACHE_IDLE;
     3226                    }
    31623227                }
    31633228                else
     
    31813246                        r_dcache_pte_update = tlb_data | PTE_L_MASK;
    31823247                        r_dcache_tlb_ll_acc_req = true;
    3183                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_L_MASK)); 
    3184                         //assert(write_hit && "Write on miss ignores data"); 
    31853248                        r_dcache_fsm = DCACHE_TLB1_LL_WAIT;
    3186                         //m_cpt_dcache_data_write++;
    31873249                        m_cpt_data_tlb_update_acc++;
    31883250                        m_cost_data_tlb_update_acc_frz++;
     
    32003262                        r_dcache_pte_update = tlb_data | PTE_R_MASK;
    32013263                        r_dcache_tlb_ll_acc_req = true;
    3202                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_R_MASK)); 
    3203                         //assert(write_hit && "Write on miss ignores data"); 
    32043264                        r_dcache_fsm = DCACHE_TLB1_LL_WAIT;
    3205                         //m_cpt_dcache_data_write++;
    32063265                        m_cpt_data_tlb_update_acc++;
    32073266                        m_cost_data_tlb_update_acc_frz++;
     
    33813440                if (r_dcache_inval_tlb_rsp) r_dcache_inval_tlb_rsp = false;
    33823441                if (r_dcache_inval_rsp) r_dcache_inval_rsp = false;     
     3442                if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    33833443                break;
    33843444            }
     
    33883448                r_dcache_fsm = DCACHE_IDLE;
    33893449                r_dcache_inval_tlb_rsp = false;
     3450                if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    33903451                break;
    33913452            }
     
    33993460                r_dcache_fsm = DCACHE_IDLE;
    34003461                r_dcache_inval_rsp = false;
     3462                if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    34013463                break;
    34023464            }
     
    34253487            r_dcache_inval_tlb_rsp = false;
    34263488            r_dcache_fsm = DCACHE_IDLE;
     3489            if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    34273490            break;
    34283491        }
     
    34333496            data_t   rsp_dtlb_miss = 0;
    34343497            paddr_t  victim_index = 0;
    3435             //bool write_hit = false;
    34363498            size_t way = 0;
    34373499            size_t set = 0;
     
    34453507                r_dcache_fsm = DCACHE_IDLE;
    34463508                r_dcache_inval_rsp = false;
     3509                if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    34473510                break;
    34483511            }
     
    34873550                r_dcache_bad_vaddr  = dreq.addr;
    34883551                r_dcache_fsm        = DCACHE_ERROR;
     3552                if ( r_dcache_tlb_ptba_read ) r_dcache_tlb_ptba_read = false;
    34893553            }
    34903554            else if ( (rsp_dtlb_miss & PTE_T_MASK) >> PTE_T_SHIFT ) // PTD
     
    34973561                if ( r_dcache_tlb_ptba_read )
    34983562                {
     3563                    paddr_t tlb_dpaddr;
     3564                    data_t data;
    34993565                    r_dcache_tlb_ptba_read = false;
    3500                     //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);
    3501                     //assert(write_hit && "Write on miss ignores data");
    3502                     r_dcache_tlb_ll_dirty_req = true;
    3503                     r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3504                     //m_cpt_dcache_data_write++;
    3505                     m_cpt_data_tlb_update_dirty++;
    3506                     m_cost_data_tlb_update_dirty_frz++;
     3566                    if (dcache_tlb.translate(dreq.addr, &tlb_dpaddr) && r_dcache.read((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),&data))
     3567                    {
     3568                        r_dcache_tlb_ll_dirty_req = true;
     3569                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     3570                        //m_cpt_dcache_data_write++;
     3571                        m_cpt_data_tlb_update_dirty++;
     3572                        m_cost_data_tlb_update_dirty_frz++;
     3573                    }           
     3574                    else
     3575                    {
     3576                        r_dcache_fsm = DCACHE_IDLE;
     3577                    }
    35073578                }
    35083579                else
     
    35253596                        r_dcache_pte_update = rsp_dtlb_miss | PTE_L_MASK;
    35263597                        r_dcache_tlb_ll_acc_req = true;
    3527                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_L_MASK)); 
    3528                         //assert(write_hit && "Write on miss ignores data"); 
    35293598                        r_dcache_fsm        = DCACHE_TLB1_LL_WAIT;
    3530                         //m_cpt_dcache_data_write++;
    35313599                        m_cpt_data_tlb_update_acc++;
    35323600                        m_cost_data_tlb_update_acc_frz++;
     
    35443612                        r_dcache_pte_update = rsp_dtlb_miss | PTE_R_MASK;
    35453613                        r_dcache_tlb_ll_acc_req = true;
    3546                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_R_MASK)); 
    3547                         //assert(write_hit && "Write on miss ignores data"); 
    35483614                        r_dcache_fsm        = DCACHE_TLB1_LL_WAIT;
    3549                         //m_cpt_dcache_data_write++;
    35503615                        m_cpt_data_tlb_update_acc++;
    35513616                        m_cost_data_tlb_update_acc_frz++;
     
    35763641                r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
    35773642            }
    3578             r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     3643            bool set_hit = r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     3644            assert(set_hit && "TLB1_UPDT set hit error"); 
    35793645            r_dcache_fsm = DCACHE_IDLE;
    35803646        }
     
    36103676        data_t tlb_data = 0;
    36113677        data_t tlb_data_ppn = 0;
    3612         //bool write_hit = false;
    36133678        bool tlb_hit_cache = r_dcache.read(r_dcache_tlb_paddr, &tlb_data);
    36143679
     
    36573722                        r_dcache_ppn_update = tlb_data_ppn;
    36583723                        r_dcache_tlb_ll_acc_req = true;
    3659                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_L_MASK)); 
    3660                         //assert(write_hit && "Write on miss ignores data"); 
    36613724                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    3662                         //m_cpt_dcache_data_write++;
    36633725                        m_cpt_data_tlb_update_acc++;
    36643726                        m_cost_data_tlb_update_acc_frz++;
     
    36783740                        r_dcache_ppn_update = tlb_data_ppn;
    36793741                        r_dcache_tlb_ll_acc_req = true;
    3680                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(tlb_data | PTE_R_MASK)); 
    3681                         //assert(write_hit && "Write on miss ignores data"); 
    36823742                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    3683                         //m_cpt_dcache_data_write++;
    36843743                        m_cpt_data_tlb_update_acc++;
    36853744                        m_cost_data_tlb_update_acc_frz++;
     
    39914050                        r_dcache_ppn_update = tlb_data_ppn;
    39924051                        r_dcache_tlb_ll_acc_req = true;
    3993                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_L_MASK)); 
    3994                         //assert(write_hit && "Write on miss ignores data"); 
    39954052                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    3996                         //m_cpt_dcache_data_write++;
    39974053                        m_cpt_data_tlb_update_acc++;
    39984054                        m_cost_data_tlb_update_acc_frz++;
     
    40124068                        r_dcache_ppn_update = tlb_data_ppn;
    40134069                        r_dcache_tlb_ll_acc_req = true;
    4014                         //write_hit = r_dcache.write(r_dcache_tlb_paddr,(rsp_dtlb_miss | PTE_R_MASK)); 
    4015                         //assert(write_hit && "Write on miss ignores data"); 
    40164070                        r_dcache_fsm = DCACHE_TLB2_LL_WAIT;
    4017                         //m_cpt_dcache_data_write++;
    40184071                        m_cpt_data_tlb_update_acc++;
    40194072                        m_cost_data_tlb_update_acc_frz++;
     
    40444097                r_dcache.setinbit((paddr_t)victim_index << (uint32_log2(m_dcache_words)+2), r_dcache_in_dtlb, false);
    40454098            }
    4046             r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     4099            bool set_hit = r_dcache.setinbit(r_dcache_tlb_paddr, r_dcache_in_dtlb, true);
     4100            assert(set_hit && "TLB2_UPDT set hit error"); 
    40474101            r_dcache_fsm = DCACHE_IDLE;
    40484102        }
     
    41434197                }
    41444198                if (clean) break;
     4199                set = 0;
    41454200            }
    41464201
     
    45114566                {
    45124567                    r_dcache_pte_update = dcache_tlb.getpte(r_dcache_tlb_way_save, r_dcache_tlb_set_save) | PTE_D_MASK;
    4513                     r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
    4514                     r_dcache_tlb_ptba_read = true;
    4515                     r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     4568                    data_t ptba;
     4569                    if (r_dcache.read((paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2), &ptba))
     4570                    {
     4571                        r_dcache_tlb_paddr = (paddr_t)(ptba & ((1<<(m_paddr_nbits - PAGE_K_NBITS))-1)) << PAGE_K_NBITS | (paddr_t)(((dreq.addr & PTD_ID2_MASK) >> PAGE_K_NBITS) << 3);
     4572                        r_dcache_tlb_ll_dirty_req = true;
     4573                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
     4574                       
     4575                    }
     4576                    else
     4577                    {
     4578                        r_dcache_tlb_paddr = (paddr_t)r_mmu_ptpr << (INDEX1_NBITS+2) | (paddr_t)((dreq.addr>>PAGE_M_NBITS)<<2);
     4579                        r_dcache_tlb_ptba_read = true;
     4580                        r_dcache_fsm = DCACHE_DTLB1_READ_CACHE;
     4581                    }
    45164582                }
    45174583            }
     
    46804746            r_dcache.update(r_icache_paddr_save, way, set, r_dcache_miss_buf);
    46814747
    4682             r_dcache.setinbit(r_icache_paddr_save, r_dcache_in_itlb, true);
     4748            bool set_hit = r_dcache.setinbit(r_icache_paddr_save, r_dcache_in_itlb, true);
     4749            assert(set_hit && "ITLB_UPDT set hit error"); 
    46834750            bool itlb_hit_dcache = r_dcache.read(r_icache_paddr_save, &rsp_itlb_miss); 
    46844751            m_cpt_ins_tlb_occup_cache++;
     
    47714838                if ( r_dcache_inval_rsp )
    47724839                {
     4840                    r_itlb_acc_dcache_req = false;
     4841                    r_itlb_acc_redo_req = true;
    47734842                    r_dcache_inval_rsp = false;
    47744843                    r_dcache_fsm = DCACHE_IDLE;
     
    60096078
    60106079
     6080
Note: See TracChangeset for help on using the changeset viewer.