Changeset 120 for trunk/modules


Ignore:
Timestamp:
Dec 16, 2010, 1:11:49 AM (14 years ago)
Author:
gao
Message:

Separated cleanup from the vci_fsm to avoid deadlock

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

    r119 r120  
    151151        CMD_DATA_MISS,              // 0c
    152152        CMD_DATA_WRITE,             // 0d
    153         CMD_INS_CLEANUP,            // 0e
    154         CMD_DATA_CLEANUP,           // 0f
    155153    };
    156154
     
    170168        RSP_DATA_UNC,               // 0c
    171169        RSP_DATA_WRITE,             // 0d
    172         RSP_INS_CLEANUP,            // 0e
    173         RSP_DATA_CLEANUP,           // 0f
     170    };
     171    enum cleanup_fsm_state_e {
     172        CLEANUP_IDLE,               // 00
     173        CLEANUP_DATA,               // 01
     174        CLEANUP_INS,                // 02
    174175    };
    175176
     
    384385    data_t                  *r_dcache_miss_buf; 
    385386
     387    sc_signal<int>          r_cleanup_fsm;
     388
    386389    // VCI_TGT FSM REGISTERS
    387390    data_t                  *r_tgt_buf;
  • trunk/modules/vci_cc_vcache_wrapper2_v1/caba/source/src/vci_cc_vcache_wrapper2_v1.cpp

    r119 r120  
    3434//#define SOCLIB_MODULE_DEBUG
    3535//#define EVALUATION_CACHE
     36
    3637#ifdef SOCLIB_MODULE_DEBUG
    3738namespace {
     
    122123        "CMD_DATA_MISS",   
    123124        "CMD_DATA_WRITE",
    124         "CMD_INS_CLEANUP",   
    125         "CMD_DATA_CLEANUP",     
    126125    };
    127126const char *rsp_fsm_state_str[] = {
     
    140139        "RSP_DATA_UNC",             
    141140        "RSP_DATA_WRITE",     
    142         "RSP_INS_CLEANUP",   
    143         "RSP_DATA_CLEANUP",       
     141    };
     142const char *cleanup_fsm_state_str[] = {
     143        "CLEANUP_IDLE",           
     144        "CLEANUP_DATA",   
     145        "CLEANUP_INS",     
    144146    };
    145147const char *tgt_fsm_state_str[] = {
     
    281283      r_vci_rsp_data_error("r_vci_rsp_data_error"),
    282284      r_dcache_tlb_sc_fail("r_dcache_tlb_sc_fail"),
     285
     286      r_cleanup_fsm("r_cleanup_fsm"),
    283287
    284288      r_vci_tgt_fsm("r_vci_tgt_fsm"),
     
    424428        r_inval_itlb_fsm = INVAL_ITLB_IDLE;         
    425429        r_inval_dtlb_fsm = INVAL_DTLB_IDLE;         
     430        r_cleanup_fsm = CLEANUP_IDLE;
    426431
    427432        // write buffer & caches
     
    624629          << " cmd fsm: " << cmd_fsm_state_str[r_vci_cmd_fsm]
    625630          << " rsp fsm: " << rsp_fsm_state_str[r_vci_rsp_fsm]
     631          << " cleanup fsm: " << cleanup_fsm_state_str[r_cleanup_fsm]
    626632          << " inval itlb fsm: " << inval_itlb_fsm_state_str[r_inval_itlb_fsm]
    627633          << " inval dtlb fsm: " << inval_dtlb_fsm_state_str[r_inval_dtlb_fsm] << std::endl;
     
    755761                    r_vci_tgt_fsm = TGT_REQ_ICACHE;
    756762                    m_cpt_cc_inval_ins++ ;
    757 
    758763                }
    759764            } // end if address   
     
    12601265                if ( !r_dcache_rsp_itlb_error ) // vci response ok
    12611266                { 
    1262                     if ( !(r_dcache_rsp_itlb_miss >> PTE_V_SHIFT) ) // unmapped
     1267                    if (r_itlb_acc_redo_req)
     1268                    {
     1269                        r_itlb_acc_redo_req = false;
     1270                        r_itlb_read_dcache_req = true;
     1271                        //r_icache_fsm = ICACHE_IDLE; 
     1272                    }
     1273                    else if ( !(r_dcache_rsp_itlb_miss >> PTE_V_SHIFT) ) // unmapped
    12631274                    {
    12641275                        r_icache_ptba_ok    = false;   
     
    13341345                else
    13351346                {
     1347                    if ( r_itlb_acc_redo_req ) r_itlb_acc_redo_req = false;
    13361348                    r_icache_inval_tlb_rsp = false;
    13371349                    r_icache_fsm = ICACHE_IDLE; 
     
    15041516                if ( !r_dcache_rsp_itlb_error ) // VCI response ok       
    15051517                {
    1506                     if ( !(r_dcache_rsp_itlb_miss >> PTE_V_SHIFT) ) // unmapped
     1518                    if (r_itlb_acc_redo_req)
     1519                    {
     1520                        r_itlb_acc_redo_req = false;
     1521                        r_itlb_read_dcache_req = true;
     1522                        //r_icache_fsm = ICACHE_IDLE; 
     1523                    }
     1524                    else if ( !(r_dcache_rsp_itlb_miss >> PTE_V_SHIFT) ) // unmapped
    15071525                    {
    15081526                        r_icache_error_type = MMU_READ_PT2_UNMAPPED; 
     
    15641582                else
    15651583                {
     1584                    if ( r_itlb_acc_redo_req ) r_itlb_acc_redo_req = false;
    15661585                    r_icache_inval_tlb_rsp = false;
    15671586                    r_icache_fsm = ICACHE_IDLE; 
     
    46984717
    46994718                if (r_dcache_inval_rsp) r_dcache_inval_rsp = false;
    4700                 break;
    4701             }
    4702 
    4703             if ( r_dcache_inval_rsp ) // TLB miss response and cache invalidation
     4719            }
     4720            else if ( r_dcache_inval_rsp ) // TLB miss response and cache invalidation
    47044721            {
    47054722                if ( r_dcache_cleanup_req ) break;
     
    47094726                r_dcache_fsm = DCACHE_IDLE;
    47104727                r_dcache_inval_rsp = false;
    4711                 break;
     4728                r_itlb_read_dcache_req = false;
     4729                r_itlb_acc_redo_req = true;
    47124730            }
    4713 
    4714             r_dcache_fsm = DCACHE_ITLB_UPDT;
     4731            else
     4732            {
     4733                r_dcache_fsm = DCACHE_ITLB_UPDT;
     4734            }
    47154735        }
    47164736        break;         
     
    47454765                r_dcache_fsm = DCACHE_IDLE;
    47464766                r_dcache_inval_rsp = false;
     4767                r_itlb_read_dcache_req = false;
     4768                r_itlb_acc_redo_req = true;
    47474769                break;
    47484770            }           
     
    52735295
    52745296        r_vci_cmd_cpt = 0;
    5275 
    5276         if (r_icache_cleanup_req)
    5277         {
    5278             r_vci_cmd_fsm = CMD_INS_CLEANUP;
    5279             m_cpt_icleanup_transaction++;
    5280         }
    5281         else if (r_dcache_cleanup_req)
    5282         {
    5283             r_vci_cmd_fsm = CMD_DATA_CLEANUP;
    5284             m_cpt_dcleanup_transaction++;
    5285         }
    5286         else if (r_dcache_itlb_read_req)           
     5297        if (r_dcache_itlb_read_req)           
    52875298        {           
    52885299            r_vci_cmd_fsm = CMD_ITLB_READ;
     
    53675378        break;
    53685379
    5369     case CMD_INS_CLEANUP:
    5370     case CMD_DATA_CLEANUP:
    5371         if ( p_vci_ini_c.cmdack.read() )
    5372         {
    5373             r_vci_cmd_fsm = CMD_IDLE;
    5374         }
    5375         break;
    5376 
    53775380    default:
    53785381        if ( p_vci_ini_rw.cmdack.read() )
     
    53945397
    53955398    case RSP_IDLE:
    5396         assert( !p_vci_ini_rw.rspval.read() && !p_vci_ini_c.rspval.read() && "Unexpected response" );
     5399        assert( !p_vci_ini_rw.rspval.read() && "Unexpected response" );
    53975400
    53985401        if (r_vci_cmd_fsm != CMD_IDLE)
     
    54005403
    54015404        r_vci_rsp_cpt = 0;
    5402         if (r_icache_cleanup_req)            // ICACHE cleanup response
    5403         {
    5404             r_vci_rsp_fsm = RSP_INS_CLEANUP;
    5405         }
    5406         else if (r_dcache_cleanup_req)       // DCACHE cleanup response
    5407         {
    5408             r_vci_rsp_fsm = RSP_DATA_CLEANUP;
    5409         }
    5410         else if (r_dcache_itlb_read_req)          // ITLB miss response
     5405        if (r_dcache_itlb_read_req)          // ITLB miss response
    54115406        {           
    54125407            r_vci_rsp_fsm = RSP_ITLB_READ;
     
    57335728        }
    57345729        break;
    5735 
    5736     case RSP_INS_CLEANUP:
    5737     case RSP_DATA_CLEANUP:
    5738         if ( r_vci_rsp_fsm == RSP_INS_CLEANUP )
    5739         {
    5740             m_cost_icleanup_transaction++;
    5741         }
    5742         else
    5743         {                                   
    5744             m_cost_dcleanup_transaction++;
    5745         }
    5746 
     5730    } // end switch r_vci_rsp_fsm
     5731
     5732// add for blocage
     5733    switch (r_cleanup_fsm) {
     5734
     5735    case CLEANUP_IDLE: 
     5736    {
     5737        if ( p_vci_ini_c.cmdack.read() )
     5738        {               
     5739            if (r_dcache_cleanup_req)
     5740            {
     5741                r_cleanup_fsm = CLEANUP_DATA;
     5742                m_cpt_dcleanup_transaction++;
     5743            }
     5744            else if (r_icache_cleanup_req)
     5745            {
     5746                r_cleanup_fsm = CLEANUP_INS;
     5747                m_cpt_icleanup_transaction++;
     5748            }
     5749        }
     5750        break;
     5751    }
     5752    case CLEANUP_DATA:
     5753    {
     5754        m_cost_dcleanup_transaction++;
    57475755        if ( ! p_vci_ini_c.rspval.read() )
    57485756            break;
     
    57505758                "illegal VCI response packet for icache cleanup");
    57515759        assert( (p_vci_ini_c.rerror.read() == vci_param::ERR_NORMAL) &&
    5752                 "error in response packet for icache cleanup");
    5753 
    5754         if ( r_vci_rsp_fsm == RSP_INS_CLEANUP )
    5755         {
    5756             r_icache_cleanup_req = false;
    5757         }
    5758         else
    5759         {                                   
    5760             r_dcache_cleanup_req = false;
    5761         }
    5762         r_vci_rsp_fsm = RSP_IDLE;
    5763         break;
    5764 
    5765     } // end switch r_vci_rsp_fsm
     5760                "error in response packet for icache cleanup");   
     5761
     5762        r_dcache_cleanup_req = false;
     5763        r_cleanup_fsm = CLEANUP_IDLE;   
     5764        break;             
     5765    }
     5766    case CLEANUP_INS:
     5767    {
     5768        m_cost_icleanup_transaction++;
     5769        if ( ! p_vci_ini_c.rspval.read() )
     5770            break;
     5771        assert( p_vci_ini_c.reop.read() &&
     5772                "illegal VCI response packet for icache cleanup");
     5773        assert( (p_vci_ini_c.rerror.read() == vci_param::ERR_NORMAL) &&
     5774                "error in response packet for icache cleanup");   
     5775
     5776        r_icache_cleanup_req = false;
     5777        r_cleanup_fsm = CLEANUP_IDLE;   
     5778        break;   
     5779    }
     5780    } // end  switch r_cleanup_fsm
     5781
    57665782} // end transition()
    57675783
     
    57715787{
    57725788    // VCI initiator response
    5773 
    57745789    p_vci_ini_rw.rspack = true;
    5775     p_vci_ini_c.rspack = true;
    57765790
    57775791    // VCI initiator command
    5778 
    57795792    p_vci_ini_rw.pktid  = 0;
    57805793    p_vci_ini_rw.srcid  = m_srcid_rw;
     
    57845797    p_vci_ini_rw.clen   = 0;
    57855798    p_vci_ini_rw.cfixed = false;
    5786 
    5787     p_vci_ini_c.cmdval  = false;
    5788     p_vci_ini_c.address = 0;
    5789     p_vci_ini_c.wdata   = 0;
    5790     p_vci_ini_c.be      = 0;
    5791     p_vci_ini_c.plen    = 0;
    5792     p_vci_ini_c.cmd     = vci_param::CMD_NOP;
    5793     p_vci_ini_c.trdid   = 0;
    5794     p_vci_ini_c.pktid   = 0;
    5795     p_vci_ini_c.srcid   = 0;
    5796     p_vci_ini_c.cons    = false;
    5797     p_vci_ini_c.wrap    = false;
    5798     p_vci_ini_c.contig  = false;
    5799     p_vci_ini_c.clen    = 0;
    5800     p_vci_ini_c.cfixed  = false;
    5801     p_vci_ini_c.eop     = false;
    58025799
    58035800    switch (r_vci_cmd_fsm) {
     
    59725969        p_vci_ini_rw.eop     = true;
    59735970        break;
    5974 
    5975     case CMD_INS_CLEANUP:
    5976     case CMD_DATA_CLEANUP:
    5977         p_vci_ini_rw.cmdval = false;
    5978         p_vci_ini_rw.address = 0;
    5979         p_vci_ini_rw.wdata  = 0;
    5980         p_vci_ini_rw.be     = 0;
    5981         p_vci_ini_rw.trdid  = 0;
    5982         p_vci_ini_rw.plen   = 0;
    5983         p_vci_ini_rw.cmd    = vci_param::CMD_NOP;
    5984         p_vci_ini_rw.eop    = false;
    5985 
    5986         p_vci_ini_c.cmdval  = true;
    5987         if ( r_vci_cmd_fsm == CMD_INS_CLEANUP )
     5971    } // end switch r_vci_cmd_fsm
     5972
     5973
     5974    // VCI initiator command
     5975    switch (r_cleanup_fsm) {
     5976
     5977    case CLEANUP_IDLE:
     5978        p_vci_ini_c.cmdval  = r_icache_cleanup_req || r_dcache_cleanup_req;
     5979        p_vci_ini_c.rspack  = false;
     5980        if ( r_icache_cleanup_req )
    59885981        {
    59895982            p_vci_ini_c.address = r_icache_cleanup_line.read() * (m_icache_words<<2);
     
    60065999        p_vci_ini_c.clen   = 0;
    60076000        p_vci_ini_c.cfixed = false;
    6008         p_vci_ini_c.eop = true;
    6009         break;
    6010 
    6011     } // end switch r_vci_cmd_fsm
     6001        p_vci_ini_c.eop    = true;
     6002        break;
     6003
     6004    case CLEANUP_DATA:
     6005    case CLEANUP_INS:
     6006        p_vci_ini_c.cmdval  = false;
     6007        p_vci_ini_c.rspack  = true;
     6008        p_vci_ini_c.address = 0;
     6009        p_vci_ini_c.trdid   = 0;
     6010        p_vci_ini_c.wdata   = 0;
     6011        p_vci_ini_c.be      = 0;
     6012        p_vci_ini_c.plen    = 0;
     6013        p_vci_ini_c.cmd     = vci_param::CMD_NOP;
     6014        p_vci_ini_c.pktid   = 0;
     6015        p_vci_ini_c.srcid   = m_srcid_c;
     6016        p_vci_ini_c.cons    = false;
     6017        p_vci_ini_c.wrap    = false;
     6018        p_vci_ini_c.contig  = false;
     6019        p_vci_ini_c.clen    = 0;
     6020        p_vci_ini_c.cfixed  = false;
     6021        p_vci_ini_c.eop     = false;
     6022        break;
     6023
     6024      } // end switch r_vci_cmd_cleanup_fsm
     6025
    60126026
    60136027    // VCI_TGT
     
    60686082             << " p_vci_ini_rw.cmdval: " << p_vci_ini_rw.cmdval
    60696083             << " p_vci_ini_rw.address: " << p_vci_ini_rw.address
     6084             << " p_vci_ini_rw.srcid: " << p_vci_ini_rw.srcid
    60706085             << " p_vci_ini_rw.wdata: " << p_vci_ini_rw.wdata
    60716086             << " p_vci_ini_rw.cmd: " << p_vci_ini_rw.cmd
Note: See TracChangeset for help on using the changeset viewer.