source: branches/wt_ideal/modules/vci_cc_vcache_wrapper/caba/source/include/vci_cc_vcache_wrapper.h @ 920

Last change on this file since 920 was 920, checked in by meunier, 9 years ago
  • Adding branch wt_ideal -- "ideal" write-through
File size: 28.5 KB
Line 
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 <set>
38
39#include "caba_base_module.h"
40#include "multi_write_buffer.h"
41#include "generic_fifo.h"
42#include "generic_tlb.h"
43#include "generic_cache.h"
44#include "vci_initiator.h"
45#include "dspin_interface.h"
46#include "dspin_wtidl_param.h"
47#include "mapping_table.h"
48#include "static_assert.h"
49#include "iss2.h"
50
51#define LLSC_TIMEOUT    10000
52
53namespace soclib {
54namespace caba {
55
56using namespace sc_core;
57
58
59class VcacheUpdate {
60
61public:
62    uint64_t m_addr;
63    uint32_t m_value;
64    uint32_t m_be;
65
66    VcacheUpdate(uint64_t ad, uint32_t val, uint32_t b) :
67        m_addr(ad),
68        m_value(val),
69        m_be(b)
70    {
71    }
72
73    ~VcacheUpdate() {}
74
75};
76
77
78////////////////////////////////////////////
79template<typename vci_param, 
80         size_t   dspin_in_width,
81         size_t   dspin_out_width,
82         typename iss_t>
83class VciCcVCacheWrapper
84////////////////////////////////////////////
85    : public soclib::caba::BaseModule
86{
87
88    typedef typename vci_param::fast_addr_t paddr_t;
89
90    enum icache_fsm_state_e
91    {
92        ICACHE_IDLE,
93        // handling XTN processor requests
94        ICACHE_XTN_TLB_FLUSH,
95        ICACHE_XTN_CACHE_FLUSH,
96        ICACHE_XTN_CACHE_FLUSH_GO,
97        ICACHE_XTN_TLB_INVAL,
98        ICACHE_XTN_CACHE_INVAL_VA,
99        ICACHE_XTN_CACHE_INVAL_PA,
100        ICACHE_XTN_CACHE_INVAL_GO,
101        // handling tlb miss
102        ICACHE_TLB_WAIT,
103        // handling cache miss
104        ICACHE_MISS_SELECT,
105        ICACHE_MISS_CLEAN,
106        ICACHE_MISS_WAIT,
107        ICACHE_MISS_DATA_UPDT,
108        ICACHE_MISS_DIR_UPDT,
109        // handling unc read
110        ICACHE_UNC_WAIT,
111    };
112
113    enum dcache_fsm_state_e
114    {
115        DCACHE_IDLE,
116        // handling itlb & dtlb miss
117        DCACHE_TLB_MISS,
118        DCACHE_TLB_PTE1_GET,
119        DCACHE_TLB_PTE1_SELECT,
120        DCACHE_TLB_PTE1_UPDT,
121        DCACHE_TLB_PTE2_GET,
122        DCACHE_TLB_PTE2_SELECT,
123        DCACHE_TLB_PTE2_UPDT,
124        DCACHE_TLB_LR_UPDT,
125        DCACHE_TLB_LR_WAIT,
126        DCACHE_TLB_RETURN,
127        // handling processor XTN requests
128        DCACHE_XTN_SWITCH,
129        DCACHE_XTN_SYNC,
130        DCACHE_XTN_IC_INVAL_VA,
131        DCACHE_XTN_IC_FLUSH,
132        DCACHE_XTN_IC_INVAL_PA,
133        DCACHE_XTN_IC_PADDR_EXT,
134        DCACHE_XTN_IT_INVAL,
135        DCACHE_XTN_DC_FLUSH,
136        DCACHE_XTN_DC_FLUSH_GO,
137        DCACHE_XTN_DC_INVAL_VA,
138        DCACHE_XTN_DC_INVAL_PA,
139        DCACHE_XTN_DC_INVAL_END,
140        DCACHE_XTN_DC_INVAL_GO,
141        DCACHE_XTN_DT_INVAL,
142        //handling dirty bit update
143        DCACHE_DIRTY_GET_PTE,
144        DCACHE_DIRTY_WAIT,
145        // handling processor miss requests
146        DCACHE_MISS_SELECT,
147        DCACHE_MISS_VICTIM_CHECK,
148        DCACHE_MISS_WAIT,
149        DCACHE_MISS_DATA_UPDT,
150        DCACHE_MISS_DIR_UPDT,
151        // handling processor unc, ll and sc requests
152        DCACHE_UNC_WAIT,
153        DCACHE_LL_WAIT,
154        DCACHE_SC_WAIT,
155        // handling TLB inval (after a coherence or XTN request)
156        DCACHE_INVAL_TLB_SCAN,
157    };
158
159    enum cmd_fsm_state_e
160    {
161        CMD_IDLE,
162        CMD_INS_MISS,
163        CMD_INS_UNC,
164        CMD_DATA_MISS,
165        CMD_DATA_UNC_READ,
166        CMD_DATA_UNC_WRITE,
167        CMD_DATA_WRITE,
168        CMD_DATA_LL,
169        CMD_DATA_SC,
170        CMD_DATA_CAS,
171    };
172
173    enum rsp_fsm_state_e
174    {
175        RSP_IDLE,
176        RSP_INS_MISS,
177        RSP_INS_UNC,
178        RSP_DATA_MISS,
179        RSP_DATA_UNC,
180        RSP_DATA_LL,
181        RSP_DATA_WRITE,
182    };
183
184    /* transaction type, pktid field */
185    enum transaction_type_e
186    {
187        // b3 unused
188        // b2 READ / NOT READ
189        // if READ
190        //  b1 DATA / INS
191        //  b0 UNC / MISS
192        // else
193        //  b1 accÚs table llsc type SW / other
194        //  b2 WRITE/CAS/LL/SC
195        TYPE_DATA_UNC       = 0x0,
196        TYPE_READ_DATA_MISS = 0x1,
197        TYPE_READ_INS_UNC   = 0x2,
198        TYPE_READ_INS_MISS  = 0x3,
199        TYPE_WRITE          = 0x4,
200        TYPE_CAS            = 0x5,
201        TYPE_LL             = 0x6,
202        TYPE_SC             = 0x7
203    };
204
205    /* SC return values */
206    enum sc_status_type_e
207    {
208        SC_SUCCESS = 0x00000000,
209        SC_FAIL    = 0x00000001
210    };
211
212    // TLB Mode : ITLB / DTLB / ICACHE / DCACHE
213    enum 
214    {
215        INS_TLB_MASK    = 0x8,
216        DATA_TLB_MASK   = 0x4,
217        INS_CACHE_MASK  = 0x2,
218        DATA_CACHE_MASK = 0x1,
219    };
220
221    // Error Type
222    enum mmu_error_type_e
223    {
224        MMU_NONE                      = 0x0000, // None
225        MMU_WRITE_PT1_UNMAPPED        = 0x0001, // Write & Page fault on PT1
226        MMU_WRITE_PT2_UNMAPPED        = 0x0002, // Write & Page fault on PT2
227        MMU_WRITE_PRIVILEGE_VIOLATION = 0x0004, // Write & Protected access in user mode
228        MMU_WRITE_ACCES_VIOLATION     = 0x0008, // Write to non writable page
229        MMU_WRITE_UNDEFINED_XTN       = 0x0020, // Write & undefined external access
230        MMU_WRITE_PT1_ILLEGAL_ACCESS  = 0x0040, // Write & Bus Error accessing PT1
231        MMU_WRITE_PT2_ILLEGAL_ACCESS  = 0x0080, // Write & Bus Error accessing PT2
232        MMU_WRITE_DATA_ILLEGAL_ACCESS = 0x0100, // Write & Bus Error in cache access
233        MMU_READ_PT1_UNMAPPED         = 0x1001, // Read & Page fault on PT1
234        MMU_READ_PT2_UNMAPPED         = 0x1002, // Read & Page fault on PT2
235        MMU_READ_PRIVILEGE_VIOLATION  = 0x1004, // Read & Protected access in user mode
236        MMU_READ_EXEC_VIOLATION       = 0x1010, // Read & Exec access to a non exec page
237        MMU_READ_UNDEFINED_XTN        = 0x1020, // Read & Undefined external access
238        MMU_READ_PT1_ILLEGAL_ACCESS   = 0x1040, // Read & Bus Error accessing PT1
239        MMU_READ_PT2_ILLEGAL_ACCESS   = 0x1080, // Read & Bus Error accessing PT2
240        MMU_READ_DATA_ILLEGAL_ACCESS  = 0x1100, // Read & Bus Error in cache access
241    };
242
243    // miss types for data cache
244    enum dcache_miss_type_e
245    {
246        PTE1_MISS,
247        PTE2_MISS,
248        PROC_MISS,
249    };
250
251public:
252    sc_in<bool>                                p_clk;
253    sc_in<bool>                                p_resetn;
254    sc_in<bool>                                p_irq[iss_t::n_irq];
255    soclib::caba::VciInitiator<vci_param>      p_vci;
256    soclib::caba::DspinInput<dspin_in_width>   p_dspin_m2p;
257    soclib::caba::DspinOutput<dspin_out_width> p_dspin_p2m;
258    soclib::caba::DspinInput<dspin_in_width>   p_dspin_clack;
259
260private:
261
262    // STRUCTURAL PARAMETERS
263    soclib::common::AddressDecodingTable<uint64_t, bool> m_cacheability_table;
264
265    const size_t   m_srcid;
266    const size_t   m_cc_global_id;
267    const size_t   m_nline_width;
268    const size_t   m_itlb_ways;
269    const size_t   m_itlb_sets;
270    const size_t   m_dtlb_ways;
271    const size_t   m_dtlb_sets;
272    const size_t   m_icache_ways;
273    const size_t   m_icache_sets;
274    const paddr_t  m_icache_yzmask;
275    const size_t   m_icache_words;
276    const size_t   m_dcache_ways;
277    const size_t   m_dcache_sets;
278    const paddr_t  m_dcache_yzmask;
279    const size_t   m_dcache_words;
280    const size_t   m_x_width;
281    const size_t   m_y_width;
282    const size_t   m_proc_id;
283    const uint32_t m_max_frozen_cycles;
284    const size_t   m_paddr_nbits;
285    uint32_t       m_debug_start_cycle;
286    bool           m_debug_ok;
287
288    uint32_t       m_dcache_paddr_ext_reset;
289    uint32_t       m_icache_paddr_ext_reset;
290
291    ////////////////////////////////////////
292    // Communication with processor ISS
293    ////////////////////////////////////////
294    typename iss_t::InstructionRequest  m_ireq;
295    typename iss_t::InstructionResponse m_irsp;
296    typename iss_t::DataRequest         m_dreq;
297    typename iss_t::DataResponse        m_drsp;
298
299    /////////////////////////////////////////////
300    // debug variables
301    /////////////////////////////////////////////
302    bool     m_debug_previous_i_hit;
303    bool     m_debug_previous_d_hit;
304    bool     m_debug_icache_fsm;
305    bool     m_debug_dcache_fsm;
306    bool     m_debug_cmd_fsm;
307    uint32_t m_previous_status;
308
309
310    ///////////////////////////////
311    // Software visible REGISTERS
312    ///////////////////////////////
313    sc_signal<uint32_t> r_mmu_ptpr;    // page table pointer register
314    sc_signal<uint32_t> r_mmu_mode;    // mmu mode register
315    sc_signal<uint32_t> r_mmu_word_lo; // mmu misc data low
316    sc_signal<uint32_t> r_mmu_word_hi; // mmu misc data hight
317    sc_signal<uint32_t> r_mmu_ibvar;   // mmu bad instruction address
318    sc_signal<uint32_t> r_mmu_dbvar;   // mmu bad data address
319    sc_signal<uint32_t> r_mmu_ietr;    // mmu instruction error type
320    sc_signal<uint32_t> r_mmu_detr;    // mmu data error type
321    uint32_t            r_mmu_params;  // read-only
322    uint32_t            r_mmu_release; // read_only
323
324
325    //////////////////////////////
326    // ICACHE FSM REGISTERS
327    //////////////////////////////
328    sc_signal<int>          r_icache_fsm;               // state register
329    sc_signal<int>          r_icache_fsm_save;          // return state for coherence op
330    sc_signal<paddr_t>      r_icache_vci_paddr;         // physical address
331    sc_signal<uint32_t>     r_icache_vaddr_save;        // virtual address from processor
332
333    // icache miss handling
334    sc_signal<size_t>       r_icache_miss_way;          // selected way for cache update
335    sc_signal<size_t>       r_icache_miss_set;          // selected set for cache update
336    sc_signal<size_t>       r_icache_miss_word;         // word index ( cache update)
337    sc_signal<bool>         r_icache_miss_clack;        // waiting for a cleanup acknowledge
338
339    // icache flush handling
340    sc_signal<size_t>       r_icache_flush_count;       // slot counter used for cache flush
341
342    // communication between ICACHE FSM and VCI_CMD FSM
343    sc_signal<bool>         r_icache_miss_req;          // cached read miss
344    sc_signal<bool>         r_icache_unc_req;           // uncached read miss
345
346    // communication between ICACHE FSM and DCACHE FSM
347    sc_signal<bool>         r_icache_tlb_miss_req;      // (set icache/reset dcache)
348    sc_signal<bool>         r_icache_tlb_rsp_error;     // tlb miss response error
349
350    // Physical address extension for data access
351    sc_signal<uint32_t>     r_icache_paddr_ext;         // CP2 register (if vci_address > 32)
352
353    ///////////////////////////////
354    // DCACHE FSM REGISTERS
355    ///////////////////////////////
356    sc_signal<int>          r_dcache_fsm;               // state register
357    sc_signal<int>          r_dcache_fsm_scan_save;     // return state for tlb scan op
358    // registers written in P0 stage (used in P1 stage)
359    sc_signal<bool>         r_dcache_wbuf_req;          // WBUF must be written in P1 stage
360    sc_signal<bool>         r_dcache_updt_req;          // DCACHE must be updated in P1 stage
361    sc_signal<uint32_t>     r_dcache_save_vaddr;        // virtual address (from proc)
362    sc_signal<uint32_t>     r_dcache_save_wdata;        // write data (from proc)
363    sc_signal<uint32_t>     r_dcache_save_be;           // byte enable (from proc)
364    sc_signal<paddr_t>      r_dcache_save_paddr;        // physical address
365    sc_signal<size_t>       r_dcache_save_cache_way;    // selected way (from dcache)
366    sc_signal<size_t>       r_dcache_save_cache_set;    // selected set (from dcache)
367    sc_signal<size_t>       r_dcache_save_cache_word;   // selected word (from dcache)
368    // registers used by the Dirty bit sub-fsm
369    sc_signal<paddr_t>      r_dcache_dirty_paddr;       // PTE physical address
370    sc_signal<size_t>       r_dcache_dirty_way;         // way to invalidate in dcache
371    sc_signal<size_t>       r_dcache_dirty_set;         // set to invalidate in dcache
372
373    // communication between DCACHE FSM and VCI_CMD FSM
374    sc_signal<paddr_t>      r_dcache_vci_paddr;         // physical address for VCI command
375    sc_signal<uint32_t>     r_dcache_vci_wdata;         // write unc data for VCI command
376    sc_signal<bool>         r_dcache_vci_miss_req;      // read miss request
377    sc_signal<bool>         r_dcache_vci_unc_req;       // uncacheable request (read/write)
378    sc_signal<uint32_t>     r_dcache_vci_unc_be;        // uncacheable byte enable
379    sc_signal<uint32_t>     r_dcache_vci_unc_write;     // uncacheable data write request
380    sc_signal<bool>         r_dcache_vci_cas_req;       // atomic write request CAS
381    sc_signal<uint32_t>     r_dcache_vci_cas_old;       // previous data value for a CAS
382    sc_signal<uint32_t>     r_dcache_vci_cas_new;       // new data value for a CAS
383    sc_signal<bool>         r_dcache_vci_ll_req;        // atomic read request LL
384    sc_signal<bool>         r_dcache_vci_sc_req;        // atomic write request SC
385    sc_signal<uint32_t>     r_dcache_vci_sc_data;       // SC data (command)
386
387    // register used for XTN inval
388    sc_signal<size_t>       r_dcache_xtn_way;           // selected way (from dcache)
389    sc_signal<size_t>       r_dcache_xtn_set;           // selected set (from dcache)
390
391    // handling dcache miss
392    sc_signal<int>          r_dcache_miss_type;         // depending on the requester
393    sc_signal<size_t>       r_dcache_miss_word;         // word index for cache update
394    sc_signal<size_t>       r_dcache_miss_way;          // selected way for cache update
395    sc_signal<size_t>       r_dcache_miss_set;          // selected set for cache update
396    sc_signal<paddr_t>      r_dcache_miss_victim;       // selected set for cache update
397
398    // dcache flush handling
399    sc_signal<size_t>       r_dcache_flush_count;       // slot counter used for cache flush
400
401    // ll response handling
402    sc_signal<size_t>       r_dcache_ll_rsp_count;      // flit counter used for ll rsp
403
404    // used by the TLB miss sub-fsm
405    sc_signal<uint32_t>     r_dcache_tlb_vaddr;         // virtual address for a tlb miss
406    sc_signal<bool>         r_dcache_tlb_ins;           // target tlb (itlb if true)
407    sc_signal<paddr_t>      r_dcache_tlb_paddr;         // physical address of pte
408    sc_signal<uint32_t>     r_dcache_tlb_pte_flags;     // pte1 or first word of pte2
409    sc_signal<uint32_t>     r_dcache_tlb_pte_ppn;       // second word of pte2
410    sc_signal<size_t>       r_dcache_tlb_cache_way;     // selected way in dcache
411    sc_signal<size_t>       r_dcache_tlb_cache_set;     // selected set in dcache
412    sc_signal<size_t>       r_dcache_tlb_cache_word;    // selected word in dcache
413    sc_signal<size_t>       r_dcache_tlb_way;           // selected way in tlb
414    sc_signal<size_t>       r_dcache_tlb_set;           // selected set in tlb
415
416    // ITLB and DTLB invalidation
417    sc_signal<paddr_t>      r_dcache_tlb_inval_line;    // line index
418    sc_signal<size_t>       r_dcache_tlb_inval_set;     // tlb set counter
419
420    // communication between DCACHE FSM and ICACHE FSM
421    sc_signal<bool>         r_dcache_xtn_req;           // xtn request (caused by processor)
422    sc_signal<int>          r_dcache_xtn_opcode;        // xtn request type
423
424    // dcache directory extension
425    bool                   *r_dcache_in_tlb;            // copy exist in dtlb or itlb
426    bool                   *r_dcache_contains_ptd;      // cache line contains a PTD
427
428    // Physical address extension for data access
429    sc_signal<uint32_t>     r_dcache_paddr_ext;         // CP2 register (if vci_address > 32)
430
431    ///////////////////////////////////
432    // VCI_CMD FSM REGISTERS
433    ///////////////////////////////////
434    sc_signal<int>          r_vci_cmd_fsm;
435    sc_signal<size_t>       r_vci_cmd_min;        // used for write bursts
436    sc_signal<size_t>       r_vci_cmd_max;        // used for write bursts
437    sc_signal<size_t>       r_vci_cmd_cpt;        // used for write bursts
438    sc_signal<bool>         r_vci_cmd_imiss_prio; // round-robin between imiss & dmiss
439
440    ///////////////////////////////////
441    // VCI_RSP FSM REGISTERS
442    ///////////////////////////////////
443    sc_signal<int>          r_vci_rsp_fsm;
444    sc_signal<size_t>       r_vci_rsp_cpt;
445    sc_signal<bool>         r_vci_rsp_ins_error;
446    sc_signal<bool>         r_vci_rsp_data_error;
447    GenericFifo<uint32_t>   r_vci_rsp_fifo_icache;      // response FIFO to ICACHE FSM
448    GenericFifo<uint32_t>   r_vci_rsp_fifo_dcache;      // response FIFO to DCACHE FSM
449
450    //////////////////////////////////////////////////////////////////
451    // processor, write buffer, caches , TLBs
452    //////////////////////////////////////////////////////////////////
453
454    iss_t                       r_iss;
455    MultiWriteBuffer<paddr_t>   r_wbuf;
456    GenericCache<paddr_t>       r_icache;
457    GenericCache<paddr_t>       r_dcache;
458    GenericTlb<paddr_t>         r_itlb;
459    GenericTlb<paddr_t>         r_dtlb;
460
461    //////////////////////////////////////////////////////////////////
462    // llsc registration buffer
463    //////////////////////////////////////////////////////////////////
464
465    sc_signal<paddr_t>  r_dcache_llsc_paddr;
466    sc_signal<uint32_t> r_dcache_llsc_key;
467    sc_signal<uint32_t> r_dcache_llsc_count;
468    sc_signal<bool>     r_dcache_llsc_valid;
469
470    ////////////////////////////////
471    // Activity counters
472    ////////////////////////////////
473    uint32_t m_cpt_dcache_data_read;        // DCACHE DATA READ
474    uint32_t m_cpt_dcache_data_write;       // DCACHE DATA WRITE
475    uint32_t m_cpt_dcache_dir_read;         // DCACHE DIR READ
476    uint32_t m_cpt_dcache_dir_write;        // DCACHE DIR WRITE
477
478    uint32_t m_cpt_icache_data_read;        // ICACHE DATA READ
479    uint32_t m_cpt_icache_data_write;       // ICACHE DATA WRITE
480    uint32_t m_cpt_icache_dir_read;         // ICACHE DIR READ
481    uint32_t m_cpt_icache_dir_write;        // ICACHE DIR WRITE
482
483    uint32_t m_cpt_frz_cycles;              // number of cycles where the cpu is frozen
484    uint32_t m_cpt_total_cycles;            // total number of cycles
485
486    // Cache activity counters
487    uint32_t m_cpt_data_read;               // total number of read data
488    uint32_t m_cpt_data_write;              // total number of write data
489    uint32_t m_cpt_data_miss;               // number of read miss
490    uint32_t m_cpt_ins_miss;                // number of instruction miss
491    uint32_t m_cpt_unc_read;                // number of read uncached
492    uint32_t m_cpt_write_cached;            // number of cached write
493    uint32_t m_cpt_ins_read;                // number of instruction read
494    uint32_t m_cpt_ins_spc_miss;            // number of speculative instruction miss
495
496    uint32_t m_cost_write_frz;              // number of frozen cycles related to write buffer
497    uint32_t m_cost_data_miss_frz;          // number of frozen cycles related to data miss
498    uint32_t m_cost_unc_read_frz;           // number of frozen cycles related to uncached read
499    uint32_t m_cost_ins_miss_frz;           // number of frozen cycles related to ins miss
500
501    uint32_t m_cpt_imiss_transaction;       // number of VCI instruction miss transactions
502    uint32_t m_cpt_dmiss_transaction;       // number of VCI data miss transactions
503    uint32_t m_cpt_unc_transaction;         // number of VCI uncached read transactions
504    uint32_t m_cpt_write_transaction;       // number of VCI write transactions
505    uint32_t m_cpt_icache_unc_transaction;
506
507    uint32_t m_cost_imiss_transaction;      // cumulated duration for VCI IMISS transactions
508    uint32_t m_cost_dmiss_transaction;      // cumulated duration for VCI DMISS transactions
509    uint32_t m_cost_unc_transaction;        // cumulated duration for VCI UNC transactions
510    uint32_t m_cost_write_transaction;      // cumulated duration for VCI WRITE transactions
511    uint32_t m_cost_icache_unc_transaction; // cumulated duration for VCI IUNC transactions
512    uint32_t m_length_write_transaction;    // cumulated length for VCI WRITE transactions
513
514    // TLB activity counters
515    uint32_t m_cpt_ins_tlb_read;            // number of instruction tlb read
516    uint32_t m_cpt_ins_tlb_miss;            // number of instruction tlb miss
517    uint32_t m_cpt_ins_tlb_update_acc;      // number of instruction tlb update
518    uint32_t m_cpt_ins_tlb_occup_cache;     // number of instruction tlb occupy data cache line
519    uint32_t m_cpt_ins_tlb_hit_dcache;      // number of instruction tlb hit in data cache
520
521    uint32_t m_cpt_data_tlb_read;           // number of data tlb read
522    uint32_t m_cpt_data_tlb_miss;           // number of data tlb miss
523    uint32_t m_cpt_data_tlb_update_acc;     // number of data tlb update
524    uint32_t m_cpt_data_tlb_update_dirty;   // number of data tlb update dirty
525    uint32_t m_cpt_data_tlb_hit_dcache;     // number of data tlb hit in data cache
526    uint32_t m_cpt_data_tlb_occup_cache;    // number of data tlb occupy data cache line
527    uint32_t m_cpt_tlb_occup_dcache;
528
529    uint32_t m_cost_ins_tlb_miss_frz;       // number of frozen cycles related to instruction tlb miss
530    uint32_t m_cost_data_tlb_miss_frz;      // number of frozen cycles related to data tlb miss
531    uint32_t m_cost_ins_tlb_update_acc_frz;    // number of frozen cycles related to instruction tlb update acc
532    uint32_t m_cost_data_tlb_update_acc_frz;   // number of frozen cycles related to data tlb update acc
533    uint32_t m_cost_data_tlb_update_dirty_frz; // number of frozen cycles related to data tlb update dirty
534    uint32_t m_cost_ins_tlb_occup_cache_frz;   // number of frozen cycles related to instruction tlb miss operate in dcache
535    uint32_t m_cost_data_tlb_occup_cache_frz;  // number of frozen cycles related to data tlb miss operate in dcache
536
537    uint32_t m_cpt_itlbmiss_transaction;       // number of itlb miss transactions
538    uint32_t m_cpt_itlb_ll_transaction;        // number of itlb ll acc transactions
539    uint32_t m_cpt_itlb_sc_transaction;        // number of itlb sc acc transactions
540    uint32_t m_cpt_dtlbmiss_transaction;       // number of dtlb miss transactions
541    uint32_t m_cpt_dtlb_ll_transaction;        // number of dtlb ll acc transactions
542    uint32_t m_cpt_dtlb_sc_transaction;        // number of dtlb sc acc transactions
543    uint32_t m_cpt_dtlb_ll_dirty_transaction;  // number of dtlb ll dirty transactions
544    uint32_t m_cpt_dtlb_sc_dirty_transaction;  // number of dtlb sc dirty transactions
545
546    uint32_t m_cost_itlbmiss_transaction;       // cumulated duration for VCI instruction TLB miss transactions
547    uint32_t m_cost_itlb_ll_transaction;        // cumulated duration for VCI instruction TLB ll acc transactions
548    uint32_t m_cost_itlb_sc_transaction;        // cumulated duration for VCI instruction TLB sc acc transactions
549    uint32_t m_cost_dtlbmiss_transaction;       // cumulated duration for VCI data TLB miss transactions
550    uint32_t m_cost_dtlb_ll_transaction;        // cumulated duration for VCI data TLB ll acc transactions
551    uint32_t m_cost_dtlb_sc_transaction;        // cumulated duration for VCI data TLB sc acc transactions
552    uint32_t m_cost_dtlb_ll_dirty_transaction;  // cumulated duration for VCI data TLB ll dirty transactions
553    uint32_t m_cost_dtlb_sc_dirty_transaction;  // cumulated duration for VCI data TLB sc dirty transactions
554
555    // coherence activity counters
556    uint32_t m_cpt_cc_update_icache;            // number of coherence update instruction commands
557    uint32_t m_cpt_cc_update_dcache;            // number of coherence update data commands
558    uint32_t m_cpt_cc_inval_icache;             // number of coherence inval instruction commands
559    uint32_t m_cpt_cc_inval_dcache;             // number of coherence inval data commands
560    uint32_t m_cpt_cc_broadcast;                // number of coherence broadcast commands
561
562    uint32_t m_cost_updt_data_frz;              // number of frozen cycles related to coherence update data packets
563    uint32_t m_cost_inval_ins_frz;              // number of frozen cycles related to coherence inval instruction packets
564    uint32_t m_cost_inval_data_frz;             // number of frozen cycles related to coherence inval data packets
565    uint32_t m_cost_broadcast_frz;              // number of frozen cycles related to coherence broadcast packets
566
567    uint32_t m_cpt_cc_cleanup_ins;              // number of coherence cleanup packets
568    uint32_t m_cpt_cc_cleanup_data;             // number of coherence cleanup packets
569
570    uint32_t m_cpt_icleanup_transaction;        // number of instruction cleanup transactions
571    uint32_t m_cpt_dcleanup_transaction;        // number of instructinumber of data cleanup transactions
572    uint32_t m_cost_icleanup_transaction;       // cumulated duration for VCI instruction cleanup transactions
573    uint32_t m_cost_dcleanup_transaction;       // cumulated duration for VCI data cleanup transactions
574
575    uint32_t m_cost_ins_tlb_inval_frz;          // number of frozen cycles related to checking ins tlb invalidate
576    uint32_t m_cpt_ins_tlb_inval;               // number of ins tlb invalidate
577
578    uint32_t m_cost_data_tlb_inval_frz;         // number of frozen cycles related to checking data tlb invalidate
579    uint32_t m_cpt_data_tlb_inval;              // number of data tlb invalidate
580
581    // FSM activity counters
582    uint32_t m_cpt_fsm_icache[64];
583    uint32_t m_cpt_fsm_dcache[64];
584    uint32_t m_cpt_fsm_cmd[64];
585    uint32_t m_cpt_fsm_rsp[64];
586
587    uint32_t m_cpt_stop_simulation;     // used to stop simulation if frozen
588    bool     m_monitor_ok;              // used to debug cache output 
589    uint32_t m_monitor_base;
590    uint32_t m_monitor_length;
591
592    // Members for ideal coherence updates
593    std::list<VcacheUpdate> m_dpending_updates;
594    std::list<VcacheUpdate> m_ipending_updates;
595
596protected:
597    SC_HAS_PROCESS(VciCcVCacheWrapper);
598
599public:
600    VciCcVCacheWrapper(
601        sc_module_name name,
602        const int proc_id,
603        const soclib::common::MappingTable &mtd,
604        const soclib::common::IntTab       &srcid,
605        const size_t cc_global_id,
606        const size_t itlb_ways,
607        const size_t itlb_sets,
608        const size_t dtlb_ways,
609        const size_t dtlb_sets,
610        const size_t icache_ways,
611        const size_t icache_sets,
612        const size_t icache_words,
613        const size_t dcache_ways,
614        const size_t dcache_sets,
615        const size_t dcache_words,
616        const size_t wbuf_nlines,
617        const size_t wbuf_nwords,
618        const size_t x_width,
619        const size_t y_width,
620        const uint32_t max_frozen_cycles,
621        const uint32_t debug_start_cycle,
622        const bool     debug_ok);
623
624    ~VciCcVCacheWrapper();
625
626    void cache_direct_update(uint64_t addr, uint32_t value, uint32_t be, int32_t srcid);
627    void print_cpi();
628    void print_stats();
629    void clear_stats();
630    void print_trace(size_t mode = 0);
631    void cache_monitor(paddr_t addr);
632    void start_monitor(paddr_t,paddr_t);
633    void stop_monitor();
634    inline void iss_set_debug_mask(uint v) 
635    {
636        r_iss.set_debug_mask(v);
637    }
638
639    /////////////////////////////////////////////////////////////
640    // Set the m_dcache_paddr_ext_reset attribute
641    //
642    // The r_dcache_paddr_ext register will be initialized after
643    // reset with the m_dcache_paddr_ext_reset value
644    /////////////////////////////////////////////////////////////
645    inline void set_dcache_paddr_ext_reset(uint32_t v)
646    {
647        m_dcache_paddr_ext_reset = v;
648    }
649
650    /////////////////////////////////////////////////////////////
651    // Set the m_icache_paddr_ext_reset attribute
652    //
653    // The r_icache_paddr_ext register will be initialized after
654    // reset with the m_icache_paddr_ext_reset value
655    /////////////////////////////////////////////////////////////
656    inline void set_icache_paddr_ext_reset(uint32_t v)
657    {
658        m_icache_paddr_ext_reset = v;
659    }
660
661private:
662    void transition();
663    void genMoore();
664
665    soclib_static_assert((int) iss_t::SC_ATOMIC == (int) vci_param::STORE_COND_ATOMIC);
666    soclib_static_assert((int) iss_t::SC_NOT_ATOMIC == (int) vci_param::STORE_COND_NOT_ATOMIC);
667};
668
669
670}}
671
672#endif /* SOCLIB_CABA_VCI_CC_VCACHE_WRAPPER_H */
673
674// Local Variables:
675// tab-width: 4
676// c-basic-offset: 4
677// c-file-offsets:((innamespace . 0)(inline-open . 0))
678// indent-tabs-mode: nil
679// End:
680
681// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
Note: See TracBrowser for help on using the repository browser.