Ignore:
Timestamp:
Jun 25, 2014, 10:49:08 PM (11 years ago)
Author:
cfuguet
Message:

vci_cc_vcache_wrapper:

  • Adding icache physical address extension register.
File:
1 edited

Legend:

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

    r711 r721  
    8585        "DCACHE_XTN_IC_FLUSH",
    8686        "DCACHE_XTN_IC_INVAL_PA",
     87        "DCACHE_XTN_IC_PADDR_EXT",
    8788        "DCACHE_XTN_IT_INVAL",
    8889        "DCACHE_XTN_DC_FLUSH",
     
    244245      m_debug_start_cycle( debug_start_cycle ),
    245246      m_debug_ok( debug_ok ),
     247      m_dcache_paddr_ext_reset(0),
     248      m_icache_paddr_ext_reset(0),
    246249
    247250      r_mmu_ptpr("r_mmu_ptpr"),
     
    740743
    741744        // reset data physical address extension
    742         r_dcache_paddr_ext = 0;
     745        r_dcache_paddr_ext = m_dcache_paddr_ext_reset;
     746
     747        // reset inst physical address extension
     748        r_icache_paddr_ext = m_icache_paddr_ext_reset;
    743749
    744750        // reset dcache directory extension
     
    10551061
    10561062        // XTN requests sent by DCACHE FSM
    1057         // These request are not executed in this IDLE state, because
    1058         // they require access to icache or itlb, that are already accessed
     1063        // These request are not executed in this IDLE state (except XTN_INST_PADDR_EXT),
     1064        // because they require access to icache or itlb, that are already accessed
    10591065        if ( r_dcache_xtn_req.read() )
    10601066        {
     
    10781084            else if ( (int)r_dcache_xtn_opcode.read() == (int)iss_t::XTN_MMU_ICACHE_PA_INV)
    10791085            {
    1080                         if (sizeof(paddr_t) <= 32)
     1086                if (sizeof(paddr_t) <= 32)
    10811087                {
    1082                                 assert(r_mmu_word_hi.read() == 0 &&
    1083                                 "illegal XTN request in ICACHE: high bits should be 0 for 32bit paddr");
    1084                                 r_icache_vci_paddr = (paddr_t)r_mmu_word_lo.read();
     1088                    assert(r_mmu_word_hi.read() == 0 &&
     1089                    "illegal XTN request in ICACHE: high bits should be 0 for 32bit paddr");
     1090                    r_icache_vci_paddr = (paddr_t)r_mmu_word_lo.read();
    10851091                }
    10861092                else
    10871093                {
    1088                                 r_icache_vci_paddr = (paddr_t)r_mmu_word_hi.read() << 32 |
    1089                                                          (paddr_t)r_mmu_word_lo.read();
    1090                         }
    1091                 r_icache_fsm         = ICACHE_XTN_CACHE_INVAL_PA;
     1094                    r_icache_vci_paddr = (paddr_t)r_mmu_word_hi.read() << 32 |
     1095                                         (paddr_t)r_mmu_word_lo.read();
     1096                }
     1097                r_icache_fsm = ICACHE_XTN_CACHE_INVAL_PA;
     1098            }
     1099            else if ( (int)r_dcache_xtn_opcode.read() == (int)iss_t::XTN_INST_PADDR_EXT)
     1100            {
     1101                r_icache_paddr_ext = r_dcache_save_wdata.read();
     1102                r_dcache_xtn_req   = false;
    10921103            }
    10931104            else
     
    11281139                                            &paddr,
    11291140                                            &tlb_flags,
    1130                                             &tlb_nline, // unused
    1131                                             &tlb_way,   // unused
    1132                                             &tlb_set ); // unused
     1141                                            &tlb_nline, // unused
     1142                                            &tlb_way,   // unused
     1143                                            &tlb_set ); // unused
    11331144            }
    11341145            else
    11351146            {
    1136                 paddr = (paddr_t)m_ireq.addr;
     1147                if (vci_param::N > 32)
     1148                {
     1149                    paddr =  (paddr_t)m_ireq.addr |
     1150                            ((paddr_t)r_icache_paddr_ext.read() << 32);
     1151                }
     1152                else
     1153                {
     1154                    paddr = (paddr_t)m_ireq.addr;
     1155                }
    11371156            }
    11381157
     
    24802499                        break;
    24812500
     2501                    case iss_t::XTN_INST_PADDR_EXT:
     2502                        m_drsp.rdata = r_icache_paddr_ext.read();
     2503                        m_drsp.valid = true;
     2504                        m_drsp.error = false;
     2505                        break;
     2506
    24822507                    default:
    24832508                        r_mmu_detr = MMU_READ_UNDEFINED_XTN;
     
    26082633                    break;
    26092634
    2610                         case iss_t::XTN_ICACHE_PREFETCH:                // not implemented : no action
    2611                         case iss_t::XTN_DCACHE_PREFETCH:                // not implemented : no action
     2635                    case iss_t::XTN_INST_PADDR_EXT:     // no cache or tlb access
     2636                        r_dcache_xtn_req = true;
     2637                        r_dcache_fsm     = DCACHE_XTN_IC_PADDR_EXT;
     2638                    break;
     2639
     2640                    case iss_t::XTN_ICACHE_PREFETCH:        // not implemented : no action
     2641                    case iss_t::XTN_DCACHE_PREFETCH:        // not implemented : no action
    26122642                        m_drsp.valid     = true;
    26132643                        r_dcache_fsm     = DCACHE_IDLE;
    2614                             break;
     2644                    break;
    26152645
    26162646                    case iss_t::XTN_DEBUG_MASK:     // debug mask
     
    37263756    }
    37273757    ////////////////////////
    3728     case DCACHE_XTN_IC_FLUSH:           // Waiting completion of an XTN request to the ICACHE FSM
    3729     case DCACHE_XTN_IC_INVAL_VA:        // Caution : the itlb miss requests must be taken
    3730     case DCACHE_XTN_IC_INVAL_PA:        // because the XTN_ICACHE_INVAL request to icache
    3731     case DCACHE_XTN_IT_INVAL:           // can generate an itlb miss,
    3732                                     // and because it can exist a simultaneous ITLB miss
     3758    case DCACHE_XTN_IC_FLUSH:       // Waiting completion of an XTN request to the ICACHE FSM
     3759    case DCACHE_XTN_IC_INVAL_VA:    // Caution : the itlb miss requests must be taken
     3760    case DCACHE_XTN_IC_INVAL_PA:    // because the XTN_ICACHE_INVAL request to icache
     3761    case DCACHE_XTN_IC_PADDR_EXT:   // can generate an itlb miss,
     3762    case DCACHE_XTN_IT_INVAL:       // and because it can exist a simultaneous ITLB miss
     3763
    37333764    {
    37343765        // coherence clack request (from DSPIN CLACK)
Note: See TracChangeset for help on using the changeset viewer.