Ignore:
Timestamp:
Apr 8, 2010, 3:41:11 AM (14 years ago)
Author:
gao
Message:

bug correction

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r2 r12  
    10671067                r_itlb_read_dcache_req = true;
    10681068                r_icache_vaddr_req = ireq.addr;
     1069                r_itlb_k_read_dcache   = true;
    10691070                r_icache_fsm = ICACHE_TLB2_READ;
    10701071                m_cpt_ins_tlb_miss++;
     
    16671668        if ( r_tgt_icache_req )
    16681669        {
    1669             r_tgt_icache_req = false;
     1670            r_icache_fsm = ICACHE_CC_INVAL;
     1671            r_icache_fsm_save = r_icache_fsm;
     1672            m_cost_ins_waste_wait_frz++;
     1673            break;
    16701674        }
    16711675
     
    17271731    {   
    17281732        if ( ireq.valid ) m_cost_ins_waste_wait_frz++;
     1733        // external cache invalidate request
     1734        if ( r_tgt_icache_req )
     1735        {
     1736            r_icache_fsm = ICACHE_CC_INVAL;
     1737            r_icache_fsm_save = r_icache_fsm;
     1738            m_cost_ins_waste_wait_frz++;
     1739            break;
     1740        }
    17291741
    17301742        paddr_t ipaddr = 0;                     
     
    17551767    ////////////////////////
    17561768    case ICACHE_CACHE_INVAL_PA:
    1757     {   
     1769    {
     1770        // external cache invalidate request
     1771        if ( r_tgt_icache_req )
     1772        {
     1773            r_icache_fsm = ICACHE_CC_INVAL;
     1774            r_icache_fsm_save = r_icache_fsm;
     1775            m_cost_ins_waste_wait_frz++;
     1776            break;
     1777        }
     1778       
    17581779        paddr_t ipaddr = (paddr_t)r_mmu_word_hi.read() << 32 | r_mmu_word_lo.read();
    17591780
     
    19892010        else if (((r_icache_fsm_save == ICACHE_BIS)||(r_icache_fsm_save == ICACHE_MISS_WAIT) ||
    19902011               /* (r_icache_fsm_save == ICACHE_UNC_WAIT)||*/(r_icache_fsm_save == ICACHE_MISS_UPDT)) &&
    1991                 (r_icache_tlb_nline.read() == r_dcache_itlb_inval_line.read()))
     2012                (r_icache_tlb_nline == r_dcache_itlb_inval_line))
    19922013        {
    19932014            r_icache_inval_tlb_rsp = true;
     
    21902211
    21912212            bool itlb_hit_dcache = r_dcache.read(r_icache_paddr_save, &rsp_itlb_miss);
    2192             if ( (r_icache_fsm == ICACHE_TLB2_READ) && itlb_hit_dcache )
     2213            if ( r_itlb_k_read_dcache && itlb_hit_dcache )
    21932214            {   
     2215                r_itlb_k_read_dcache = false;
    21942216                bool itlb_hit_ppn = r_dcache.read(r_icache_paddr_save.read()+4, &rsp_itlb_ppn);
    21952217                assert(itlb_hit_ppn && "Address of pte[64-32] and pte[31-0] should be successive");
     
    25332555            else                    // using actual physical address for uncached access
    25342556            {
    2535                 dcache_hit_c = ((tlb_dpaddr == (paddr_t)r_dcache_paddr_save) && r_dcache_buf_unc_valid );
    2536                 dcache_rdata = r_dcache_miss_buf[0];
     2557                dcache_hit_c = false;
    25372558            }
    25382559
     
    26182639                        if ( dcache_hit_c )
    26192640                        {
    2620                             r_dcache_buf_unc_valid = false;
    26212641                            r_dcache_fsm = DCACHE_IDLE;
    26222642                            drsp.valid = true;
     
    39874007    {
    39884008        // external cache invalidate request
    3989         if ( r_tgt_dcache_req )
    3990         {
    3991             r_tgt_dcache_req = false;
    3992         }   
    3993 
     4009        if ( r_tgt_dcache_req )   
     4010        {
     4011            r_dcache_fsm = DCACHE_CC_CHECK;
     4012            r_dcache_fsm_save = r_dcache_fsm;
     4013            m_cost_data_waste_wait_frz++;
     4014            break;
     4015        } 
    39944016        size_t way = r_dcache_way;
    39954017        size_t set = r_dcache_set;
     
    40574079    case DCACHE_DCACHE_INVAL:
    40584080    {
     4081        // external cache invalidate request
     4082        if ( r_tgt_dcache_req )   
     4083        {
     4084            r_dcache_fsm = DCACHE_CC_CHECK;
     4085            r_dcache_fsm_save = r_dcache_fsm;
     4086            m_cost_data_waste_wait_frz++;
     4087            break;
     4088        } 
     4089
    40594090        m_cpt_dcache_dir_read += m_dcache_ways;
    40604091        vaddr_t invadr = dreq.wdata;
     
    41054136    case DCACHE_DCACHE_INVAL_PA:
    41064137    {
     4138        // external cache invalidate request
     4139        if ( r_tgt_dcache_req )   
     4140        {
     4141            r_dcache_fsm = DCACHE_CC_CHECK;
     4142            r_dcache_fsm_save = r_dcache_fsm;
     4143            m_cost_data_waste_wait_frz++;
     4144            break;
     4145        } 
    41074146        m_cpt_dcache_dir_read += m_dcache_ways;
    41084147        paddr_t dpaddr = (paddr_t)r_mmu_word_hi.read() << 32 | r_mmu_word_lo.read();
     
    43004339            if ( r_dcache_inval_tlb_rsp ) // Miss read response and tlb invalidation
    43014340            {
    4302                 r_dcache_fsm = DCACHE_IDLE;
    43034341                r_dcache_inval_tlb_rsp = false;
    4304                 break;
    43054342            }
    43064343
     
    43304367
    43314368            }           
    4332             r_dcache_buf_unc_valid = true;
     4369            drsp.valid = true;
     4370            drsp.rdata = r_dcache_miss_buf[0];
    43334371            r_dcache_fsm = DCACHE_IDLE;
    43344372        }       
     
    48014839        if (((r_dcache_fsm_save == DCACHE_BIS)||(r_dcache_fsm_save == DCACHE_MISS_WAIT) ||
    48024840             (r_dcache_fsm_save == DCACHE_UNC_WAIT)||(r_dcache_fsm_save == DCACHE_MISS_UPDT)) &&
    4803              (r_dcache_tlb_nline.read() == r_dcache_dtlb_inval_line.read()))
     4841             (r_dcache_tlb_nline == r_dcache_dtlb_inval_line))
    48044842        {
    48054843            r_dcache_inval_tlb_rsp = true;
     
    56445682        }
    56455683        else
    5646         {                                    
     5684        {           
    56475685            p_vci_ini_c.address = r_dcache_cleanup_line.read() * (m_dcache_words<<2);
    56485686            p_vci_ini_c.trdid  = 0; // cleanup data
Note: See TracChangeset for help on using the changeset viewer.