Changeset 139 for trunk/modules


Ignore:
Timestamp:
Mar 2, 2011, 11:09:56 AM (14 years ago)
Author:
gao
Message:

Cleanup FSM changed

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

    r130 r139  
    169169        RSP_DATA_WRITE,             // 0d
    170170    };
    171     enum cleanup_fsm_state_e {
    172         CLEANUP_IDLE,               // 00
    173         CLEANUP_DATA,               // 01
    174         CLEANUP_INS,                // 02
     171    enum cleanup_cmd_fsm_state_e {
     172        CLEANUP_CMD_IDLE,               // 00
     173        CLEANUP_CMD_DATA,               // 01
     174        CLEANUP_CMD_INS,                // 02
     175    };
     176
     177    enum cleanup_rsp_fsm_state_e {
     178        CLEANUP_RSP_IDLE,               // 00
     179        CLEANUP_RSP_DATA,               // 01
     180        CLEANUP_RSP_INS,                // 02
    175181    };
    176182
     
    385391    data_t                  *r_dcache_miss_buf; 
    386392
    387     sc_signal<int>          r_cleanup_fsm;
     393    sc_signal<int>          r_cleanup_cmd_fsm;
     394    sc_signal<int>          r_cleanup_rsp_fsm;
    388395
    389396    // VCI_TGT FSM REGISTERS
     
    523530    uint32_t m_cpt_cc_inval_data;               // number of coherence inval data packets
    524531    uint32_t m_cpt_cc_broadcast;                // number of coherence broadcast packets
     532   
     533    uint32_t m_cost_updt_data_frz;              // number of frozen cycles related to coherence update data packets
     534    uint32_t m_cost_inval_ins_frz;              // number of frozen cycles related to coherence inval instruction packets
     535    uint32_t m_cost_inval_data_frz;             // number of frozen cycles related to coherence inval data packets
     536    uint32_t m_cost_broadcast_frz;              // number of frozen cycles related to coherence broadcast packets
     537
    525538    uint32_t m_cpt_cc_cleanup_ins;              // number of coherence cleanup packets
    526539    uint32_t m_cpt_cc_cleanup_data;             // number of coherence cleanup packets
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r130 r139  
    140140        "RSP_DATA_WRITE",     
    141141    };
    142 const char *cleanup_fsm_state_str[] = {
    143         "CLEANUP_IDLE",           
    144         "CLEANUP_DATA",   
    145         "CLEANUP_INS",     
     142const char *cleanup_cmd_fsm_state_str[] = {
     143        "CLEANUP_CMD_IDLE",           
     144        "CLEANUP_CMD_DATA",   
     145        "CLEANUP_CMD_INS",     
     146    };
     147const char *cleanup_rsp_fsm_state_str[] = {
     148        "CLEANUP_RSP_IDLE",           
     149        "CLEANUP_RSP_DATA",   
     150        "CLEANUP_RSP_INS",     
    146151    };
    147152const char *tgt_fsm_state_str[] = {
     
    284289      r_dcache_tlb_sc_fail("r_dcache_tlb_sc_fail"),
    285290
    286       r_cleanup_fsm("r_cleanup_fsm"),
     291      r_cleanup_cmd_fsm("r_cleanup_cmd_fsm"),
     292      r_cleanup_rsp_fsm("r_cleanup_rsp_fsm"),
    287293
    288294      r_vci_tgt_fsm("r_vci_tgt_fsm"),
     
    389395              << " cmd fsm: " << cmd_fsm_state_str[r_vci_cmd_fsm]
    390396              << " rsp fsm: " << rsp_fsm_state_str[r_vci_rsp_fsm]
    391               << " cleanup fsm: " << cleanup_fsm_state_str[r_cleanup_fsm]
     397              << " cleanup cmd fsm: " << cleanup_cmd_fsm_state_str[r_cleanup_cmd_fsm]
     398              << " cleanup rsp fsm: " << cleanup_rsp_fsm_state_str[r_cleanup_rsp_fsm]
    392399              << " inval itlb fsm: " << inval_itlb_fsm_state_str[r_inval_itlb_fsm]
    393400              << " inval dtlb fsm: " << inval_dtlb_fsm_state_str[r_inval_dtlb_fsm] << std::endl;
     
    428435        << "- ITLB HIT IN DCACHE RATE= " << (float)m_cpt_ins_tlb_hit_dcache/m_cpt_ins_tlb_miss << std::endl
    429436        << "- DTLB HIT IN DCACHE RATE= " << (float)m_cpt_data_tlb_hit_dcache/m_cpt_data_tlb_miss << std::endl
    430         << "- DCACHE FROZEN BY TLB OP= " << (float)(m_cost_ins_tlb_occup_cache_frz+m_cost_data_tlb_occup_cache_frz)/m_cpt_dcache_frz_cycles << std::endl
     437        << "- DCACHE FROZEN BY ITLB  = " << (float)m_cost_ins_tlb_occup_cache_frz/m_cpt_dcache_frz_cycles << std::endl
    431438        << "- DCACHE FOR TLB %       = " << (float)m_cpt_tlb_occup_dcache/(m_dcache_ways*m_dcache_sets) << std::endl
    432439        << "- NB CC BROADCAST        = " << m_cpt_cc_broadcast << std::endl
     
    434441        << "- NB CC INVAL DATA       = " << m_cpt_cc_inval_data << std::endl
    435442        << "- NB CC INVAL INS        = " << m_cpt_cc_inval_ins << std::endl
     443        << "- CC BROADCAST COST      = " << (float)m_cost_broadcast_frz/m_cpt_cc_broadcast << std::endl
     444        << "- CC UPDATE DATA COST    = " << (float)m_cost_updt_data_frz/m_cpt_cc_update_data << std::endl
     445        << "- CC INVAL DATA COST     = " << (float)m_cost_inval_data_frz/m_cpt_cc_inval_data << std::endl
     446        << "- CC INVAL INS COST      = " << (float)m_cost_inval_ins_frz/m_cpt_cc_inval_ins << std::endl
    436447        << "- NB CC CLEANUP DATA     = " << m_cpt_cc_cleanup_data << std::endl
    437448        << "- NB CC CLEANUP INS      = " << m_cpt_cc_cleanup_ins << std::endl
     
    458469    m_cpt_icache_dir_write  = 0;
    459470   
    460         m_cpt_frz_cycles        = 0;
     471    m_cpt_frz_cycles        = 0;
    461472    m_cpt_dcache_frz_cycles = 0;
    462         m_cpt_total_cycles      = 0;
     473    m_cpt_total_cycles      = 0;
    463474   
    464475    m_cpt_read         = 0;
     
    527538    m_cost_dtlb_sc_dirty_transaction = 0;
    528539
    529     m_cpt_cc_broadcast  = 0;
    530540    m_cpt_cc_update_data = 0;
    531     m_cpt_cc_inval_data = 0;
    532     m_cpt_cc_inval_ins = 0;
     541    m_cpt_cc_inval_ins   = 0;
     542    m_cpt_cc_inval_data  = 0;
     543    m_cpt_cc_broadcast   = 0;
     544
     545    m_cost_updt_data_frz  = 0;
     546    m_cost_inval_ins_frz  = 0;
     547    m_cost_inval_data_frz = 0;
     548    m_cost_broadcast_frz  = 0;
     549
    533550    m_cpt_cc_cleanup_data = 0;
    534     m_cpt_cc_cleanup_ins = 0;
     551    m_cpt_cc_cleanup_ins  = 0;
    535552}
    536553
     
    550567        r_inval_itlb_fsm = INVAL_ITLB_IDLE;         
    551568        r_inval_dtlb_fsm = INVAL_DTLB_IDLE;         
    552         r_cleanup_fsm = CLEANUP_IDLE;
     569        r_cleanup_cmd_fsm = CLEANUP_CMD_IDLE;
     570        r_cleanup_rsp_fsm = CLEANUP_RSP_IDLE;
    553571
    554572        // write buffer & caches
     
    723741        m_cost_ins_tlb_occup_cache_frz   = 0;
    724742        m_cost_data_tlb_occup_cache_frz  = 0;
     743
     744        m_cpt_ins_tlb_inval       = 0;           
     745        m_cpt_data_tlb_inval      = 0;         
     746        m_cost_ins_tlb_inval_frz  = 0;     
     747        m_cost_data_tlb_inval_frz = 0;         
     748
     749        m_cpt_cc_update_data = 0;
     750        m_cpt_cc_inval_ins   = 0;
     751        m_cpt_cc_inval_data  = 0;
     752        m_cpt_cc_broadcast   = 0;
     753
     754        m_cost_updt_data_frz  = 0;
     755        m_cost_inval_ins_frz  = 0;
     756        m_cost_inval_data_frz = 0;
     757        m_cost_broadcast_frz  = 0;
     758
     759        m_cpt_cc_cleanup_data = 0;
     760        m_cpt_cc_cleanup_ins  = 0;
    725761
    726762        m_cpt_itlbmiss_transaction      = 0;   
     
    751787          << " cmd fsm: " << cmd_fsm_state_str[r_vci_cmd_fsm]
    752788          << " rsp fsm: " << rsp_fsm_state_str[r_vci_rsp_fsm]
    753           << " cleanup fsm: " << cleanup_fsm_state_str[r_cleanup_fsm]
     789          << " cleanup cmd fsm: " << cleanup_cmd_fsm_state_str[r_cleanup_cmd_fsm]
     790          << " cleanup rsp fsm: " << cleanup_rsp_fsm_state_str[r_cleanup_rsp_fsm]
    754791          << " inval itlb fsm: " << inval_itlb_fsm_state_str[r_inval_itlb_fsm]
    755792          << " inval dtlb fsm: " << inval_dtlb_fsm_state_str[r_inval_dtlb_fsm] << std::endl;
     
    843880                r_vci_tgt_fsm = TGT_REQ_BROADCAST;
    844881                m_cpt_cc_broadcast++;
     882                m_cost_broadcast_frz++;
    845883            }
    846884            else                // multi-update or multi-invalidate for data type
     
    859897                    r_vci_tgt_fsm = TGT_REQ_DCACHE;
    860898                    m_cpt_cc_inval_data++ ;
     899                    m_cost_inval_data_frz++;
    861900                }
    862901                else if (cell == 4)                // update
     
    871910                    r_vci_tgt_fsm = TGT_UPDT_WORD;
    872911                    m_cpt_cc_update_data++ ;
     912                    m_cost_updt_data_frz++;
    873913                }     
    874914                else if (cell == 8)
     
    883923                    r_vci_tgt_fsm = TGT_REQ_ICACHE;
    884924                    m_cpt_cc_inval_ins++ ;
     925                    m_cost_inval_ins_frz++;
    885926                }
    886927            } // end if address   
     
    891932    case TGT_UPDT_WORD:
    892933    {
     934        m_cost_updt_data_frz++;
     935
    893936        if (p_vci_tgt.cmdval.read())
    894937        {
     
    908951    case TGT_UPDT_DATA:
    909952    {
     953        m_cost_updt_data_frz++;
     954
    910955        if (p_vci_tgt.cmdval.read())
    911956        {
     
    927972    case TGT_REQ_BROADCAST:
    928973    {
     974        m_cost_broadcast_frz++;
     975
    929976        if ( !r_tgt_icache_req.read() && !r_tgt_dcache_req.read() )
    930977        {
     
    938985    case TGT_REQ_ICACHE:
    939986    {
     987        m_cost_inval_ins_frz++;
     988
    940989        if ( !r_tgt_icache_req.read() )
    941990        {
     
    948997    case TGT_REQ_DCACHE:
    949998    {
     999        if (r_tgt_update)
     1000            m_cost_updt_data_frz++;
     1001        else
     1002            m_cost_inval_data_frz++;
     1003
    9501004        if ( !r_tgt_dcache_req.read() )
    9511005        {
     
    9581012    case TGT_RSP_BROADCAST:
    9591013    {
     1014        m_cost_broadcast_frz++;
     1015
    9601016        // no response
    9611017        if ( !r_tgt_icache_rsp.read() && !r_tgt_dcache_rsp.read() && !r_tgt_icache_req.read() && !r_tgt_dcache_req.read() )
     
    9861042    case TGT_RSP_ICACHE:
    9871043    {
     1044        m_cost_inval_ins_frz++;
     1045
    9881046        if ( (p_vci_tgt.rspack.read() || !r_tgt_icache_rsp.read()) && !r_tgt_icache_req.read() )
    9891047        {
     
    9961054    case TGT_RSP_DCACHE:
    9971055    {
     1056        if (r_tgt_update)
     1057            m_cost_updt_data_frz++;
     1058        else
     1059            m_cost_inval_data_frz++;
     1060
    9981061        if ( (p_vci_tgt.rspack.read() || !r_tgt_dcache_rsp.read()) && !r_tgt_dcache_req.read() )
    9991062        {
     
    12411304                r_icache_vaddr_req = ireq.addr;
    12421305                r_icache_fsm = ICACHE_BIS;
    1243                 m_cost_ins_miss_frz++;
     1306                //m_cost_ins_miss_frz++;
    12441307            }
    12451308            else    // cached or uncached access with a correct speculative physical address
     
    12811344    case ICACHE_BIS:
    12821345    {
    1283         //if ( ireq.valid ) m_cost_ins_miss_frz++;
    1284 
    12851346        // external cache invalidate request
    12861347        if ( r_tgt_icache_req )
     
    15851646            r_dcache_itlb_cleanup_req = true;
    15861647            r_dcache_itlb_cleanup_line = victim_index;
    1587             m_cpt_cc_cleanup_ins++;
     1648            //m_cpt_cc_cleanup_ins++;
    15881649        }
    15891650        r_icache_fsm = ICACHE_TLB1_UPDT;
     
    16421703                        r_itlb_acc_redo_req = false;
    16431704                        r_itlb_read_dcache_req = true;
    1644                         //r_icache_fsm = ICACHE_IDLE; 
    16451705                    }
    16461706                    else if ( !(r_dcache_rsp_itlb_miss >> PTE_V_SHIFT) ) // unmapped
     
    18221882            r_dcache_itlb_cleanup_req = true;
    18231883            r_dcache_itlb_cleanup_line = victim_index;
    1824             m_cpt_cc_cleanup_ins++;
     1884            //m_cpt_cc_cleanup_ins++;
    18251885        }
    18261886        r_icache_fsm = ICACHE_TLB2_UPDT;
     
    19412001        if ( !r_dcache_itlb_cleanup_req )
    19422002        {
    1943             r_dcache_itlb_cleanup_req = icache_tlb.inval(r_dcache_wdata_save, &victim_index);
     2003            bool dcache_itlb_cleanup_req = icache_tlb.inval(r_dcache_wdata_save, &victim_index);
     2004            r_dcache_itlb_cleanup_req = dcache_itlb_cleanup_req;
    19442005            r_dcache_itlb_cleanup_line = victim_index;
    1945             m_cpt_cc_cleanup_ins++;
     2006            //if (dcache_itlb_cleanup_req) m_cpt_cc_cleanup_ins++;
    19462007            r_dcache_xtn_req = false;
    19472008            r_itlb_translation_valid = false;
     
    19792040            {
    19802041                // invalidate and cleanup if necessary
    1981                 r_icache_cleanup_req = r_icache.inval(ipaddr);
     2042                bool icache_cleanup_req = r_icache.inval(ipaddr);
     2043                r_icache_cleanup_req = icache_cleanup_req;
    19822044                r_icache_cleanup_line = ipaddr >> (uint32_log2(m_icache_words) + 2); 
    1983                 m_cpt_cc_cleanup_ins++;
     2045                if (icache_cleanup_req) m_cpt_cc_cleanup_ins++;
    19842046            }
    19852047            r_dcache_xtn_req = false;
     
    20042066        {   
    20052067            // invalidate and cleanup if necessary
    2006             r_icache_cleanup_req = r_icache.inval(ipaddr);
     2068            bool icache_cleanup_req = r_icache.inval(ipaddr);
     2069            r_icache_cleanup_req = icache_cleanup_req;
    20072070            r_icache_cleanup_line = ipaddr >> (uint32_log2(m_icache_words) + 2); 
    2008             m_cpt_cc_cleanup_ins++;
     2071            if (icache_cleanup_req) m_cpt_cc_cleanup_ins++;
    20092072            r_dcache_xtn_req = false;
    20102073            r_icache_fsm = ICACHE_IDLE;
     
    21022165
    21032166                if ( r_icache_inval_tlb_rsp ) r_icache_inval_tlb_rsp = false;
    2104                 //if ( r_icache_inval_rsp ) r_icache_inval_rsp = false;
    21052167                break;
    21062168            }
     
    21702232                m_cpt_icache_data_write++;
    21712233
    2172                 r_icache_cleanup_req = r_icache.update(r_icache_paddr_save.read(), buf, &victim_index);
     2234                bool icache_cleanup_req = r_icache.update(r_icache_paddr_save.read(), buf, &victim_index);
     2235                r_icache_cleanup_req = icache_cleanup_req;
    21732236                r_icache_cleanup_line = victim_index;                       
    2174                 m_cpt_cc_cleanup_ins++;
     2237                if (icache_cleanup_req) m_cpt_cc_cleanup_ins++;
    21752238                r_icache_fsm = ICACHE_IDLE;
    21762239            }
     
    22582321    }
    22592322    } // end switch r_icache_fsm
     2323
    22602324#ifdef SOCLIB_MODULE_DEBUG
    22612325    std::cout << name() << " Instruction Response: " << irsp << std::endl;
    22622326#endif
     2327
    22632328    ////////////////////////////////////////////////////////////////////////////////////
    22642329    //      INVAL ITLB CHECK FSM
     
    30393104    case DCACHE_BIS:
    30403105    {
    3041         //if ( dreq.valid ) m_cost_data_miss_frz++;
    3042 
    30433106        // external cache invalidate request
    30443107        if ( r_tgt_dcache_req )   
     
    32953358    {
    32963359        m_cost_data_tlb_miss_frz++;
     3360        if ( r_dcache_tlb_ptba_read ) m_cost_data_tlb_update_dirty_frz++;
    32973361
    32983362        // external cache invalidate request
     
    33493413                        r_dcache_tlb_ll_dirty_req = true;
    33503414                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3351                         m_cpt_data_tlb_update_dirty++;
    3352                         m_cost_data_tlb_update_dirty_frz++;
    33533415                    }           
    33543416                    else
     
    35463608    {
    35473609        if ( dreq.valid ) m_cost_data_tlb_miss_frz++;
     3610        if ( r_dcache_tlb_ptba_read ) m_cost_data_tlb_update_dirty_frz++;
    35483611
    35493612        // external cache invalidate request
     
    36053668    {
    36063669        m_cost_data_tlb_miss_frz++;
     3670        if ( r_dcache_tlb_ptba_read ) m_cost_data_tlb_update_dirty_frz++;
    36073671
    36083672        // external cache invalidate request
     
    37003764                        r_dcache_tlb_ll_dirty_req = true;
    37013765                        r_dcache_fsm = DCACHE_LL_DIRTY_WAIT;
    3702                         m_cpt_data_tlb_update_dirty++;
    3703                         m_cost_data_tlb_update_dirty_frz++;
    37043766                    }           
    37053767                    else
     
    37763838                r_dcache_dtlb_cleanup_req = true;
    37773839                r_dcache_dtlb_cleanup_line = victim_index;
    3778                 m_cpt_cc_cleanup_data++;
     3840                //m_cpt_cc_cleanup_data++;
    37793841            }
    37803842            r_dcache_way = way;
     
    41214183            data_t rsp_dtlb_miss;
    41224184            data_t tlb_data_ppn;
    4123             //bool write_hit = false;
    41244185            paddr_t  victim_index = 0;
    41254186            size_t way = 0;
     
    42514312                r_dcache_dtlb_cleanup_req = true;
    42524313                r_dcache_dtlb_cleanup_line = victim_index;
    4253                 m_cpt_cc_cleanup_data++;
     4314                //m_cpt_cc_cleanup_data++;
    42544315            }
    42554316            r_dcache_way = way;
     
    44364497            if ( dcache_hit_t )
    44374498            {
    4438                 r_dcache_cleanup_req = r_dcache.inval(dpaddr, &way, &set);
     4499                bool dcache_cleanup_req = r_dcache.inval(dpaddr, &way, &set);
     4500                r_dcache_cleanup_req = dcache_cleanup_req;
    44394501                r_dcache_cleanup_line = dpaddr >> (uint32_log2(m_dcache_words)+2);
    4440                 m_cpt_cc_cleanup_data++;
     4502                if (dcache_cleanup_req) m_cpt_cc_cleanup_data++;
    44414503               
    44424504                if ( r_dcache_in_itlb[way*m_dcache_sets+set] || r_dcache_in_dtlb[way*m_dcache_sets+set] )
     
    44784540        if ( !r_dcache_cleanup_req )
    44794541        {
    4480             r_dcache_cleanup_req = r_dcache.inval(dpaddr, &way, &set);
     4542            bool dcache_cleanup_req = r_dcache.inval(dpaddr, &way, &set);
     4543            r_dcache_cleanup_req = dcache_cleanup_req;
    44814544            r_dcache_cleanup_line = dpaddr >> (uint32_log2(m_dcache_words)+2);
    4482             m_cpt_cc_cleanup_data++;
     4545            if (dcache_cleanup_req) m_cpt_cc_cleanup_data++;
    44834546           
    44844547            if ( r_dcache_in_itlb[way*m_dcache_sets+set] || r_dcache_in_dtlb[way*m_dcache_sets+set] )
     
    50555118        }
    50565119
     5120        if ( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) ||( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) || ( r_dcache_fsm_save == DCACHE_ITLB_LL_WAIT ) || ( r_dcache_fsm_save == DCACHE_ITLB_SC_WAIT ) )       
     5121        {
     5122            m_cost_ins_tlb_occup_cache_frz++;
     5123        }
     5124
    50575125        // DCACHE_TLB1_LL_WAIT  DCACHE_TLB1_SC_WAIT  DCACHE_LL_DIRTY_WAIT  DCACHE_WRITE_DIRTY DCACHE_ITLB_LL_WAIT  DCACHE_ITLB_SC_WAIT
    50585126        // DCACHE_TLB2_LL_WAIT  DCACHE_TLB2_SC_WAIT  DCACHE_SC_DIRTY_WAIT
     
    50615129           ( (r_dcache_paddr_save.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))))
    50625130        || (( ( r_dcache_fsm_save == DCACHE_TLB1_READ )      || ( r_dcache_fsm_save == DCACHE_TLB2_READ )      ||
    5063              ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT ) || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT ) /*||
    5064              ( r_dcache_fsm_save == DCACHE_TLB1_UPDT )      || ( r_dcache_fsm_save == DCACHE_TLB2_UPDT )      ||
    5065              ( r_dcache_fsm_save == DCACHE_TLB1_LL_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_LL_WAIT )   ||
    5066              ( r_dcache_fsm_save == DCACHE_TLB1_SC_WAIT )   || ( r_dcache_fsm_save == DCACHE_TLB2_SC_WAIT )   ||
    5067              ( r_dcache_fsm_save == DCACHE_LL_DIRTY_WAIT )  || ( r_dcache_fsm_save == DCACHE_SC_DIRTY_WAIT )  ||
    5068              ( r_dcache_fsm_save == DCACHE_WRITE_DIRTY )*/ ) &&
     5131             ( r_dcache_fsm_save == DCACHE_TLB1_READ_UPDT ) || ( r_dcache_fsm_save == DCACHE_TLB2_READ_UPDT ) ) &&
    50695132           ( (r_dcache_tlb_paddr.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) )
    5070         || (( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) /*|| ( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) ||
    5071              ( r_dcache_fsm_save == DCACHE_ITLB_LL_WAIT ) || ( r_dcache_fsm_save == DCACHE_ITLB_SC_WAIT )*/ ) &&
     5133        || (( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) ) &&
    50725134           ( (r_icache_paddr_save.read() & ~((m_dcache_words<<2)-1)) == (r_tgt_addr.read() & ~((m_dcache_words<<2)-1))) ) )
    50735135        {
     
    51585220        }
    51595221
     5222        if ( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) ||( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) || ( r_dcache_fsm_save == DCACHE_ITLB_LL_WAIT ) || ( r_dcache_fsm_save == DCACHE_ITLB_SC_WAIT ) )       
     5223        {
     5224            m_cost_ins_tlb_occup_cache_frz++;
     5225        }
     5226
    51605227        m_cpt_dcache_dir_write++;
    51615228        m_cpt_dcache_data_write++;
     
    51885255            m_cost_data_tlb_miss_frz++;
    51895256        }
     5257        if ( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) ||( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) || ( r_dcache_fsm_save == DCACHE_ITLB_LL_WAIT ) || ( r_dcache_fsm_save == DCACHE_ITLB_SC_WAIT ) )       
     5258        {
     5259            m_cost_ins_tlb_occup_cache_frz++;
     5260        }
    51905261
    51915262        r_tgt_dcache_rsp = r_dcache.inval(r_tgt_addr.read());
     
    52105281        {
    52115282            m_cost_data_tlb_miss_frz++;
     5283        }
     5284        if ( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) ||( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) || ( r_dcache_fsm_save == DCACHE_ITLB_LL_WAIT ) || ( r_dcache_fsm_save == DCACHE_ITLB_SC_WAIT ) )       
     5285        {
     5286            m_cost_ins_tlb_occup_cache_frz++;
    52125287        }
    52135288
     
    52415316        {
    52425317            m_cost_data_tlb_miss_frz++;
     5318        }
     5319        if ( ( r_dcache_fsm_save == DCACHE_ITLB_READ ) ||( r_dcache_fsm_save == DCACHE_ITLB_UPDT ) || ( r_dcache_fsm_save == DCACHE_ITLB_LL_WAIT ) || ( r_dcache_fsm_save == DCACHE_ITLB_SC_WAIT ) )       
     5320        {
     5321            m_cost_ins_tlb_occup_cache_frz++;
    52435322        }
    52445323
     
    52815360    case DCACHE_ITLB_CLEANUP:
    52825361    {
    5283         //if ( dreq.valid ) m_cost_data_miss_frz++;
    5284 
    52855362        r_dcache.setinbit(((paddr_t)r_dcache_itlb_cleanup_line.read()<<(uint32_log2(m_dcache_words)+2)), r_dcache_in_itlb, false);
    52865363        r_dcache_itlb_cleanup_req = false;
     
    57625839        {
    57635840            r_dcache_tlb_sc_fail = true;
    5764             //r_dcache_tlb_ll_acc_req = true;
    57655841        }
    57665842        r_dcache_tlb_sc_acc_req = false;
     
    58035879        {
    58045880            r_dcache_tlb_sc_fail = true;
    5805             //r_dcache_tlb_ll_dirty_req = true;
    58065881        }
    58075882        r_dcache_tlb_sc_dirty_req = false;
     
    58705945    } // end switch r_vci_rsp_fsm
    58715946
    5872 // add for blocage
    5873     switch (r_cleanup_fsm) {
    5874 
    5875     case CLEANUP_IDLE: 
    5876     {
    5877         if ( p_vci_ini_c.cmdack.read() )
    5878         {               
    5879             if (r_dcache_cleanup_req)
    5880             {
    5881                 r_cleanup_fsm = CLEANUP_DATA;
     5947    //////////////////////////////////////////////////////////////////////////
     5948    //      CLEANUP CMD FSM
     5949    //
     5950    // This FSM is synchronized with the CLEANUP RSP FSM, as both FSMs exit the
     5951    // IDLE state simultaneously.
     5952    //////////////////////////////////////////////////////////////////////////
     5953
     5954    switch (r_cleanup_cmd_fsm) {
     5955   
     5956    case CLEANUP_CMD_IDLE:
     5957        if (r_cleanup_rsp_fsm != CLEANUP_RSP_IDLE)
     5958            break;
     5959
     5960        if (r_dcache_cleanup_req)
     5961        {
     5962            r_cleanup_cmd_fsm = CLEANUP_CMD_DATA;
    58825963                m_cpt_dcleanup_transaction++;
    5883             }
    5884             else if (r_icache_cleanup_req)
    5885             {
    5886                 r_cleanup_fsm = CLEANUP_INS;
     5964        }
     5965        else if (r_icache_cleanup_req)
     5966        {
     5967            r_cleanup_cmd_fsm = CLEANUP_CMD_INS;
    58875968                m_cpt_icleanup_transaction++;
    5888             }
    5889         }
    5890         break;
    5891     }
    5892     case CLEANUP_DATA:
    5893     {
    5894         m_cost_dcleanup_transaction++;
     5969        }
     5970        break;
     5971
     5972    default:
     5973        if ( p_vci_ini_c.cmdack.read() )
     5974        { 
     5975            r_cleanup_cmd_fsm = CLEANUP_CMD_IDLE;
     5976        }
     5977        break;
     5978
     5979    } // end  switch r_vci_cmd_fsm
     5980
     5981    //////////////////////////////////////////////////////////////////////////
     5982    //      CLEANUP RSP FSM
     5983    //
     5984    // This FSM is synchronized with the CLEANUP CMD FSM, as both FSMs exit the
     5985    // IDLE state simultaneously.
     5986    //////////////////////////////////////////////////////////////////////////
     5987
     5988    switch (r_cleanup_rsp_fsm) {
     5989
     5990    case CLEANUP_RSP_IDLE:     
     5991    {
     5992        assert(!p_vci_ini_c.rspval.read() && "Unexpected response" );
     5993
     5994        if (r_cleanup_cmd_fsm != CLEANUP_CMD_IDLE)
     5995            break;
     5996
     5997        if (r_dcache_cleanup_req)
     5998        {
     5999            r_cleanup_rsp_fsm = CLEANUP_RSP_DATA;
     6000        }
     6001        else if (r_icache_cleanup_req)
     6002        {
     6003            r_cleanup_rsp_fsm = CLEANUP_RSP_INS;
     6004        }
     6005        break;
     6006    }
     6007    case CLEANUP_RSP_DATA:
     6008    {
     6009            m_cost_dcleanup_transaction++;
     6010        if ( ! p_vci_ini_c.rspval.read() )
     6011            break;
     6012        assert( p_vci_ini_c.reop.read() &&
     6013                "illegal VCI response packet for dcache cleanup");
     6014        assert( (p_vci_ini_c.rerror.read() == vci_param::ERR_NORMAL) &&
     6015                "error in response packet for dcache cleanup");   
     6016
     6017        r_dcache_cleanup_req = false;
     6018        r_cleanup_rsp_fsm = CLEANUP_RSP_IDLE;   
     6019        break;             
     6020    }
     6021    case CLEANUP_RSP_INS:
     6022    {
     6023            m_cost_icleanup_transaction++;
    58956024        if ( ! p_vci_ini_c.rspval.read() )
    58966025            break;
     
    59006029                "error in response packet for icache cleanup");   
    59016030
    5902         r_dcache_cleanup_req = false;
    5903         r_cleanup_fsm = CLEANUP_IDLE;   
    5904         break;             
    5905     }
    5906     case CLEANUP_INS:
    5907     {
    5908         m_cost_icleanup_transaction++;
    5909         if ( ! p_vci_ini_c.rspval.read() )
    5910             break;
    5911         assert( p_vci_ini_c.reop.read() &&
    5912                 "illegal VCI response packet for icache cleanup");
    5913         assert( (p_vci_ini_c.rerror.read() == vci_param::ERR_NORMAL) &&
    5914                 "error in response packet for icache cleanup");   
    5915 
    59166031        r_icache_cleanup_req = false;
    5917         r_cleanup_fsm = CLEANUP_IDLE;   
     6032        r_cleanup_rsp_fsm = CLEANUP_RSP_IDLE;   
    59186033        break;   
    59196034    }
     
    61116226    } // end switch r_vci_cmd_fsm
    61126227
    6113 
    6114     // VCI initiator command
    6115     switch (r_cleanup_fsm) {
    6116 
    6117     case CLEANUP_IDLE:
    6118         p_vci_ini_c.cmdval  = r_icache_cleanup_req || r_dcache_cleanup_req;
    6119         p_vci_ini_c.rspack  = false;
    6120         if ( r_icache_cleanup_req )
    6121         {
    6122             p_vci_ini_c.address = r_icache_cleanup_line.read() * (m_icache_words<<2);
    6123             p_vci_ini_c.trdid  = 1; // cleanup instruction
    6124         }
    6125         else
    6126         {           
    6127             p_vci_ini_c.address = r_dcache_cleanup_line.read() * (m_dcache_words<<2);
    6128             p_vci_ini_c.trdid  = 0; // cleanup data
    6129         }
    6130         p_vci_ini_c.wdata  = 0;
    6131         p_vci_ini_c.be     = 0;
    6132         p_vci_ini_c.plen   = 4;
    6133         p_vci_ini_c.cmd    = vci_param::CMD_WRITE;
    6134         p_vci_ini_c.pktid  = 0;
    6135         p_vci_ini_c.srcid  = m_srcid_c;
    6136         p_vci_ini_c.cons   = false;
    6137         p_vci_ini_c.wrap   = false;
    6138         p_vci_ini_c.contig = false;
    6139         p_vci_ini_c.clen   = 0;
    6140         p_vci_ini_c.cfixed = false;
    6141         p_vci_ini_c.eop    = true;
    6142         break;
    6143 
    6144     case CLEANUP_DATA:
    6145     case CLEANUP_INS:
     6228    p_vci_ini_c.rspack = true;
     6229
     6230    switch (r_cleanup_cmd_fsm) {
     6231
     6232    case CLEANUP_CMD_IDLE:
    61466233        p_vci_ini_c.cmdval  = false;
    6147         p_vci_ini_c.rspack  = true;
    61486234        p_vci_ini_c.address = 0;
    61496235        p_vci_ini_c.trdid   = 0;
     
    61626248        break;
    61636249
     6250    case CLEANUP_CMD_DATA:
     6251        p_vci_ini_c.cmdval  = true;
     6252        p_vci_ini_c.address = r_dcache_cleanup_line.read() * (m_dcache_words<<2);
     6253        p_vci_ini_c.trdid  = 0; // data cleanup
     6254        p_vci_ini_c.wdata  = 0;
     6255        p_vci_ini_c.be     = 0;
     6256        p_vci_ini_c.plen   = 4;
     6257        p_vci_ini_c.cmd    = vci_param::CMD_WRITE;
     6258        p_vci_ini_c.pktid  = 0;
     6259        p_vci_ini_c.srcid  = m_srcid_c;
     6260        p_vci_ini_c.cons   = false;
     6261        p_vci_ini_c.wrap   = false;
     6262        p_vci_ini_c.contig = false;
     6263        p_vci_ini_c.clen   = 0;
     6264        p_vci_ini_c.cfixed = false;
     6265        p_vci_ini_c.eop    = true;
     6266        break;
     6267
     6268    case CLEANUP_CMD_INS:
     6269        p_vci_ini_c.cmdval  = true;
     6270        p_vci_ini_c.address = r_icache_cleanup_line.read() * (m_icache_words<<2);
     6271        p_vci_ini_c.trdid  = 1; // ins cleanup
     6272        p_vci_ini_c.wdata  = 0;
     6273        p_vci_ini_c.be     = 0;
     6274        p_vci_ini_c.plen   = 4;
     6275        p_vci_ini_c.cmd    = vci_param::CMD_WRITE;
     6276        p_vci_ini_c.pktid  = 0;
     6277        p_vci_ini_c.srcid  = m_srcid_c;
     6278        p_vci_ini_c.cons   = false;
     6279        p_vci_ini_c.wrap   = false;
     6280        p_vci_ini_c.contig = false;
     6281        p_vci_ini_c.clen   = 0;
     6282        p_vci_ini_c.cfixed = false;
     6283        p_vci_ini_c.eop    = true;
     6284        break;
    61646285      } // end switch r_vci_cmd_cleanup_fsm
    6165 
    61666286
    61676287    // VCI_TGT
Note: See TracChangeset for help on using the changeset viewer.