| 1 | /* -*- c++ -*- | 
|---|
| 2 |  * | 
|---|
| 3 |  * File : vci_cc_vcache_wrapper.h | 
|---|
| 4 |  * Copyright (c) UPMC, Lip6, SoC | 
|---|
| 5 |  * Authors : Alain GREINER, Yang GAO | 
|---|
| 6 |  * Date : 27/11/2011 | 
|---|
| 7 |  * | 
|---|
| 8 |  * SOCLIB_LGPL_HEADER_BEGIN | 
|---|
| 9 |  * | 
|---|
| 10 |  * This file is part of SoCLib, GNU LGPLv2.1. | 
|---|
| 11 |  * | 
|---|
| 12 |  * SoCLib is free software; you can redistribute it and/or modify it | 
|---|
| 13 |  * under the terms of the GNU Lesser General Public License as published | 
|---|
| 14 |  * by the Free Software Foundation; version 2.1 of the License. | 
|---|
| 15 |  * | 
|---|
| 16 |  * SoCLib is distributed in the hope that it will be useful, but | 
|---|
| 17 |  * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 18 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|---|
| 19 |  * Lesser General Public License for more details. | 
|---|
| 20 |  * | 
|---|
| 21 |  * You should have received a copy of the GNU Lesser General Public | 
|---|
| 22 |  * License along with SoCLib; if not, write to the Free Software | 
|---|
| 23 |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | 
|---|
| 24 |  * 02110-1301 USA | 
|---|
| 25 |  * | 
|---|
| 26 |  * SOCLIB_LGPL_HEADER_END | 
|---|
| 27 |  * | 
|---|
| 28 |  * Maintainers: cesar.fuguet-tortolero@lip6.fr | 
|---|
| 29 |  *              alexandre.joannou@lip6.fr | 
|---|
| 30 |  */ | 
|---|
| 31 |  | 
|---|
| 32 | #ifndef SOCLIB_CABA_VCI_CC_VCACHE_WRAPPER_H | 
|---|
| 33 | #define SOCLIB_CABA_VCI_CC_VCACHE_WRAPPER_H | 
|---|
| 34 |  | 
|---|
| 35 | #include <inttypes.h> | 
|---|
| 36 | #include <systemc> | 
|---|
| 37 | #include "caba_base_module.h" | 
|---|
| 38 | #include "multi_write_buffer.h" | 
|---|
| 39 | #include "generic_fifo.h" | 
|---|
| 40 | #include "generic_tlb.h" | 
|---|
| 41 | #include "generic_cache.h" | 
|---|
| 42 | #include "vci_initiator.h" | 
|---|
| 43 | #include "dspin_interface.h" | 
|---|
| 44 | #include "dspin_dhccp_param.h" | 
|---|
| 45 | #include "mapping_table.h" | 
|---|
| 46 | #include "static_assert.h" | 
|---|
| 47 | #include "iss2.h" | 
|---|
| 48 |  | 
|---|
| 49 | #define LLSC_TIMEOUT    10000 | 
|---|
| 50 |  | 
|---|
| 51 | namespace soclib { | 
|---|
| 52 | namespace caba { | 
|---|
| 53 |  | 
|---|
| 54 | using namespace sc_core; | 
|---|
| 55 |  | 
|---|
| 56 | //////////////////////////////////////////// | 
|---|
| 57 | template<typename vci_param,  | 
|---|
| 58 |          size_t   dspin_in_width, | 
|---|
| 59 |          size_t   dspin_out_width, | 
|---|
| 60 |          typename iss_t> | 
|---|
| 61 | class VciCcVCacheWrapper | 
|---|
| 62 | //////////////////////////////////////////// | 
|---|
| 63 |     : public soclib::caba::BaseModule | 
|---|
| 64 | { | 
|---|
| 65 |  | 
|---|
| 66 |     typedef typename vci_param::fast_addr_t  paddr_t; | 
|---|
| 67 |  | 
|---|
| 68 |     enum icache_fsm_state_e  | 
|---|
| 69 |     { | 
|---|
| 70 |         ICACHE_IDLE, | 
|---|
| 71 |         // handling XTN processor requests | 
|---|
| 72 |         ICACHE_XTN_TLB_FLUSH, | 
|---|
| 73 |         ICACHE_XTN_CACHE_FLUSH, | 
|---|
| 74 |         ICACHE_XTN_CACHE_FLUSH_GO, | 
|---|
| 75 |         ICACHE_XTN_TLB_INVAL, | 
|---|
| 76 |         ICACHE_XTN_CACHE_INVAL_VA, | 
|---|
| 77 |         ICACHE_XTN_CACHE_INVAL_PA, | 
|---|
| 78 |         ICACHE_XTN_CACHE_INVAL_GO, | 
|---|
| 79 |         // handling tlb miss | 
|---|
| 80 |         ICACHE_TLB_WAIT, | 
|---|
| 81 |         // handling cache miss | 
|---|
| 82 |         ICACHE_MISS_SELECT, | 
|---|
| 83 |         ICACHE_MISS_CLEAN, | 
|---|
| 84 |         ICACHE_MISS_WAIT, | 
|---|
| 85 |         ICACHE_MISS_DATA_UPDT, | 
|---|
| 86 |         ICACHE_MISS_DIR_UPDT, | 
|---|
| 87 |         // handling unc read | 
|---|
| 88 |         ICACHE_UNC_WAIT, | 
|---|
| 89 |         // handling coherence requests | 
|---|
| 90 |         ICACHE_CC_CHECK, | 
|---|
| 91 |         ICACHE_CC_INVAL, | 
|---|
| 92 |         ICACHE_CC_UPDT, | 
|---|
| 93 |         ICACHE_CC_BROADCAST, | 
|---|
| 94 |         ICACHE_CC_SEND_WAIT, | 
|---|
| 95 |     }; | 
|---|
| 96 |  | 
|---|
| 97 |     enum dcache_fsm_state_e  | 
|---|
| 98 |     { | 
|---|
| 99 |         DCACHE_IDLE, | 
|---|
| 100 |         // handling itlb & dtlb miss | 
|---|
| 101 |         DCACHE_TLB_MISS, | 
|---|
| 102 |         DCACHE_TLB_PTE1_GET, | 
|---|
| 103 |         DCACHE_TLB_PTE1_SELECT, | 
|---|
| 104 |         DCACHE_TLB_PTE1_UPDT, | 
|---|
| 105 |         DCACHE_TLB_PTE2_GET, | 
|---|
| 106 |         DCACHE_TLB_PTE2_SELECT, | 
|---|
| 107 |         DCACHE_TLB_PTE2_UPDT, | 
|---|
| 108 |         DCACHE_TLB_LR_UPDT, | 
|---|
| 109 |         DCACHE_TLB_LR_WAIT, | 
|---|
| 110 |         DCACHE_TLB_RETURN, | 
|---|
| 111 |             // handling processor XTN requests | 
|---|
| 112 |         DCACHE_XTN_SWITCH, | 
|---|
| 113 |         DCACHE_XTN_SYNC, | 
|---|
| 114 |         DCACHE_XTN_IC_INVAL_VA, | 
|---|
| 115 |         DCACHE_XTN_IC_FLUSH, | 
|---|
| 116 |         DCACHE_XTN_IC_INVAL_PA, | 
|---|
| 117 |         DCACHE_XTN_IT_INVAL, | 
|---|
| 118 |         DCACHE_XTN_DC_FLUSH, | 
|---|
| 119 |         DCACHE_XTN_DC_FLUSH_GO, | 
|---|
| 120 |         DCACHE_XTN_DC_INVAL_VA, | 
|---|
| 121 |         DCACHE_XTN_DC_INVAL_PA, | 
|---|
| 122 |         DCACHE_XTN_DC_INVAL_END, | 
|---|
| 123 |         DCACHE_XTN_DC_INVAL_GO, | 
|---|
| 124 |         DCACHE_XTN_DT_INVAL, | 
|---|
| 125 |         //handling dirty bit update | 
|---|
| 126 |         DCACHE_DIRTY_GET_PTE, | 
|---|
| 127 |         DCACHE_DIRTY_WAIT, | 
|---|
| 128 |             // handling processor miss requests | 
|---|
| 129 |         DCACHE_MISS_SELECT, | 
|---|
| 130 |         DCACHE_MISS_CLEAN, | 
|---|
| 131 |         DCACHE_MISS_WAIT, | 
|---|
| 132 |         DCACHE_MISS_DATA_UPDT, | 
|---|
| 133 |         DCACHE_MISS_DIR_UPDT, | 
|---|
| 134 |         // handling processor unc, ll and sc requests | 
|---|
| 135 |         DCACHE_UNC_WAIT, | 
|---|
| 136 |         DCACHE_LL_WAIT, | 
|---|
| 137 |         DCACHE_SC_WAIT, | 
|---|
| 138 |         // handling coherence requests | 
|---|
| 139 |         DCACHE_CC_CHECK, | 
|---|
| 140 |         DCACHE_CC_INVAL, | 
|---|
| 141 |         DCACHE_CC_UPDT, | 
|---|
| 142 |         DCACHE_CC_BROADCAST, | 
|---|
| 143 |         DCACHE_CC_SEND_WAIT, | 
|---|
| 144 |         // handling TLB inval (after a coherence or XTN request) | 
|---|
| 145 |         DCACHE_INVAL_TLB_SCAN, | 
|---|
| 146 |     }; | 
|---|
| 147 |  | 
|---|
| 148 |     enum cmd_fsm_state_e  | 
|---|
| 149 |     { | 
|---|
| 150 |         CMD_IDLE, | 
|---|
| 151 |         CMD_INS_MISS, | 
|---|
| 152 |         CMD_INS_UNC, | 
|---|
| 153 |         CMD_DATA_MISS, | 
|---|
| 154 |         CMD_DATA_UNC, | 
|---|
| 155 |         CMD_DATA_WRITE, | 
|---|
| 156 |         CMD_DATA_LL, | 
|---|
| 157 |         CMD_DATA_SC, | 
|---|
| 158 |         CMD_DATA_CAS, | 
|---|
| 159 |     }; | 
|---|
| 160 |  | 
|---|
| 161 |     enum rsp_fsm_state_e  | 
|---|
| 162 |     { | 
|---|
| 163 |         RSP_IDLE, | 
|---|
| 164 |         RSP_INS_MISS, | 
|---|
| 165 |         RSP_INS_UNC, | 
|---|
| 166 |         RSP_DATA_MISS, | 
|---|
| 167 |         RSP_DATA_UNC, | 
|---|
| 168 |         RSP_DATA_LL, | 
|---|
| 169 |         RSP_DATA_WRITE, | 
|---|
| 170 |     }; | 
|---|
| 171 |  | 
|---|
| 172 |     enum cc_receive_fsm_state_e  | 
|---|
| 173 |     { | 
|---|
| 174 |         CC_RECEIVE_IDLE, | 
|---|
| 175 |         CC_RECEIVE_CLACK, | 
|---|
| 176 |         CC_RECEIVE_BRDCAST_HEADER, | 
|---|
| 177 |         CC_RECEIVE_BRDCAST_NLINE, | 
|---|
| 178 |         CC_RECEIVE_INVAL_HEADER, | 
|---|
| 179 |         CC_RECEIVE_INVAL_NLINE, | 
|---|
| 180 |         CC_RECEIVE_UPDT_HEADER, | 
|---|
| 181 |         CC_RECEIVE_UPDT_NLINE, | 
|---|
| 182 |         CC_RECEIVE_UPDT_DATA, | 
|---|
| 183 |     }; | 
|---|
| 184 |  | 
|---|
| 185 |     enum cc_send_fsm_state_e  | 
|---|
| 186 |     { | 
|---|
| 187 |         CC_SEND_IDLE, | 
|---|
| 188 |         CC_SEND_CLEANUP_1, | 
|---|
| 189 |         CC_SEND_CLEANUP_2, | 
|---|
| 190 |         CC_SEND_MULTI_ACK, | 
|---|
| 191 |     }; | 
|---|
| 192 |  | 
|---|
| 193 |     /* transaction type, pktid field */ | 
|---|
| 194 |     enum transaction_type_e | 
|---|
| 195 |     { | 
|---|
| 196 |         // b3 unused | 
|---|
| 197 |         // b2 READ / NOT READ | 
|---|
| 198 |         // if READ | 
|---|
| 199 |         //  b1 DATA / INS | 
|---|
| 200 |         //  b0 UNC / MISS | 
|---|
| 201 |         // else | 
|---|
| 202 |         //  b1 accÚs table llsc type SW / other | 
|---|
| 203 |         //  b2 WRITE/CAS/LL/SC | 
|---|
| 204 |         TYPE_READ_DATA_UNC          = 0x0, | 
|---|
| 205 |         TYPE_READ_DATA_MISS         = 0x1, | 
|---|
| 206 |         TYPE_READ_INS_UNC           = 0x2, | 
|---|
| 207 |         TYPE_READ_INS_MISS          = 0x3, | 
|---|
| 208 |         TYPE_WRITE                  = 0x4, | 
|---|
| 209 |         TYPE_CAS                    = 0x5, | 
|---|
| 210 |         TYPE_LL                     = 0x6, | 
|---|
| 211 |         TYPE_SC                     = 0x7 | 
|---|
| 212 |     }; | 
|---|
| 213 |  | 
|---|
| 214 |     /* SC return values */ | 
|---|
| 215 |     enum sc_status_type_e | 
|---|
| 216 |     { | 
|---|
| 217 |         SC_SUCCESS  =   0x00000000, | 
|---|
| 218 |         SC_FAIL     =   0x00000001 | 
|---|
| 219 |     }; | 
|---|
| 220 |  | 
|---|
| 221 |     // cc_send_type | 
|---|
| 222 |     typedef enum  | 
|---|
| 223 |     { | 
|---|
| 224 |         CC_TYPE_CLEANUP, | 
|---|
| 225 |         CC_TYPE_MULTI_ACK, | 
|---|
| 226 |     } cc_send_t; | 
|---|
| 227 |  | 
|---|
| 228 |     // cc_receive_type | 
|---|
| 229 |     typedef enum  | 
|---|
| 230 |     { | 
|---|
| 231 |         CC_TYPE_CLACK, | 
|---|
| 232 |         CC_TYPE_BRDCAST, | 
|---|
| 233 |         CC_TYPE_INVAL, | 
|---|
| 234 |         CC_TYPE_UPDT, | 
|---|
| 235 |     } cc_receive_t; | 
|---|
| 236 |  | 
|---|
| 237 |     // TLB Mode : ITLB / DTLB / ICACHE / DCACHE | 
|---|
| 238 |     enum  | 
|---|
| 239 |     { | 
|---|
| 240 |         INS_TLB_MASK    = 0x8, | 
|---|
| 241 |         DATA_TLB_MASK   = 0x4, | 
|---|
| 242 |         INS_CACHE_MASK  = 0x2, | 
|---|
| 243 |         DATA_CACHE_MASK = 0x1, | 
|---|
| 244 |     }; | 
|---|
| 245 |  | 
|---|
| 246 |     // Error Type | 
|---|
| 247 |     enum mmu_error_type_e | 
|---|
| 248 |     { | 
|---|
| 249 |         MMU_NONE                      = 0x0000, // None | 
|---|
| 250 |         MMU_WRITE_PT1_UNMAPPED        = 0x0001, // Write & Page fault on PT1 | 
|---|
| 251 |         MMU_WRITE_PT2_UNMAPPED        = 0x0002, // Write & Page fault on PT2 | 
|---|
| 252 |         MMU_WRITE_PRIVILEGE_VIOLATION = 0x0004, // Write & Protected access in user mode | 
|---|
| 253 |         MMU_WRITE_ACCES_VIOLATION     = 0x0008, // Write to non writable page | 
|---|
| 254 |         MMU_WRITE_UNDEFINED_XTN       = 0x0020, // Write & undefined external access | 
|---|
| 255 |         MMU_WRITE_PT1_ILLEGAL_ACCESS  = 0x0040, // Write & Bus Error accessing PT1 | 
|---|
| 256 |         MMU_WRITE_PT2_ILLEGAL_ACCESS  = 0x0080, // Write & Bus Error accessing PT2 | 
|---|
| 257 |         MMU_WRITE_DATA_ILLEGAL_ACCESS = 0x0100, // Write & Bus Error in cache access | 
|---|
| 258 |         MMU_READ_PT1_UNMAPPED         = 0x1001, // Read & Page fault on PT1 | 
|---|
| 259 |         MMU_READ_PT2_UNMAPPED         = 0x1002, // Read & Page fault on PT2 | 
|---|
| 260 |         MMU_READ_PRIVILEGE_VIOLATION  = 0x1004, // Read & Protected access in user mode | 
|---|
| 261 |         MMU_READ_EXEC_VIOLATION       = 0x1010, // Read & Exec access to a non exec page | 
|---|
| 262 |         MMU_READ_UNDEFINED_XTN        = 0x1020, // Read & Undefined external access | 
|---|
| 263 |         MMU_READ_PT1_ILLEGAL_ACCESS   = 0x1040, // Read & Bus Error accessing PT1 | 
|---|
| 264 |         MMU_READ_PT2_ILLEGAL_ACCESS   = 0x1080, // Read & Bus Error accessing PT2 | 
|---|
| 265 |         MMU_READ_DATA_ILLEGAL_ACCESS  = 0x1100, // Read & Bus Error in cache access | 
|---|
| 266 |     }; | 
|---|
| 267 |  | 
|---|
| 268 |     // miss types for data cache | 
|---|
| 269 |     enum dcache_miss_type_e | 
|---|
| 270 |     { | 
|---|
| 271 |         PTE1_MISS, | 
|---|
| 272 |         PTE2_MISS, | 
|---|
| 273 |         PROC_MISS, | 
|---|
| 274 |     }; | 
|---|
| 275 |  | 
|---|
| 276 |     enum transaction_type_d_e | 
|---|
| 277 |     { | 
|---|
| 278 |         // b0 : 1 if cached | 
|---|
| 279 |         // b1 : 1 if instruction | 
|---|
| 280 |         TYPE_DATA_UNC     = 0x0, | 
|---|
| 281 |         TYPE_DATA_MISS    = 0x1, | 
|---|
| 282 |         TYPE_INS_UNC      = 0x2, | 
|---|
| 283 |         TYPE_INS_MISS     = 0x3, | 
|---|
| 284 |     }; | 
|---|
| 285 |  | 
|---|
| 286 | public: | 
|---|
| 287 |     sc_in<bool>                                 p_clk; | 
|---|
| 288 |     sc_in<bool>                                 p_resetn; | 
|---|
| 289 |     sc_in<bool>                                 p_irq[iss_t::n_irq]; | 
|---|
| 290 |     soclib::caba::VciInitiator<vci_param>       p_vci; | 
|---|
| 291 |     soclib::caba::DspinInput <dspin_in_width>   p_dspin_in; | 
|---|
| 292 |     soclib::caba::DspinOutput<dspin_out_width>  p_dspin_out; | 
|---|
| 293 |  | 
|---|
| 294 | private: | 
|---|
| 295 |  | 
|---|
| 296 |     // STRUCTURAL PARAMETERS | 
|---|
| 297 |     soclib::common::AddressDecodingTable<uint32_t, bool> m_cacheability_table; | 
|---|
| 298 |  | 
|---|
| 299 |     const size_t                        m_srcid; | 
|---|
| 300 |     const size_t                        m_cc_global_id; | 
|---|
| 301 |     const size_t                        m_nline_width; | 
|---|
| 302 |     const size_t                                                m_itlb_ways; | 
|---|
| 303 |     const size_t                                                m_itlb_sets; | 
|---|
| 304 |     const size_t                                                m_dtlb_ways; | 
|---|
| 305 |     const size_t                                                m_dtlb_sets; | 
|---|
| 306 |     const size_t                                                m_icache_ways; | 
|---|
| 307 |     const size_t                                                m_icache_sets; | 
|---|
| 308 |     const paddr_t                                               m_icache_yzmask; | 
|---|
| 309 |     const size_t                                                m_icache_words; | 
|---|
| 310 |     const size_t                                                m_dcache_ways; | 
|---|
| 311 |     const size_t                                                m_dcache_sets; | 
|---|
| 312 |     const paddr_t                                               m_dcache_yzmask; | 
|---|
| 313 |     const size_t                                                m_dcache_words; | 
|---|
| 314 |     const size_t                        m_x_width; | 
|---|
| 315 |     const size_t                        m_y_width; | 
|---|
| 316 |     const size_t                        m_proc_id; | 
|---|
| 317 |     const uint32_t                                              m_max_frozen_cycles; | 
|---|
| 318 |     const size_t                                                m_paddr_nbits; | 
|---|
| 319 |     uint32_t                            m_debug_start_cycle; | 
|---|
| 320 |     bool                                m_debug_ok; | 
|---|
| 321 |  | 
|---|
| 322 |     //////////////////////////////////////// | 
|---|
| 323 |     // Communication with processor ISS | 
|---|
| 324 |     //////////////////////////////////////// | 
|---|
| 325 |     typename iss_t::InstructionRequest  m_ireq; | 
|---|
| 326 |     typename iss_t::InstructionResponse m_irsp; | 
|---|
| 327 |     typename iss_t::DataRequest         m_dreq; | 
|---|
| 328 |     typename iss_t::DataResponse        m_drsp; | 
|---|
| 329 |  | 
|---|
| 330 |     ///////////////////////////////////////////// | 
|---|
| 331 |     // debug variables  | 
|---|
| 332 |     ///////////////////////////////////////////// | 
|---|
| 333 |     bool                                m_debug_previous_i_hit; | 
|---|
| 334 |     bool                                m_debug_previous_d_hit; | 
|---|
| 335 |     bool                                m_debug_activated; | 
|---|
| 336 |  | 
|---|
| 337 |     /////////////////////////////// | 
|---|
| 338 |     // Software visible REGISTERS | 
|---|
| 339 |     /////////////////////////////// | 
|---|
| 340 |     sc_signal<uint32_t>     r_mmu_ptpr;                 // page table pointer register | 
|---|
| 341 |     sc_signal<uint32_t>     r_mmu_mode;                 // mmu mode register | 
|---|
| 342 |     sc_signal<uint32_t>     r_mmu_word_lo;              // mmu misc data low | 
|---|
| 343 |     sc_signal<uint32_t>     r_mmu_word_hi;              // mmu misc data hight | 
|---|
| 344 |     sc_signal<uint32_t>     r_mmu_ibvar;                // mmu bad instruction address | 
|---|
| 345 |     sc_signal<uint32_t>     r_mmu_dbvar;                // mmu bad data address | 
|---|
| 346 |     sc_signal<uint32_t>     r_mmu_ietr;                 // mmu instruction error type | 
|---|
| 347 |     sc_signal<uint32_t>     r_mmu_detr;                 // mmu data error type | 
|---|
| 348 |     uint32_t                r_mmu_params;                       // read-only | 
|---|
| 349 |     uint32_t                r_mmu_release;                      // read_only | 
|---|
| 350 |  | 
|---|
| 351 |  | 
|---|
| 352 |     ////////////////////////////// | 
|---|
| 353 |     // ICACHE FSM REGISTERS | 
|---|
| 354 |     ////////////////////////////// | 
|---|
| 355 |     sc_signal<int>          r_icache_fsm;               // state register | 
|---|
| 356 |     sc_signal<int>          r_icache_fsm_save;          // return state for coherence op | 
|---|
| 357 |     sc_signal<paddr_t>      r_icache_vci_paddr;         // physical address | 
|---|
| 358 |     sc_signal<uint32_t>     r_icache_vaddr_save;        // virtual address from processor | 
|---|
| 359 |  | 
|---|
| 360 |     // icache miss handling | 
|---|
| 361 |     sc_signal<size_t>       r_icache_miss_way;              // selected way for cache update | 
|---|
| 362 |     sc_signal<size_t>       r_icache_miss_set;              // selected set for cache update | 
|---|
| 363 |     sc_signal<size_t>       r_icache_miss_word;             // word index ( cache update) | 
|---|
| 364 |     sc_signal<bool>         r_icache_miss_inval;        // coherence request matching a miss | 
|---|
| 365 |     sc_signal<bool>         r_icache_miss_clack;        // waiting for a cleanup acknowledge | 
|---|
| 366 |  | 
|---|
| 367 |     // coherence request handling | 
|---|
| 368 |     sc_signal<size_t>       r_icache_cc_way;                // selected way for cc update/inval | 
|---|
| 369 |     sc_signal<size_t>       r_icache_cc_set;                // selected set for cc update/inval | 
|---|
| 370 |     sc_signal<size_t>       r_icache_cc_word;               // word counter for cc update | 
|---|
| 371 |     sc_signal<bool>         r_icache_cc_need_write;     // activate the cache for writing | 
|---|
| 372 |  | 
|---|
| 373 |     // icache flush handling | 
|---|
| 374 |     sc_signal<size_t>       r_icache_flush_count;           // slot counter used for cache flush | 
|---|
| 375 |  | 
|---|
| 376 |     // communication between ICACHE FSM and VCI_CMD FSM | 
|---|
| 377 |     sc_signal<bool>         r_icache_miss_req;           // cached read miss | 
|---|
| 378 |     sc_signal<bool>         r_icache_unc_req;            // uncached read miss | 
|---|
| 379 |  | 
|---|
| 380 |     // communication between ICACHE FSM and DCACHE FSM | 
|---|
| 381 |     sc_signal<bool>             r_icache_tlb_miss_req;       // (set icache/reset dcache) | 
|---|
| 382 |     sc_signal<bool>         r_icache_tlb_rsp_error;      // tlb miss response error | 
|---|
| 383 |  | 
|---|
| 384 |     // communication between ICACHE FSM and CC_SEND FSM | 
|---|
| 385 |     sc_signal<bool>         r_icache_cc_send_req;           // ICACHE cc_send request | 
|---|
| 386 |     sc_signal<cc_send_t>    r_icache_cc_send_type;          // ICACHE cc_send request type | 
|---|
| 387 |     sc_signal<paddr_t>      r_icache_cc_send_nline;         // ICACHE cc_send nline | 
|---|
| 388 |     sc_signal<size_t>       r_icache_cc_send_way;           // ICACHE cc_send way | 
|---|
| 389 |     sc_signal<size_t>       r_icache_cc_send_updt_tab_idx;  // ICACHE cc_send update table index | 
|---|
| 390 |  | 
|---|
| 391 |     /////////////////////////////// | 
|---|
| 392 |     // DCACHE FSM REGISTERS | 
|---|
| 393 |     /////////////////////////////// | 
|---|
| 394 |     sc_signal<int>          r_dcache_fsm;               // state register | 
|---|
| 395 |     sc_signal<int>          r_dcache_fsm_cc_save;       // return state for coherence op | 
|---|
| 396 |     sc_signal<int>          r_dcache_fsm_scan_save;     // return state for tlb scan op | 
|---|
| 397 |     // registers written in P0 stage (used in P1 stage) | 
|---|
| 398 |     sc_signal<bool>         r_dcache_wbuf_req;          // WBUF must be written in P1 stage | 
|---|
| 399 |     sc_signal<bool>         r_dcache_updt_req;          // DCACHE must be updated in P1 stage | 
|---|
| 400 |     sc_signal<uint32_t>     r_dcache_save_vaddr;        // virtual address (from proc) | 
|---|
| 401 |     sc_signal<uint32_t>     r_dcache_save_wdata;        // write data (from proc) | 
|---|
| 402 |     sc_signal<uint32_t>     r_dcache_save_be;           // byte enable (from proc) | 
|---|
| 403 |     sc_signal<paddr_t>      r_dcache_save_paddr;        // physical address | 
|---|
| 404 |     sc_signal<bool>         r_dcache_save_cacheable;    // address cacheable | 
|---|
| 405 |     sc_signal<size_t>       r_dcache_save_cache_way;    // selected way (from dcache) | 
|---|
| 406 |     sc_signal<size_t>       r_dcache_save_cache_set;    // selected set (from dcache) | 
|---|
| 407 |     sc_signal<size_t>       r_dcache_save_cache_word;   // selected word (from dcache) | 
|---|
| 408 |     // registers used by the Dirty bit sub-fsm | 
|---|
| 409 |     sc_signal<paddr_t>      r_dcache_dirty_paddr;       // PTE physical address | 
|---|
| 410 |     sc_signal<size_t>       r_dcache_dirty_way;         // way to invalidate in dcache | 
|---|
| 411 |     sc_signal<size_t>       r_dcache_dirty_set;         // set to invalidate in dcache | 
|---|
| 412 |  | 
|---|
| 413 |     // communication between DCACHE FSM and VCI_CMD FSM | 
|---|
| 414 |     sc_signal<paddr_t>      r_dcache_vci_paddr;             // physical address for VCI command | 
|---|
| 415 |     sc_signal<bool>         r_dcache_vci_miss_req;      // read miss request | 
|---|
| 416 |     sc_signal<bool>         r_dcache_vci_unc_req;       // uncacheable read request | 
|---|
| 417 |     sc_signal<uint32_t>     r_dcache_vci_unc_be;        // uncacheable read byte enable | 
|---|
| 418 |     sc_signal<bool>         r_dcache_vci_cas_req;       // atomic write request CAS | 
|---|
| 419 |     sc_signal<uint32_t>     r_dcache_vci_cas_old;       // previous data value for a CAS | 
|---|
| 420 |     sc_signal<uint32_t>     r_dcache_vci_cas_new;       // new data value for a CAS | 
|---|
| 421 |     sc_signal<bool>         r_dcache_vci_ll_req;        // atomic read request LL | 
|---|
| 422 |     sc_signal<bool>         r_dcache_vci_sc_req;        // atomic write request SC | 
|---|
| 423 |     sc_signal<uint32_t>     r_dcache_vci_sc_data;       // SC data (command) | 
|---|
| 424 |  | 
|---|
| 425 |     // register used for XTN inval | 
|---|
| 426 |     sc_signal<size_t>       r_dcache_xtn_way;               // selected way (from dcache) | 
|---|
| 427 |     sc_signal<size_t>       r_dcache_xtn_set;               // selected set (from dcache) | 
|---|
| 428 |  | 
|---|
| 429 |     // write buffer state extension | 
|---|
| 430 |     sc_signal<bool>         r_dcache_pending_unc_write; // pending uncacheable write in WBUF | 
|---|
| 431 |  | 
|---|
| 432 |     // handling dcache miss | 
|---|
| 433 |     sc_signal<int>              r_dcache_miss_type;                 // depending on the requester | 
|---|
| 434 |     sc_signal<size_t>       r_dcache_miss_word;             // word index for cache update | 
|---|
| 435 |     sc_signal<size_t>       r_dcache_miss_way;              // selected way for cache update | 
|---|
| 436 |     sc_signal<size_t>       r_dcache_miss_set;              // selected set for cache update | 
|---|
| 437 |     sc_signal<bool>         r_dcache_miss_inval;        // coherence request matching a miss | 
|---|
| 438 |     sc_signal<bool>         r_dcache_miss_clack;        // waiting for a cleanup acknowledge | 
|---|
| 439 |  | 
|---|
| 440 |     // handling coherence requests | 
|---|
| 441 |     sc_signal<size_t>       r_dcache_cc_way;                // selected way for cc update/inval | 
|---|
| 442 |     sc_signal<size_t>       r_dcache_cc_set;                // selected set for cc update/inval | 
|---|
| 443 |     sc_signal<size_t>       r_dcache_cc_word;               // word counter for cc update | 
|---|
| 444 |     sc_signal<bool>         r_dcache_cc_need_write;     // activate the cache for writing | 
|---|
| 445 |  | 
|---|
| 446 |     // dcache flush handling | 
|---|
| 447 |     sc_signal<size_t>       r_dcache_flush_count;           // slot counter used for cache flush | 
|---|
| 448 |  | 
|---|
| 449 |     // ll response handling | 
|---|
| 450 |     sc_signal<size_t>       r_dcache_ll_rsp_count;          // flit counter used for ll rsp | 
|---|
| 451 |  | 
|---|
| 452 |     // used by the TLB miss sub-fsm | 
|---|
| 453 |     sc_signal<uint32_t>     r_dcache_tlb_vaddr;             // virtual address for a tlb miss | 
|---|
| 454 |     sc_signal<bool>         r_dcache_tlb_ins;               // target tlb (itlb if true) | 
|---|
| 455 |     sc_signal<paddr_t>      r_dcache_tlb_paddr;             // physical address of pte | 
|---|
| 456 |     sc_signal<uint32_t>     r_dcache_tlb_pte_flags;         // pte1 or first word of pte2 | 
|---|
| 457 |     sc_signal<uint32_t>     r_dcache_tlb_pte_ppn;           // second word of pte2 | 
|---|
| 458 |     sc_signal<size_t>       r_dcache_tlb_cache_way;         // selected way in dcache | 
|---|
| 459 |     sc_signal<size_t>       r_dcache_tlb_cache_set;         // selected set in dcache | 
|---|
| 460 |     sc_signal<size_t>       r_dcache_tlb_cache_word;    // selected word in dcache | 
|---|
| 461 |     sc_signal<size_t>       r_dcache_tlb_way;               // selected way in tlb | 
|---|
| 462 |     sc_signal<size_t>       r_dcache_tlb_set;               // selected set in tlb | 
|---|
| 463 |  | 
|---|
| 464 |     // ITLB and DTLB invalidation | 
|---|
| 465 |     sc_signal<paddr_t>      r_dcache_tlb_inval_line;    // line index | 
|---|
| 466 |     sc_signal<size_t>       r_dcache_tlb_inval_set;     // tlb set counter | 
|---|
| 467 |  | 
|---|
| 468 |     // communication between DCACHE FSM and ICACHE FSM | 
|---|
| 469 |     sc_signal<bool>         r_dcache_xtn_req;           // xtn request (caused by processor) | 
|---|
| 470 |     sc_signal<int>          r_dcache_xtn_opcode;        // xtn request type | 
|---|
| 471 |  | 
|---|
| 472 |     // communication between DCACHE FSM and CC_SEND FSM | 
|---|
| 473 |     sc_signal<bool>         r_dcache_cc_send_req;           // DCACHE cc_send request | 
|---|
| 474 |     sc_signal<cc_send_t>    r_dcache_cc_send_type;          // DCACHE cc_send request type | 
|---|
| 475 |     sc_signal<paddr_t>      r_dcache_cc_send_nline;         // DCACHE cc_send nline | 
|---|
| 476 |     sc_signal<size_t>       r_dcache_cc_send_way;           // DCACHE cc_send way | 
|---|
| 477 |     sc_signal<size_t>       r_dcache_cc_send_updt_tab_idx;  // DCACHE cc_send update table index | 
|---|
| 478 |  | 
|---|
| 479 |     // dcache directory extension | 
|---|
| 480 |     bool                    *r_dcache_in_tlb;               // copy exist in dtlb or itlb | 
|---|
| 481 |     bool                    *r_dcache_contains_ptd;         // cache line contains a PTD | 
|---|
| 482 |  | 
|---|
| 483 |     // Physical address extension for data access | 
|---|
| 484 |     sc_signal<uint32_t>     r_dcache_paddr_ext;             // CP2 register (if vci_address > 32) | 
|---|
| 485 |  | 
|---|
| 486 |     /////////////////////////////////// | 
|---|
| 487 |     // VCI_CMD FSM REGISTERS | 
|---|
| 488 |     /////////////////////////////////// | 
|---|
| 489 |     sc_signal<int>          r_vci_cmd_fsm; | 
|---|
| 490 |     sc_signal<size_t>       r_vci_cmd_min;                      // used for write bursts | 
|---|
| 491 |     sc_signal<size_t>       r_vci_cmd_max;                      // used for write bursts | 
|---|
| 492 |     sc_signal<size_t>       r_vci_cmd_cpt;                      // used for write bursts | 
|---|
| 493 |     sc_signal<bool>         r_vci_cmd_imiss_prio;               // round-robin between imiss & dmiss | 
|---|
| 494 |  | 
|---|
| 495 |     /////////////////////////////////// | 
|---|
| 496 |     // VCI_RSP FSM REGISTERS | 
|---|
| 497 |     /////////////////////////////////// | 
|---|
| 498 |     sc_signal<int>          r_vci_rsp_fsm; | 
|---|
| 499 |     sc_signal<size_t>       r_vci_rsp_cpt; | 
|---|
| 500 |     sc_signal<bool>         r_vci_rsp_ins_error; | 
|---|
| 501 |     sc_signal<bool>         r_vci_rsp_data_error; | 
|---|
| 502 |     GenericFifo<uint32_t>   r_vci_rsp_fifo_icache;              // response FIFO to ICACHE FSM | 
|---|
| 503 |     GenericFifo<uint32_t>   r_vci_rsp_fifo_dcache;              // response FIFO to DCACHE FSM | 
|---|
| 504 |  | 
|---|
| 505 |     /////////////////////////////////// | 
|---|
| 506 |     //  CC_SEND FSM REGISTER | 
|---|
| 507 |     /////////////////////////////////// | 
|---|
| 508 |     sc_signal<int>          r_cc_send_fsm;                  // state register | 
|---|
| 509 |     sc_signal<bool>         r_cc_send_last_client;          // 0 dcache / 1 icache | 
|---|
| 510 |  | 
|---|
| 511 |     /////////////////////////////////// | 
|---|
| 512 |     //  CC_RECEIVE FSM REGISTER | 
|---|
| 513 |     /////////////////////////////////// | 
|---|
| 514 |     sc_signal<int>          r_cc_receive_fsm;               // state register | 
|---|
| 515 |     sc_signal<bool>         r_cc_receive_data_ins;          // request to : 0 dcache / 1 icache | 
|---|
| 516 |  | 
|---|
| 517 |     // communication between CC_RECEIVE FSM and ICACHE/DCACHE FSM | 
|---|
| 518 |     sc_signal<size_t>       r_cc_receive_word_idx;          // word index | 
|---|
| 519 |     GenericFifo<uint32_t>   r_cc_receive_updt_fifo_be; | 
|---|
| 520 |     GenericFifo<uint32_t>   r_cc_receive_updt_fifo_data; | 
|---|
| 521 |     GenericFifo<bool>       r_cc_receive_updt_fifo_eop; | 
|---|
| 522 |  | 
|---|
| 523 |     // communication between CC_RECEIVE FSM and ICACHE FSM | 
|---|
| 524 |     sc_signal<bool>         r_cc_receive_icache_req;        // cc_receive to icache request | 
|---|
| 525 |     sc_signal<cc_receive_t> r_cc_receive_icache_type;       // cc_receive type of request | 
|---|
| 526 |     sc_signal<size_t>       r_cc_receive_icache_way;        // cc_receive to icache way | 
|---|
| 527 |     sc_signal<size_t>       r_cc_receive_icache_set;        // cc_receive to icache set | 
|---|
| 528 |     sc_signal<size_t>       r_cc_receive_icache_updt_tab_idx;  // cc_receive update table index | 
|---|
| 529 |     sc_signal<paddr_t>      r_cc_receive_icache_nline;      // cache line physical address | 
|---|
| 530 |  | 
|---|
| 531 |     // communication between CC_RECEIVE FSM and DCACHE FSM | 
|---|
| 532 |     sc_signal<bool>         r_cc_receive_dcache_req;        // cc_receive to dcache request | 
|---|
| 533 |     sc_signal<cc_receive_t> r_cc_receive_dcache_type;       // cc_receive type of request | 
|---|
| 534 |     sc_signal<size_t>       r_cc_receive_dcache_way;        // cc_receive to dcache way | 
|---|
| 535 |     sc_signal<size_t>       r_cc_receive_dcache_set;        // cc_receive to dcache set | 
|---|
| 536 |     sc_signal<size_t>       r_cc_receive_dcache_updt_tab_idx;  // cc_receive update table index | 
|---|
| 537 |     sc_signal<paddr_t>      r_cc_receive_dcache_nline;      // cache line physical address | 
|---|
| 538 |  | 
|---|
| 539 |     ////////////////////////////////////////////////////////////////// | 
|---|
| 540 |     // processor, write buffer, caches , TLBs | 
|---|
| 541 |     ////////////////////////////////////////////////////////////////// | 
|---|
| 542 |  | 
|---|
| 543 |     iss_t                       r_iss; | 
|---|
| 544 |     MultiWriteBuffer<paddr_t>   r_wbuf; | 
|---|
| 545 |     GenericCache<paddr_t>       r_icache; | 
|---|
| 546 |     GenericCache<paddr_t>       r_dcache; | 
|---|
| 547 |     GenericTlb<paddr_t>         r_itlb; | 
|---|
| 548 |     GenericTlb<paddr_t>         r_dtlb; | 
|---|
| 549 |  | 
|---|
| 550 |     ////////////////////////////////////////////////////////////////// | 
|---|
| 551 |     // llsc registration buffer | 
|---|
| 552 |     ////////////////////////////////////////////////////////////////// | 
|---|
| 553 |  | 
|---|
| 554 |     sc_signal<paddr_t>                     r_dcache_llsc_paddr; | 
|---|
| 555 |     sc_signal<uint32_t>                    r_dcache_llsc_key; | 
|---|
| 556 |     sc_signal<uint32_t>                    r_dcache_llsc_count; | 
|---|
| 557 |     sc_signal<bool>                        r_dcache_llsc_valid; | 
|---|
| 558 |  | 
|---|
| 559 |     //////////////////////////////// | 
|---|
| 560 |     // Activity counters | 
|---|
| 561 |     //////////////////////////////// | 
|---|
| 562 |     uint32_t m_cpt_dcache_data_read;        // DCACHE DATA READ | 
|---|
| 563 |     uint32_t m_cpt_dcache_data_write;       // DCACHE DATA WRITE | 
|---|
| 564 |     uint32_t m_cpt_dcache_dir_read;         // DCACHE DIR READ | 
|---|
| 565 |     uint32_t m_cpt_dcache_dir_write;        // DCACHE DIR WRITE | 
|---|
| 566 |  | 
|---|
| 567 |     uint32_t m_cpt_icache_data_read;        // ICACHE DATA READ | 
|---|
| 568 |     uint32_t m_cpt_icache_data_write;       // ICACHE DATA WRITE | 
|---|
| 569 |     uint32_t m_cpt_icache_dir_read;         // ICACHE DIR READ | 
|---|
| 570 |     uint32_t m_cpt_icache_dir_write;        // ICACHE DIR WRITE | 
|---|
| 571 |  | 
|---|
| 572 |     uint32_t m_cpt_frz_cycles;              // number of cycles where the cpu is frozen | 
|---|
| 573 |     uint32_t m_cpt_total_cycles;                // total number of cycles | 
|---|
| 574 |  | 
|---|
| 575 |     // Cache activity counters | 
|---|
| 576 |     uint32_t m_cpt_data_read;               // total number of read data | 
|---|
| 577 |     uint32_t m_cpt_data_write;              // total number of write data | 
|---|
| 578 |     uint32_t m_cpt_data_miss;               // number of read miss | 
|---|
| 579 |     uint32_t m_cpt_ins_miss;                // number of instruction miss | 
|---|
| 580 |     uint32_t m_cpt_unc_read;                // number of read uncached | 
|---|
| 581 |     uint32_t m_cpt_write_cached;            // number of cached write | 
|---|
| 582 |     uint32_t m_cpt_ins_read;                // number of instruction read | 
|---|
| 583 |     uint32_t m_cpt_ins_spc_miss;            // number of speculative instruction miss | 
|---|
| 584 |  | 
|---|
| 585 |     uint32_t m_cost_write_frz;              // number of frozen cycles related to write buffer | 
|---|
| 586 |     uint32_t m_cost_data_miss_frz;          // number of frozen cycles related to data miss | 
|---|
| 587 |     uint32_t m_cost_unc_read_frz;           // number of frozen cycles related to uncached read | 
|---|
| 588 |     uint32_t m_cost_ins_miss_frz;           // number of frozen cycles related to ins miss | 
|---|
| 589 |  | 
|---|
| 590 |     uint32_t m_cpt_imiss_transaction;       // number of VCI instruction miss transactions | 
|---|
| 591 |     uint32_t m_cpt_dmiss_transaction;       // number of VCI data miss transactions | 
|---|
| 592 |     uint32_t m_cpt_unc_transaction;         // number of VCI uncached read transactions | 
|---|
| 593 |     uint32_t m_cpt_write_transaction;       // number of VCI write transactions | 
|---|
| 594 |     uint32_t m_cpt_icache_unc_transaction; | 
|---|
| 595 |  | 
|---|
| 596 |     uint32_t m_cost_imiss_transaction;      // cumulated duration for VCI IMISS transactions | 
|---|
| 597 |     uint32_t m_cost_dmiss_transaction;      // cumulated duration for VCI DMISS transactions | 
|---|
| 598 |     uint32_t m_cost_unc_transaction;        // cumulated duration for VCI UNC transactions | 
|---|
| 599 |     uint32_t m_cost_write_transaction;      // cumulated duration for VCI WRITE transactions | 
|---|
| 600 |     uint32_t m_cost_icache_unc_transaction; // cumulated duration for VCI IUNC transactions | 
|---|
| 601 |     uint32_t m_length_write_transaction;    // cumulated length for VCI WRITE transactions | 
|---|
| 602 |  | 
|---|
| 603 |     // TLB activity counters | 
|---|
| 604 |     uint32_t m_cpt_ins_tlb_read;            // number of instruction tlb read | 
|---|
| 605 |     uint32_t m_cpt_ins_tlb_miss;            // number of instruction tlb miss | 
|---|
| 606 |     uint32_t m_cpt_ins_tlb_update_acc;      // number of instruction tlb update | 
|---|
| 607 |     uint32_t m_cpt_ins_tlb_occup_cache;     // number of instruction tlb occupy data cache line | 
|---|
| 608 |     uint32_t m_cpt_ins_tlb_hit_dcache;      // number of instruction tlb hit in data cache | 
|---|
| 609 |  | 
|---|
| 610 |     uint32_t m_cpt_data_tlb_read;           // number of data tlb read | 
|---|
| 611 |     uint32_t m_cpt_data_tlb_miss;           // number of data tlb miss | 
|---|
| 612 |     uint32_t m_cpt_data_tlb_update_acc;     // number of data tlb update | 
|---|
| 613 |     uint32_t m_cpt_data_tlb_update_dirty;   // number of data tlb update dirty | 
|---|
| 614 |     uint32_t m_cpt_data_tlb_hit_dcache;     // number of data tlb hit in data cache | 
|---|
| 615 |     uint32_t m_cpt_data_tlb_occup_cache;    // number of data tlb occupy data cache line | 
|---|
| 616 |     uint32_t m_cpt_tlb_occup_dcache; | 
|---|
| 617 |  | 
|---|
| 618 |     uint32_t m_cost_ins_tlb_miss_frz;       // number of frozen cycles related to instruction tlb miss | 
|---|
| 619 |     uint32_t m_cost_data_tlb_miss_frz;      // number of frozen cycles related to data tlb miss | 
|---|
| 620 |     uint32_t m_cost_ins_tlb_update_acc_frz;    // number of frozen cycles related to instruction tlb update acc | 
|---|
| 621 |     uint32_t m_cost_data_tlb_update_acc_frz;   // number of frozen cycles related to data tlb update acc | 
|---|
| 622 |     uint32_t m_cost_data_tlb_update_dirty_frz; // number of frozen cycles related to data tlb update dirty | 
|---|
| 623 |     uint32_t m_cost_ins_tlb_occup_cache_frz;   // number of frozen cycles related to instruction tlb miss operate in dcache | 
|---|
| 624 |     uint32_t m_cost_data_tlb_occup_cache_frz;  // number of frozen cycles related to data tlb miss operate in dcache | 
|---|
| 625 |  | 
|---|
| 626 |     uint32_t m_cpt_itlbmiss_transaction;       // number of itlb miss transactions | 
|---|
| 627 |     uint32_t m_cpt_itlb_ll_transaction;        // number of itlb ll acc transactions | 
|---|
| 628 |     uint32_t m_cpt_itlb_sc_transaction;        // number of itlb sc acc transactions | 
|---|
| 629 |     uint32_t m_cpt_dtlbmiss_transaction;       // number of dtlb miss transactions | 
|---|
| 630 |     uint32_t m_cpt_dtlb_ll_transaction;        // number of dtlb ll acc transactions | 
|---|
| 631 |     uint32_t m_cpt_dtlb_sc_transaction;        // number of dtlb sc acc transactions | 
|---|
| 632 |     uint32_t m_cpt_dtlb_ll_dirty_transaction;  // number of dtlb ll dirty transactions | 
|---|
| 633 |     uint32_t m_cpt_dtlb_sc_dirty_transaction;  // number of dtlb sc dirty transactions | 
|---|
| 634 |  | 
|---|
| 635 |     uint32_t m_cost_itlbmiss_transaction;       // cumulated duration for VCI instruction TLB miss transactions | 
|---|
| 636 |     uint32_t m_cost_itlb_ll_transaction;        // cumulated duration for VCI instruction TLB ll acc transactions | 
|---|
| 637 |     uint32_t m_cost_itlb_sc_transaction;        // cumulated duration for VCI instruction TLB sc acc transactions | 
|---|
| 638 |     uint32_t m_cost_dtlbmiss_transaction;       // cumulated duration for VCI data TLB miss transactions | 
|---|
| 639 |     uint32_t m_cost_dtlb_ll_transaction;        // cumulated duration for VCI data TLB ll acc transactions | 
|---|
| 640 |     uint32_t m_cost_dtlb_sc_transaction;        // cumulated duration for VCI data TLB sc acc transactions | 
|---|
| 641 |     uint32_t m_cost_dtlb_ll_dirty_transaction;  // cumulated duration for VCI data TLB ll dirty transactions | 
|---|
| 642 |     uint32_t m_cost_dtlb_sc_dirty_transaction;  // cumulated duration for VCI data TLB sc dirty transactions | 
|---|
| 643 |  | 
|---|
| 644 |     // coherence activity counters | 
|---|
| 645 |     uint32_t m_cpt_cc_update_icache;            // number of coherence update instruction commands | 
|---|
| 646 |     uint32_t m_cpt_cc_update_dcache;            // number of coherence update data commands | 
|---|
| 647 |     uint32_t m_cpt_cc_inval_icache;             // number of coherence inval instruction commands | 
|---|
| 648 |     uint32_t m_cpt_cc_inval_dcache;             // number of coherence inval data commands | 
|---|
| 649 |     uint32_t m_cpt_cc_broadcast;                // number of coherence broadcast commands | 
|---|
| 650 |  | 
|---|
| 651 |     uint32_t m_cost_updt_data_frz;              // number of frozen cycles related to coherence update data packets | 
|---|
| 652 |     uint32_t m_cost_inval_ins_frz;              // number of frozen cycles related to coherence inval instruction packets | 
|---|
| 653 |     uint32_t m_cost_inval_data_frz;             // number of frozen cycles related to coherence inval data packets | 
|---|
| 654 |     uint32_t m_cost_broadcast_frz;              // number of frozen cycles related to coherence broadcast packets | 
|---|
| 655 |  | 
|---|
| 656 |     uint32_t m_cpt_cc_cleanup_ins;              // number of coherence cleanup packets | 
|---|
| 657 |     uint32_t m_cpt_cc_cleanup_data;             // number of coherence cleanup packets | 
|---|
| 658 |  | 
|---|
| 659 |     uint32_t m_cpt_icleanup_transaction;        // number of instruction cleanup transactions | 
|---|
| 660 |     uint32_t m_cpt_dcleanup_transaction;        // number of instructinumber of data cleanup transactions | 
|---|
| 661 |     uint32_t m_cost_icleanup_transaction;       // cumulated duration for VCI instruction cleanup transactions | 
|---|
| 662 |     uint32_t m_cost_dcleanup_transaction;       // cumulated duration for VCI data cleanup transactions | 
|---|
| 663 |  | 
|---|
| 664 |     uint32_t m_cost_ins_tlb_inval_frz;      // number of frozen cycles related to checking ins tlb invalidate | 
|---|
| 665 |     uint32_t m_cpt_ins_tlb_inval;           // number of ins tlb invalidate | 
|---|
| 666 |  | 
|---|
| 667 |     uint32_t m_cost_data_tlb_inval_frz;     // number of frozen cycles related to checking data tlb invalidate | 
|---|
| 668 |     uint32_t m_cpt_data_tlb_inval;          // number of data tlb invalidate | 
|---|
| 669 |  | 
|---|
| 670 |     // FSM activity counters | 
|---|
| 671 |     uint32_t m_cpt_fsm_icache     [64]; | 
|---|
| 672 |     uint32_t m_cpt_fsm_dcache     [64]; | 
|---|
| 673 |     uint32_t m_cpt_fsm_cmd        [64]; | 
|---|
| 674 |     uint32_t m_cpt_fsm_rsp        [64]; | 
|---|
| 675 |     uint32_t m_cpt_fsm_cc_receive [64]; | 
|---|
| 676 |     uint32_t m_cpt_fsm_cc_send    [64]; | 
|---|
| 677 |  | 
|---|
| 678 |     uint32_t m_cpt_stop_simulation;             // used to stop simulation if frozen | 
|---|
| 679 |     bool     m_monitor_ok;                      // used to debug cache output   | 
|---|
| 680 |     uint32_t m_monitor_base;                 | 
|---|
| 681 |     uint32_t m_monitor_length;               | 
|---|
| 682 |  | 
|---|
| 683 | protected: | 
|---|
| 684 |     SC_HAS_PROCESS(VciCcVCacheWrapper); | 
|---|
| 685 |  | 
|---|
| 686 | public: | 
|---|
| 687 |     VciCcVCacheWrapper( | 
|---|
| 688 |         sc_module_name                      name, | 
|---|
| 689 |         const int                           proc_id, | 
|---|
| 690 |         const soclib::common::MappingTable  &mtd, | 
|---|
| 691 |         const soclib::common::IntTab        &srcid, | 
|---|
| 692 |         const size_t                        cc_global_id, | 
|---|
| 693 |         const size_t                        itlb_ways, | 
|---|
| 694 |         const size_t                        itlb_sets, | 
|---|
| 695 |         const size_t                        dtlb_ways, | 
|---|
| 696 |         const size_t                        dtlb_sets, | 
|---|
| 697 |         const size_t                        icache_ways, | 
|---|
| 698 |         const size_t                        icache_sets, | 
|---|
| 699 |         const size_t                        icache_words, | 
|---|
| 700 |         const size_t                        dcache_ways, | 
|---|
| 701 |         const size_t                        dcache_sets, | 
|---|
| 702 |         const size_t                        dcache_words, | 
|---|
| 703 |         const size_t                        wbuf_nlines, | 
|---|
| 704 |         const size_t                        wbuf_nwords, | 
|---|
| 705 |         const size_t                        x_width, | 
|---|
| 706 |         const size_t                        y_width, | 
|---|
| 707 |         const uint32_t                      max_frozen_cycles, | 
|---|
| 708 |         const uint32_t                      debug_start_cycle, | 
|---|
| 709 |         const bool                          debug_ok ); | 
|---|
| 710 |  | 
|---|
| 711 |     ~VciCcVCacheWrapper(); | 
|---|
| 712 |  | 
|---|
| 713 |     void print_cpi(); | 
|---|
| 714 |     void print_stats(); | 
|---|
| 715 |     void clear_stats(); | 
|---|
| 716 |     void print_trace(size_t mode = 0); | 
|---|
| 717 |     void cache_monitor(paddr_t addr); | 
|---|
| 718 |     void start_monitor(paddr_t,paddr_t); | 
|---|
| 719 |     void stop_monitor(); | 
|---|
| 720 |     inline void iss_set_debug_mask(uint v)  | 
|---|
| 721 |     { | 
|---|
| 722 |             r_iss.set_debug_mask(v); | 
|---|
| 723 |     } | 
|---|
| 724 |  | 
|---|
| 725 | private: | 
|---|
| 726 |     void transition(); | 
|---|
| 727 |     void genMoore(); | 
|---|
| 728 |  | 
|---|
| 729 |     soclib_static_assert((int)iss_t::SC_ATOMIC == (int)vci_param::STORE_COND_ATOMIC); | 
|---|
| 730 |     soclib_static_assert((int)iss_t::SC_NOT_ATOMIC == (int)vci_param::STORE_COND_NOT_ATOMIC); | 
|---|
| 731 | }; | 
|---|
| 732 |  | 
|---|
| 733 | }} | 
|---|
| 734 |  | 
|---|
| 735 | #endif /* SOCLIB_CABA_VCI_CC_VCACHE_WRAPPER_H */ | 
|---|
| 736 |  | 
|---|
| 737 | // Local Variables: | 
|---|
| 738 | // tab-width: 4 | 
|---|
| 739 | // c-basic-offset: 4 | 
|---|
| 740 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
| 741 | // indent-tabs-mode: nil | 
|---|
| 742 | // End: | 
|---|
| 743 |  | 
|---|
| 744 | // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 | 
|---|