Changeset 217 for trunk


Ignore:
Timestamp:
Mar 23, 2012, 8:04:01 PM (12 years ago)
Author:
alain
Message:

Fixing a bug in the DCACHE_INVALTLB_SCAN sub-FSM:
It requires a specific register to save the return state.

Location:
trunk/modules/vci_cc_vcache_wrapper_v4/caba/source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/include/vci_cc_vcache_wrapper_v4.h

    r214 r217  
    334334    ///////////////////////////////
    335335    sc_signal<int>          r_dcache_fsm;               // state register
    336     sc_signal<int>          r_dcache_fsm_save;          // return state for coherence operation
     336    sc_signal<int>          r_dcache_fsm_cc_save;       // return state for coherence operation
     337    sc_signal<int>          r_dcache_fsm_scan_save;     // return state for tlb scan operation
    337338    // registers written in P0 stage (used in P1 stage)
    338339    sc_signal<bool>         r_dcache_p0_valid;              // P1 pipeline stage must be executed
  • trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp

    r213 r217  
    218218      r_icache_fsm("r_icache_fsm"),
    219219      r_icache_fsm_save("r_icache_fsm_save"),
     220
    220221      r_icache_vci_paddr("r_icache_vci_paddr"),
    221222      r_icache_vaddr_save("r_icache_vaddr_save"),
     
    242243
    243244      r_dcache_fsm("r_dcache_fsm"),
    244       r_dcache_fsm_save("r_dcache_fsm_save"),
     245      r_dcache_fsm_cc_save("r_dcache_fsm_cc_save"),
     246      r_dcache_fsm_scan_save("r_dcache_fsm_scan_save"),
    245247
    246248      r_dcache_p0_valid("r_dcache_p0_valid"),
     
    17641766        if ( r_tgt_icache_req.read() )
    17651767        {
    1766             r_icache_fsm = ICACHE_CC_CHECK;
     1768            r_icache_fsm      = ICACHE_CC_CHECK;
    17671769            r_icache_fsm_save = r_icache_fsm.read();
    17681770            break;
     
    21442146        if ( tlb_inval_required )
    21452147        {
    2146             r_dcache_fsm_save = DCACHE_IDLE;
    2147             r_dcache_fsm      = DCACHE_INVAL_TLB_SCAN;
    2148             r_dcache_p0_valid = false;
     2148            r_dcache_fsm_scan_save = r_dcache_fsm.read();
     2149            r_dcache_fsm           = DCACHE_INVAL_TLB_SCAN;
     2150            r_dcache_p0_valid      = false;
    21492151        }
    21502152        // external coherence request
    21512153        else if ( r_tgt_dcache_req.read() )   
    21522154        {
    2153             r_dcache_fsm_save = DCACHE_IDLE;
    2154             r_dcache_fsm      = DCACHE_CC_CHECK;
    2155             r_dcache_p0_valid = false;
     2155            r_dcache_fsm_cc_save = r_dcache_fsm.read();
     2156            r_dcache_fsm         = DCACHE_CC_CHECK;
     2157            r_dcache_p0_valid    = false;
    21562158        }       
    21572159
     
    32813283        if ( r_tgt_dcache_req )
    32823284        {
    3283             r_dcache_fsm = DCACHE_CC_CHECK;
    3284             r_dcache_fsm_save = r_dcache_fsm;
     3285            r_dcache_fsm         = DCACHE_CC_CHECK;
     3286            r_dcache_fsm_cc_save = r_dcache_fsm.read();
    32853287            break;
    32863288        }
     
    33373339        if ( r_tgt_dcache_req.read() )   
    33383340        {
    3339             r_dcache_fsm = DCACHE_CC_CHECK;
    3340             r_dcache_fsm_save = DCACHE_XTN_SYNC;
     3341            r_dcache_fsm_cc_save = r_dcache_fsm.read();
     3342            r_dcache_fsm         = DCACHE_CC_CHECK;
    33413343        }       
    33423344
     
    33573359        if ( r_tgt_dcache_req )   
    33583360        {
    3359             r_dcache_fsm = DCACHE_CC_CHECK;
    3360             r_dcache_fsm_save = r_dcache_fsm;
     3361            r_dcache_fsm_cc_save = r_dcache_fsm.read();
     3362            r_dcache_fsm         = DCACHE_CC_CHECK;
    33613363            break;
    33623364        } 
     
    35443546                r_dcache_tlb_inval_line  = nline;
    35453547                r_dcache_tlb_inval_count = 0;
    3546                 r_dcache_fsm_save        = DCACHE_XTN_DC_INVAL_END;
     3548                r_dcache_fsm_scan_save   = DCACHE_XTN_DC_INVAL_END;
    35473549                r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
    35483550                r_dcache_in_tlb[way*m_dcache_sets+set] = false;
     
    36493651            r_dcache_tlb_inval_count = 0;
    36503652            r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
    3651             r_dcache_fsm_save        = DCACHE_MISS_WAIT;
     3653            r_dcache_fsm_scan_save   = DCACHE_MISS_WAIT;
    36523654            r_dcache_in_tlb[way*m_dcache_sets+set] = false;
    36533655        }
     
    36723674        if ( r_tgt_dcache_req )
    36733675        {
    3674             r_dcache_fsm = DCACHE_CC_CHECK;
    3675             r_dcache_fsm_save = r_dcache_fsm;
     3676            r_dcache_fsm_cc_save = r_dcache_fsm;
     3677            r_dcache_fsm         = DCACHE_CC_CHECK;
    36763678            break;
    36773679        }
     
    38433845        if ( r_tgt_dcache_req.read() )
    38443846        {
    3845             r_dcache_fsm = DCACHE_CC_CHECK;
    3846             r_dcache_fsm_save = r_dcache_fsm;
     3847            r_dcache_fsm_cc_save = r_dcache_fsm;
     3848            r_dcache_fsm         = DCACHE_CC_CHECK;
    38473849            break;
    38483850        }
     
    38773879        if ( r_tgt_dcache_req.read() )
    38783880        {
    3879             r_dcache_fsm = DCACHE_CC_CHECK;
    3880             r_dcache_fsm_save = r_dcache_fsm;
     3881            r_dcache_fsm_cc_save = r_dcache_fsm;
     3882            r_dcache_fsm         = DCACHE_CC_CHECK;
    38813883            break;
    38823884        }
     
    39543956        if ( r_tgt_dcache_req )
    39553957        {
    3956             r_dcache_fsm = DCACHE_CC_CHECK;
    3957             r_dcache_fsm_save = r_dcache_fsm;
     3958            r_dcache_fsm_cc_save = r_dcache_fsm;
     3959            r_dcache_fsm         = DCACHE_CC_CHECK;
    39583960            break;
    39593961        }
     
    39803982#endif
    39813983            }
    3982             else                                // invalidate the cache line and TLBs
     3984            else                                        // invalidate the cache line and TLBs
    39833985            {
    39843986                paddr_t nline;
     
    39994001                    r_dcache_tlb_inval_line  = nline;
    40004002                    r_dcache_tlb_inval_count = 0;
    4001                     r_dcache_fsm_save        = DCACHE_IDLE;
     4003                    r_dcache_fsm_scan_save   = DCACHE_IDLE;
    40024004                    r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
    40034005                    r_dcache_in_tlb[way*m_dcache_sets+set] = false;
     
    40274029                            // If the updated (or invalidated) cache line has copies in TLBs
    40284030                            // these TLB copies are invalidated.
    4029                             // The return state is defined in r_dcache_fsm_save
     4031                            // The return state is defined in r_dcache_fsm_cc_save
    40304032    {
    40314033        paddr_t  paddr = r_tgt_paddr.read();
     
    40334035
    40344036
    4035         if( (r_dcache_fsm_save == DCACHE_MISS_WAIT) and
     4037        if( (r_dcache_fsm_cc_save == DCACHE_MISS_WAIT) and
    40364038            ((r_dcache_vci_paddr.read() & mask) == (paddr & mask)) ) // matching pending miss
    40374039        {
     
    40394041            r_tgt_dcache_req    = false;                // coherence request completed
    40404042            r_tgt_dcache_rsp    = r_tgt_update.read();  // response required if update
    4041             r_dcache_fsm        = r_dcache_fsm_save;
     4043            r_dcache_fsm        = r_dcache_fsm_cc_save.read();
    40424044
    40434045#if DEBUG_DCACHE
     
    40824084                r_tgt_dcache_req = false;
    40834085                r_tgt_dcache_rsp = r_tgt_update.read();
    4084                 r_dcache_fsm     = r_dcache_fsm_save.read();
     4086                r_dcache_fsm     = r_dcache_fsm_cc_save.read();
    40854087            }
    40864088
     
    41244126            r_dcache_tlb_inval_line  = nline;
    41254127            r_dcache_tlb_inval_count = 0;
     4128            r_dcache_fsm_scan_save   = r_dcache_fsm.read();
    41264129            r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
    41274130            r_dcache_in_tlb[way*m_dcache_sets+set] = false;
     
    41334136            r_tgt_dcache_rsp = true;
    41344137            r_tgt_dcache_req = false;
    4135             r_dcache_fsm     = r_dcache_fsm_save.read();
     4138            r_dcache_fsm     = r_dcache_fsm_cc_save.read();
    41364139        }
    41374140        else                                                            // no inval
     
    41394142            r_tgt_dcache_rsp = true;
    41404143            r_tgt_dcache_req = false;
    4141             r_dcache_fsm     = r_dcache_fsm_save.read();
     4144            r_dcache_fsm     = r_dcache_fsm_cc_save.read();
    41424145        }
    41434146
     
    41794182                r_dcache_tlb_inval_line  = nline;
    41804183                r_dcache_tlb_inval_count = 0;
     4184                r_dcache_fsm_scan_save   = r_dcache_fsm.read();
    41814185                r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
    41824186                r_dcache_in_tlb[way*m_dcache_sets+set] = false;
     
    41884192                r_tgt_dcache_rsp = true;
    41894193                r_tgt_dcache_req = false;
    4190                 r_dcache_fsm     = r_dcache_fsm_save.read();
     4194                r_dcache_fsm     = r_dcache_fsm_cc_save.read();
    41914195            }
    41924196            else                                                        // no inval
     
    41944198                r_tgt_dcache_rsp = true;
    41954199                r_tgt_dcache_req = false;
    4196                 r_dcache_fsm     = r_dcache_fsm_save.read();
     4200                r_dcache_fsm     = r_dcache_fsm_cc_save.read();
    41974201            }
    41984202        }
     
    42264230                                        // - r_dcache_tlb_inval_line
    42274231                                        // - r_dcache_tlb_inval_count
    4228                                         // - r_dcache_fsm_save
     4232                                        // - r_dcache_fsm_cc_save
    42294233    {
    42304234        paddr_t line = r_dcache_tlb_inval_line.read();                  // nline
     
    42634267        if ( r_dcache_tlb_inval_count.read() == (m_dtlb_sets*m_dtlb_ways-1) )
    42644268        {
    4265             if ( r_tgt_dcache_req.read() ) // It's a coherence request
    4266             {
    4267                 r_tgt_dcache_rsp    = true;
    4268                 r_tgt_dcache_req    = false;
    4269             }
    4270             r_dcache_fsm            = r_dcache_fsm_save.read();
     4269            r_dcache_fsm = r_dcache_fsm_scan_save.read();
    42714270        }
    42724271        r_dcache_tlb_inval_count = r_dcache_tlb_inval_count.read() + 1;
     
    43564355            bool dcache_miss_req = r_dcache_vci_miss_req.read()
    43574356                 and ( not r_icache_miss_req.read() or not r_vci_cmd_imiss_prio.read() );
     4357
    43584358            bool icache_miss_req = r_icache_miss_req.read()
    43594359                 and ( not r_dcache_vci_miss_req.read() or r_vci_cmd_imiss_prio.read() );
Note: See TracChangeset for help on using the changeset viewer.