Changeset 325


Ignore:
Timestamp:
Mar 14, 2013, 4:14:03 PM (11 years ago)
Author:
joannou
Message:

bugfix in vci_cc_vcache_wrapper_dspin_coherence :

  • consume fifo in ICACHE_CC_UPDT for last flit
  • fixed nline value for tlb accesses in DCACHE_CC_CHECK sub fsm
  • added a break after the jump to the TLB_SCAN sub fsm in DCACHE_CC_UPDT
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/v5/modules/vci_cc_vcache_wrapper_dspin_coherence/caba/source/src/vci_cc_vcache_wrapper.cpp

    r323 r325  
    19241924                if(not r_icache_cc_send_req.read()) // cc_send is available
    19251925                {
     1926                    //consume last flit
     1927                    cc_receive_updt_fifo_get  = true;
    19261928                    // coherence request completed
    19271929                    r_cc_receive_icache_req = false;
     
    44794481            {
    44804482                r_dcache_in_tlb[way*m_dcache_sets+set] = false;
    4481                 r_dcache_tlb_inval_line  = r_cc_receive_dcache_nline.read() / (m_dcache_words<<2);
     4483                r_dcache_tlb_inval_line  = r_cc_receive_dcache_nline.read();
    44824484                r_dcache_tlb_inval_set   = 0;
    44834485                r_dcache_fsm_scan_save   = r_dcache_fsm.read();
    44844486                r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
     4487                break;
    44854488            }
    44864489            else
     
    45504553                {
    45514554                    r_dcache_in_tlb[way*m_dcache_sets+set] = false;
    4552                     r_dcache_tlb_inval_line  = r_cc_receive_dcache_nline.read() / (m_dcache_words<<2);
     4555                    r_dcache_tlb_inval_line  = r_cc_receive_dcache_nline.read();
    45534556                    r_dcache_tlb_inval_set   = 0;
    45544557                    r_dcache_fsm_scan_save   = r_dcache_fsm.read();
     
    45564559                    break;
    45574560                }
    4558                 else
    4559                 {
    4560                     if ( r_dcache_contains_ptd[way*m_dcache_sets+set] )         // TLB flush
    4561                     {
    4562                         r_itlb.reset();
    4563                         r_dtlb.reset();
    4564                         r_dcache_contains_ptd[way*m_dcache_sets+set] = false;
     4561
     4562                if ( r_dcache_contains_ptd[way*m_dcache_sets+set] )     // TLB flush
     4563                {
     4564                    r_itlb.reset();
     4565                    r_dtlb.reset();
     4566                    r_dcache_contains_ptd[way*m_dcache_sets+set] = false;
    45654567
    45664568#if DEBUG_DCACHE
     
    45714573}
    45724574#endif
    4573                     }
     4575                }
    45744576
    45754577#ifdef INSTRUMENTATION
    45764578m_cpt_dcache_data_write++;
    45774579#endif
    4578                     r_dcache.write( way,
    4579                                     set,
    4580                                     word,
    4581                                     r_cc_receive_updt_fifo_data.read(),
    4582                                     r_cc_receive_updt_fifo_be.read() );
    4583 
    4584                     r_dcache_cc_word = word + 1;
     4580                r_dcache.write( way,
     4581                                set,
     4582                                word,
     4583                                r_cc_receive_updt_fifo_data.read(),
     4584                                r_cc_receive_updt_fifo_be.read() );
     4585
     4586                r_dcache_cc_word = word + 1;
    45854587
    45864588#if DEBUG_DCACHE
     
    45954597}
    45964598#endif
    4597                 }
    45984599            }
    45994600
     
    46264627                cc_receive_updt_fifo_get  = true;
    46274628            }
    4628 
    46294629        }
    46304630        break;
     
    46374637        size_t   way   = r_dcache_cc_way.read();
    46384638        size_t   set   = r_dcache_cc_set.read();
    4639         paddr_t  nline = r_cc_receive_dcache_nline.read() / (m_dcache_words<<2);
     4639        paddr_t  nline = r_cc_receive_dcache_nline.read();
    46404640
    46414641        if (r_dcache_cc_need_write.read())
     
    46484648                r_dcache_fsm_scan_save   = r_dcache_fsm.read();
    46494649                r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
     4650                break;
    46504651            }
    46514652            else
     
    53345335        {
    53355336            // a coherence request has arrived
    5336             if(p_dspin_in.write.read())
     5337            if (p_dspin_in.write.read())
    53375338            {
    53385339                // initialize dspin received data
     
    53435344                r_cc_receive_data_ins = (bool)(receive_type & 0x1);
    53445345                // test for a broadcast
    5345                 if(DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::FROM_MC_BC))
     5346                if (DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::FROM_MC_BC))
     5347                {
    53465348                    r_cc_receive_fsm = CC_RECEIVE_BRDCAST_HEADER;
     5349                }
    53475350                // test for a CLACK
    5348                 else if(receive_type == DspinDhccpParam::TYPE_CLEANUP_ACK)
     5351                else if (receive_type == DspinDhccpParam::TYPE_CLEANUP_ACK)
     5352                {
    53495353                    r_cc_receive_fsm = CC_RECEIVE_CLACK;
     5354                }
    53505355                // test for a multi updt
    5351                 else if((receive_type == DspinDhccpParam::TYPE_MULTI_UPDT_DATA) or
    5352                         (receive_type == DspinDhccpParam::TYPE_MULTI_UPDT_INST))
     5356                else if ((receive_type == DspinDhccpParam::TYPE_MULTI_UPDT_DATA) or
     5357                         (receive_type == DspinDhccpParam::TYPE_MULTI_UPDT_INST))
     5358                {
    53535359                    r_cc_receive_fsm = CC_RECEIVE_UPDT_HEADER;
     5360                }
    53545361                // test for a multi inval
    53555362                else
     5363                {
    53565364                    r_cc_receive_fsm = CC_RECEIVE_INVAL_HEADER;
     5365                }
    53575366            }
    53585367            break;
     
    53695378                // request dcache to handle the CLACK
    53705379                r_cc_receive_dcache_req  = true;
    5371                 r_cc_receive_dcache_set  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_SET);
    5372                 r_cc_receive_dcache_way  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_WAY);
     5380                r_cc_receive_dcache_set  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_SET) & ((1ULL<<(uint32_log2(m_dcache_sets)))-1);
     5381                r_cc_receive_dcache_way  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_WAY) & ((1ULL<<(uint32_log2(m_dcache_ways)))-1);
    53735382                r_cc_receive_dcache_type = CC_TYPE_CLACK;
    53745383                // get back to idle state
     
    53815390                // request icache to handle the CLACK
    53825391                r_cc_receive_icache_req  = true;
    5383                 r_cc_receive_icache_set  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_SET);
    5384                 r_cc_receive_icache_way  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_WAY);
     5392                r_cc_receive_icache_set  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_SET) & ((1ULL<<(uint32_log2(m_icache_sets)))-1);
     5393                r_cc_receive_icache_way  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::CLEANUP_ACK_WAY) & ((1ULL<<(uint32_log2(m_icache_ways)))-1);
    53855394                r_cc_receive_icache_type = CC_TYPE_CLACK;
    53865395                // get back to idle state
     
    54835492            // for data INVAL, wait for dcache to take the request and fifo to
    54845493            // be empty
    5485             if ((r_cc_receive_data_ins.read() == 0) and not (r_cc_receive_dcache_req.read()) and r_cc_receive_updt_fifo_be.empty())
     5494            if ((r_cc_receive_data_ins.read() == 0) and not r_cc_receive_dcache_req.read() and r_cc_receive_updt_fifo_be.empty())
    54865495            {
    54875496                r_cc_receive_dcache_updt_tab_idx  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::MULTI_UPDT_UPDT_INDEX);
     
    54915500            // for ins INVAL, wait for icache to take the request and fifo to be
    54925501            // empty
    5493             if ((r_cc_receive_data_ins.read() == 1) and not (r_cc_receive_icache_req.read()) and r_cc_receive_updt_fifo_be.empty())
     5502            if ((r_cc_receive_data_ins.read() == 1) and not r_cc_receive_icache_req.read() and r_cc_receive_updt_fifo_be.empty())
    54945503            {
    54955504                r_cc_receive_icache_updt_tab_idx  = DspinDhccpParam::dspin_get(receive_data,DspinDhccpParam::MULTI_UPDT_UPDT_INDEX);
     
    59255934        {
    59265935            if (((r_cc_receive_data_ins.read() == 0) and
    5927                 not (r_cc_receive_dcache_req.read()) and
     5936                not r_cc_receive_dcache_req.read() and
    59285937                r_cc_receive_updt_fifo_be.empty())
    59295938                or
    59305939                ((r_cc_receive_data_ins.read() == 1) and
    5931                 not (r_cc_receive_icache_req.read()) and
    5932                 r_cc_receive_updt_fifo_be.empty()))
     5940                not r_cc_receive_icache_req.read()) and
     5941                r_cc_receive_updt_fifo_be.empty())
    59335942                p_dspin_in.read = true;
    59345943            else
Note: See TracChangeset for help on using the changeset viewer.