source: trunk/modules/vci_cc_xcache_wrapper_v4_cmp/caba/source/include/vci_cc_xcache_wrapper_v4_cmp.h @ 163

Last change on this file since 163 was 152, checked in by kane, 13 years ago

Re add vci_cc_xcache_wrapper_v4 "multi-cache" edition and (1) fix error (2) add direction MWBUF_VHDL_TESTBENCH to generate a testbench for the multi_write_buffer VHDL model.

File size: 22.6 KB
Line 
1/* -*- c++ -*-
2 *
3 * SOCLIB_LGPL_HEADER_BEGIN
4 *
5 * This file is part of SoCLib, GNU LGPLv2.1.
6 *
7 * SoCLib is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; version 2.1 of the License.
10 *
11 * SoCLib is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with SoCLib; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 * SOCLIB_LGPL_HEADER_END
22 *
23 * Copyright (c) UPMC, Lip6, SoC
24 *         Alain Greiner <alain.greiner@lip6.fr>, 2008
25 *
26 * Maintainers: alain
27 */
28 
29#ifndef SOCLIB_CABA_VCI_CC_XCACHE_WRAPPER_V4_CMP_H
30#define SOCLIB_CABA_VCI_CC_XCACHE_WRAPPER_V4_CMP_H
31
32#include <inttypes.h>
33#include <fstream>
34#include <systemc>
35#include <queue>
36#include "caba_base_module.h"
37#include "multi_write_buffer.h"
38#include "generic_cache.h"
39#include "vci_initiator.h"
40#include "vci_target.h"
41#include "mapping_table.h"
42#include "static_assert.h"
43
44/*
45 * ----------------------------------------------------------
46 * Implementation
47 * ----------------------------------------------------------
48 *
49 * CC_XCACHE_WRAPPER_FIFO_RSP
50 *   Two simple fifo (each 2x32 depth) receive the cache line from
51 *   RAM. Instead of two buffers (m_icache_words and m_dcache_words)
52 *    1     - nb_icache+nb_dcache simple fifo
53 *    2     - 2 simple fifo
54 *    else  - two buffers  (m_icache_words and m_dcache_words)
55 *   
56 * CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE
57 *   Update cache in "2*cache_words" cycles (read+mask, write)
58 *   
59 * CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE_OPT
60 *   Update cache with only modified data (be != 0)
61 *   
62 * CC_XCACHE_WRAPPER_VCI_CMD_PRIORITY
63 *   Write buffer access is conditionnal with dcache_miss_req and icache_miss_req
64 *     1    - one access with static priority (dcache prior)
65 *     2    - one access with static priority (icache prior)
66 *     3    - one access with round robin priority
67 *     4    - two access authorized
68 *
69 * CC_XCACHE_WRAPPER_MULTI_CACHE
70 *     1    - icache static partitionnement
71 *     2    - icache dedicated
72 *
73 * CC_XCACHE_WRAPPER_MULTI_CACHE_HIT_AFTER_MISS
74 *   (In multi-cache)
75 *   A dcache used by a cpu and in miss_wait state can be use by
76 *   an another cpu to make a load cached access.
77 *
78 * CC_XCACHE_WRAPPER_STORE_AFTER_STORE
79 *   Store access in dcache (and hit) is make in two cycle :
80 *    - first read directory and read data
81 *    - second make a mask with old data and write new data.
82 *   If data part has a write enable per byte, read data access can be suppress
83 *   and we can pipeline consecutive store access.
84 *
85 * ----------------------------------------------------------
86 * Debug
87 * ----------------------------------------------------------
88 *
89 * CC_XCACHE_WRAPPER_STOP_SIMULATION
90 *   stop simulation if processor is stall after a long time
91 *   (configurable with "stop_simulation" function)
92 *
93 * CC_XCACHE_WRAPPER_DEBUG
94 *   Add log to help the debugging
95 *
96 * CC_XCACHE_WRAPPER_DEBUG_CYCLE_MIN
97 *   Number of cycle before to prinf debug message
98 *
99 * CC_XCACHE_WRAPPER_DEBUG_FILE_TRANSACTION
100 *   Print transaction between :
101 *     - the cpu and the cache (icache and dcache)
102 *     - vci
103 *     - cleanup
104 *     - coherency
105 *
106 * MWBUF_VHDL_TESTBENCH
107 *   generate a vhdl testbench for multi write buffer
108 */
109
110// implementation
111#ifndef CC_XCACHE_WRAPPER_FIFO_RSP
112#define CC_XCACHE_WRAPPER_FIFO_RSP                    2
113#endif
114#ifndef CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE
115#define CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE       1
116#endif
117#ifndef CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE_OPT
118#define CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE_OPT   1
119#endif
120#ifndef CC_XCACHE_WRAPPER_VCI_CMD_PRIORITY
121#define CC_XCACHE_WRAPPER_VCI_CMD_PRIORITY            3
122#endif
123#ifndef CC_XCACHE_WRAPPER_MULTI_CACHE
124#define CC_XCACHE_WRAPPER_MULTI_CACHE                 2
125// if multi_cache :
126// <tsar toplevel>/modules/vci_mem_cache_v4_cmp/caba/source/include/mem_cache_directory_v4_cmp.h : L1_MULTI_CACHE 1
127// <soclib toplevel>/soclib/lib/multi_write_buffer/include/multi_write_buffer.h          : CC_XCACHE_MULTI_CACHE 1
128#endif
129#ifndef CC_XCACHE_WRAPPER_MULTI_CACHE_HIT_AFTER_MISS
130#define CC_XCACHE_WRAPPER_MULTI_CACHE_HIT_AFTER_MISS  1
131#endif
132#ifndef CC_XCACHE_WRAPPER_STORE_AFTER_STORE
133#define CC_XCACHE_WRAPPER_STORE_AFTER_STORE           1
134#endif
135 
136// debug
137#ifndef CC_XCACHE_WRAPPER_VERBOSE
138#define CC_XCACHE_WRAPPER_VERBOSE                     0
139#endif
140#ifndef CC_XCACHE_WRAPPER_STOP_SIMULATION
141#define CC_XCACHE_WRAPPER_STOP_SIMULATION             1
142#endif
143#ifndef CC_XCACHE_WRAPPER_DEBUG
144#define CC_XCACHE_WRAPPER_DEBUG                       0
145#endif
146#ifndef CC_XCACHE_WRAPPER_DEBUG_CYCLE_MIN
147#define CC_XCACHE_WRAPPER_DEBUG_CYCLE_MIN             0
148#endif
149#ifndef CC_XCACHE_WRAPPER_DEBUG_FILE_TRANSACTION
150#define CC_XCACHE_WRAPPER_DEBUG_FILE_TRANSACTION      0
151#define CC_XCACHE_WRAPPER_DEBUG_FILE_TRANSACTION_PATH "log"
152#endif
153#ifndef MWBUF_VHDL_TESTBENCH
154#define MWBUF_VHDL_TESTBENCH                          0
155#endif
156
157// don't change
158#if not CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE
159#undef  CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE_OPT
160#define CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE_OPT   0
161#endif
162
163namespace soclib {
164namespace caba {
165
166using namespace sc_core;
167
168////////////////////////////////////////////
169template<typename vci_param, typename iss_t>
170class VciCcXCacheWrapperV4_CMP
171///////////////////////////////////////////
172    : public soclib::caba::BaseModule
173{
174    typedef uint64_t            vhdl_tb_t;
175    typedef sc_dt::sc_uint<40>  addr_40;
176    typedef sc_dt::sc_uint<64>  data_64;
177    typedef uint32_t            data_t;
178    typedef uint32_t            tag_t;
179    typedef uint32_t            be_t;
180    typedef typename vci_param::fast_addr_t vci_addr_t;
181    typedef  enum
182        {
183            WRITE_THROUGH,
184            RELEASE_WRITE_THROUGH
185        } write_policy_t;
186   
187    enum dcache_fsm_state_e {
188        DCACHE_IDLE,
189        DCACHE_WRITE_UPDT,
190        DCACHE_MISS_VICTIM,
191        DCACHE_MISS_WAIT,
192        DCACHE_MISS_UPDT,
193        DCACHE_UNC_WAIT,
194        DCACHE_SC_WAIT,
195        DCACHE_INVAL,
196        DCACHE_SYNC,
197        DCACHE_ERROR,
198        DCACHE_CC_CHECK,
199        DCACHE_CC_INVAL,
200        DCACHE_CC_UPDT,
201        DCACHE_CC_CLEANUP,
202    };
203
204    enum icache_fsm_state_e {
205        ICACHE_IDLE,
206        ICACHE_MISS_VICTIM,
207        ICACHE_MISS_WAIT,
208        ICACHE_MISS_UPDT,
209        ICACHE_UNC_WAIT,
210        ICACHE_ERROR,
211        ICACHE_CC_CLEANUP, 
212        ICACHE_CC_CHECK,
213        ICACHE_CC_INVAL,
214        ICACHE_CC_UPDT,
215    };
216
217    enum cmd_fsm_state_e {
218        CMD_IDLE,
219        CMD_INS_MISS,
220        CMD_INS_UNC,
221        CMD_DATA_MISS,
222        CMD_DATA_UNC,
223        CMD_DATA_WRITE,
224        CMD_DATA_SC,
225    };
226
227    enum rsp_fsm_state_e {
228        RSP_IDLE,
229        RSP_INS_MISS,
230        RSP_INS_UNC,
231        RSP_DATA_MISS,
232        RSP_DATA_UNC,
233        RSP_DATA_WRITE,
234        RSP_DATA_SC,
235    };
236
237    enum tgt_fsm_state_e {
238        TGT_IDLE,
239        TGT_UPDT_WORD,
240        TGT_UPDT_DATA,
241        TGT_REQ_BROADCAST,
242        TGT_REQ_ICACHE,
243        TGT_REQ_DCACHE,
244        TGT_RSP_BROADCAST,
245        TGT_RSP_ICACHE,
246        TGT_RSP_DCACHE,
247    };
248
249    enum cleanup_fsm_state_e {
250        CLEANUP_IDLE,
251        CLEANUP_REQ,
252        CLEANUP_RSP_DCACHE,
253        CLEANUP_RSP_ICACHE,
254    };
255
256    enum transaction_type_c_e {
257        // convention with memcache
258        TYPE_DATA_CLEANUP = 0x0,
259        TYPE_INS_CLEANUP  = 0x1
260    };
261
262    enum transaction_type_rw_e {
263        // convention with memcache
264        // b0 : 1 if cached
265        // b1 : 1 if instruction
266        // b2 : 1 if sc
267        TYPE_DATA_UNC     = 0x0,
268        TYPE_DATA_MISS    = 0x1,
269        TYPE_INS_UNC      = 0x2,
270        TYPE_INS_MISS     = 0x3,
271        TYPE_DATA_SC      = 0x4, // sc is data and no cached
272    };
273
274public:
275
276    // PORTS
277    sc_in<bool>                             p_clk;
278    sc_in<bool>                             p_resetn;
279    sc_in<bool>                          ** p_irq;//[m_nb_cpu][iss_t::n_irq];
280    soclib::caba::VciInitiator<vci_param>   p_vci_ini_rw;
281    soclib::caba::VciInitiator<vci_param>   p_vci_ini_c;
282    soclib::caba::VciTarget<vci_param>      p_vci_tgt;
283
284private:
285
286    // STRUCTURAL PARAMETERS
287    const soclib::common::AddressDecodingTable<vci_addr_t, bool>    m_cacheability_table;
288    const soclib::common::Segment                                   m_segment;
289    iss_t            ** m_iss; //[m_nb_cpu]
290    const uint32_t      m_srcid_rw;   
291    const uint32_t      m_srcid_c;   
292   
293    const size_t         m_nb_cpu;
294    const size_t         m_nb_icache;
295    const size_t         m_nb_dcache;
296    const size_t         m_nb_cache;
297    const size_t         m_dcache_ways;
298    const size_t         m_dcache_words;
299    const uint32_t       m_dcache_words_shift;
300    const size_t         m_dcache_yzmask;
301    const size_t         m_icache_ways;
302    const size_t         m_icache_words;
303    const uint32_t       m_icache_words_shift;
304    const size_t         m_icache_yzmask;
305    const write_policy_t m_write_policy;
306    const size_t         m_cache_words; // max between m_dcache_words and m_icache_words
307
308#if CC_XCACHE_WRAPPER_STOP_SIMULATION
309    bool                m_stop_simulation;
310    uint32_t            m_stop_simulation_nb_frz_cycles_max;
311    uint32_t          * m_stop_simulation_nb_frz_cycles; //[m_nb_cpu]
312#endif // CC_XCACHE_WRAPPER_STOP_SIMULATION
313
314    // REGISTERS
315    sc_signal<uint32_t>     r_cpu_prior;
316    sc_signal<uint32_t>   * r_icache_lock;//[m_nb_icache]
317    sc_signal<uint32_t>   * r_dcache_lock;//[m_nb_dcache]
318    sc_signal<bool>       * r_dcache_sync;//[m_nb_dcache]
319
320    sc_signal<int>        * r_dcache_fsm;          //[m_nb_dcache]
321    sc_signal<int>        * r_dcache_fsm_save;     //[m_nb_dcache]
322    sc_signal<addr_40>    * r_dcache_addr_save;    //[m_nb_dcache]
323    sc_signal<data_t>     * r_dcache_wdata_save;   //[m_nb_dcache]
324    sc_signal<data_t>     * r_dcache_rdata_save;   //[m_nb_dcache]
325    sc_signal<int>        * r_dcache_type_save;    //[m_nb_dcache]
326    sc_signal<be_t>       * r_dcache_be_save;      //[m_nb_dcache]
327    sc_signal<bool>       * r_dcache_cached_save;  //[m_nb_dcache]
328    sc_signal<uint32_t>   * r_dcache_num_cpu_save; //[m_nb_dcache]
329    sc_signal<bool>       * r_dcache_cleanup_req;  //[m_nb_dcache]
330    sc_signal<addr_40>    * r_dcache_cleanup_line; //[m_nb_dcache]
331    sc_signal<bool>       * r_dcache_miss_req;     //[m_nb_dcache]
332    sc_signal<size_t>     * r_dcache_miss_way;     //[m_nb_dcache]
333    sc_signal<size_t>     * r_dcache_miss_set;     //[m_nb_dcache]
334    sc_signal<bool>       * r_dcache_unc_req;      //[m_nb_dcache]
335    sc_signal<bool>       * r_dcache_sc_req;       //[m_nb_dcache]
336    sc_signal<bool>       * r_dcache_inval_rsp;    //[m_nb_dcache]
337    sc_signal<size_t>     * r_dcache_update_addr;  //[m_nb_dcache]
338    sc_signal<data_64>   ** r_dcache_ll_data;      //[m_nb_dcache][m_nb_cpu]
339    sc_signal<addr_40>   ** r_dcache_ll_addr;      //[m_nb_dcache][m_nb_cpu]
340    sc_signal<bool>      ** r_dcache_ll_valid;     //[m_nb_dcache][m_nb_cpu]
341    sc_signal<bool>       * r_dcache_previous_unc; //[m_nb_dcache]
342                                                   
343    sc_signal<int>        * r_icache_fsm;          //[m_nb_icache]
344    sc_signal<int>        * r_icache_fsm_save;     //[m_nb_icache]
345    sc_signal<addr_40>    * r_icache_addr_save;    //[m_nb_icache]
346    sc_signal<bool>       * r_icache_miss_req;     //[m_nb_icache]
347    sc_signal<size_t>     * r_icache_miss_way;     //[m_nb_icache]
348    sc_signal<size_t>     * r_icache_miss_set;     //[m_nb_icache]
349    sc_signal<bool>       * r_icache_unc_req;      //[m_nb_icache]
350    sc_signal<bool>       * r_icache_cleanup_req;  //[m_nb_icache]
351    sc_signal<addr_40>    * r_icache_cleanup_line; //[m_nb_icache]
352    sc_signal<bool>       * r_icache_inval_rsp;    //[m_nb_icache]
353    sc_signal<size_t>     * r_icache_update_addr;  //[m_nb_icache]
354    sc_signal<bool>       * r_icache_buf_unc_valid;//[m_nb_icache]
355
356    sc_signal<int>          r_vci_cmd_fsm;
357    sc_signal<size_t>       r_vci_cmd_min;       
358    sc_signal<size_t>       r_vci_cmd_max;       
359    sc_signal<size_t>       r_vci_cmd_cpt;       
360    sc_signal<bool>         r_vci_cmd_dcache_prior;
361    sc_signal<uint32_t>     r_vci_cmd_num_cache;
362
363    sc_signal<int>          r_vci_rsp_fsm;
364    sc_signal<size_t>       r_vci_rsp_cpt; 
365              bool          s_vci_rsp_ack;
366    sc_signal<uint32_t>     r_vci_rsp_num_cache;
367    sc_signal<bool>       * r_vci_rsp_ins_error;  //[m_nb_icache]
368    sc_signal<bool>       * r_vci_rsp_data_error; //[m_nb_dcache]
369
370#if   (CC_XCACHE_WRAPPER_FIFO_RSP==1)
371    std::queue<data_t>    * r_icache_miss_buf;    //[m_nb_icache]
372    std::queue<data_t>    * r_dcache_miss_buf;    //[m_nb_dcache]
373#elif (CC_XCACHE_WRAPPER_FIFO_RSP==2)
374    typedef struct 
375    {
376        data_t   data;
377        uint32_t num_cache;
378    } miss_buf_t;
379
380    std::queue<miss_buf_t>  r_icache_miss_buf;
381    std::queue<miss_buf_t>  r_dcache_miss_buf;
382#else
383    bool                 ** r_icache_miss_val;    //[m_nb_icache][m_icache_words]
384    data_t               ** r_icache_miss_buf;    //[m_nb_icache][m_icache_words]
385    bool                 ** r_dcache_miss_val;    //[m_nb_dcache][m_dcache_words]
386    data_t               ** r_dcache_miss_buf;    //[m_nb_dcache][m_dcache_words]
387#endif
388    data_t                * r_tgt_buf;            //[m_cache_words]
389    be_t                  * r_tgt_be;             //[m_cache_words]
390#if CC_XCACHE_WRAPPER_CC_UPDATE_MULTI_CYCLE
391    sc_signal<uint32_t>     r_cache_word;
392#endif
393
394    sc_signal<int>          r_vci_tgt_fsm;
395    sc_signal<addr_40>      r_tgt_iaddr;
396    sc_signal<addr_40>      r_tgt_daddr;
397    sc_signal<size_t>       r_tgt_word;
398    sc_signal<bool>         r_tgt_update;
399    sc_signal<bool>         r_tgt_update_data;
400  //sc_signal<bool>         r_tgt_brdcast;
401    sc_signal<size_t>       r_tgt_srcid;
402    sc_signal<size_t>       r_tgt_pktid;
403    sc_signal<size_t>       r_tgt_trdid;
404  //sc_signal<size_t>       r_tgt_plen;
405    sc_signal<uint32_t>     r_tgt_num_cache;
406    sc_signal<bool>       * r_tgt_icache_req; //[m_nb_icache]
407    sc_signal<bool>       * r_tgt_icache_rsp; //[m_nb_icache]
408    sc_signal<bool>       * r_tgt_dcache_req; //[m_nb_dcache]
409    sc_signal<bool>       * r_tgt_dcache_rsp; //[m_nb_dcache]
410
411    sc_signal<int>          r_cleanup_fsm;              // controls initiator port of the coherence network
412    sc_signal<uint32_t>     r_cleanup_num_cache;
413    sc_signal<bool>         r_cleanup_icache;
414
415    MultiWriteBuffer<addr_40>** r_wbuf;
416    GenericCache<vci_addr_t> ** r_icache;
417    GenericCache<vci_addr_t> ** r_dcache;
418
419#if CC_XCACHE_WRAPPER_DEBUG_FILE_TRANSACTION
420    bool                        generate_log_transaction_file_icache;
421    bool                        generate_log_transaction_file_dcache;
422    bool                        generate_log_transaction_file_cmd;
423    bool                        generate_log_transaction_file_tgt;
424    bool                        generate_log_transaction_file_cleanup;
425
426    std::ofstream             * log_transaction_file_icache; //[m_nb_cpu]
427    std::ofstream             * log_transaction_file_dcache; //[m_nb_cpu]
428    std::ofstream               log_transaction_file_cmd;
429    std::ofstream               log_transaction_file_tgt;
430    std::ofstream               log_transaction_file_cleanup;
431#endif
432
433#if MWBUF_VHDL_TESTBENCH
434    bool                        simulation_started;
435    bool                        generate_vhdl_testbench_mwbuf;
436    std::ofstream             * vhdl_testbench_mwbuf; //[m_nb_dcache]
437#endif
438
439    // Activity counters
440    uint32_t   m_cpt_dcache_data_read;             // * DCACHE DATA READ
441    uint32_t   m_cpt_dcache_data_write;            // * DCACHE DATA WRITE
442    uint32_t   m_cpt_dcache_dir_read;              // * DCACHE DIR READ
443    uint32_t   m_cpt_dcache_dir_write;             // * DCACHE DIR WRITE
444                                                   
445    uint32_t   m_cpt_icache_data_read;             // * ICACHE DATA READ
446    uint32_t   m_cpt_icache_data_write;            // * ICACHE DATA WRITE
447    uint32_t   m_cpt_icache_dir_read;              // * ICACHE DIR READ
448    uint32_t   m_cpt_icache_dir_write;             // * ICACHE DIR WRITE
449               
450    uint32_t   m_cpt_cc_update_icache;             // number of coherence update packets (for icache)
451    uint32_t   m_cpt_cc_update_dcache;             // number of coherence update packets (for dcache)
452    uint32_t   m_cpt_cc_inval_broadcast;           // number of coherence inval packets
453    uint32_t   m_cpt_cc_inval_icache;              // number of coherence inval packets
454    uint32_t   m_cpt_cc_inval_dcache;              // number of coherence inval packets
455    uint32_t   m_cpt_cc_update_icache_word_useful; // number of valid word in coherence update packets
456    uint32_t   m_cpt_cc_update_dcache_word_useful; // number of valid word in coherence update packets
457               
458    uint32_t * m_cpt_frz_cycles;                       // * number of cycles where the cpu is frozen
459    uint32_t   m_cpt_total_cycles;                     // total number of cycles
460               
461    uint32_t   m_cpt_data_read;                    //   number of data read
462    uint32_t   m_cpt_data_read_miss;               //   number of data read miss
463    uint32_t   m_cpt_data_read_uncached;           //   number of data read uncached
464    uint32_t   m_cpt_data_write;                   //   number of data write
465    uint32_t   m_cpt_data_write_miss;              //   number of data write miss
466    uint32_t   m_cpt_data_write_uncached;          //   number of data write uncached
467    uint32_t   m_cpt_ins_miss;                     // * number of instruction miss
468               
469    uint32_t   m_cost_write_frz;                   // * number of frozen cycles related to write buffer         
470    uint32_t   m_cost_data_miss_frz;               // * number of frozen cycles related to data miss
471    uint32_t   m_cost_unc_read_frz;                // * number of frozen cycles related to uncached read
472    uint32_t   m_cost_ins_miss_frz;                // * number of frozen cycles related to ins miss
473               
474    uint32_t   m_cpt_imiss_transaction;            // * number of VCI instruction miss transactions
475    uint32_t   m_cpt_dmiss_transaction;            // * number of VCI data miss transactions
476    uint32_t   m_cpt_unc_transaction;              // * number of VCI uncached read transactions
477    uint32_t   m_cpt_data_write_transaction;       // * number of VCI write transactions
478               
479    uint32_t   m_cost_imiss_transaction;           // * cumulated duration for VCI IMISS transactions
480    uint32_t   m_cost_dmiss_transaction;           // * cumulated duration for VCI DMISS transactions
481    uint32_t   m_cost_unc_transaction;             // * cumulated duration for VCI UNC transactions
482    uint32_t   m_cost_write_transaction;           // * cumulated duration for VCI WRITE transactions
483    uint32_t   m_length_write_transaction;         // * cumulated length for VCI WRITE transactions
484
485    uint32_t * m_cpt_icache_access; //[m_nb_icache]
486    uint32_t * m_cpt_dcache_access; //[m_nb_dcache]
487    uint32_t * m_cpt_dcache_hit_after_miss_read;  //[m_nb_dcache]
488    uint32_t * m_cpt_dcache_hit_after_miss_write; //[m_nb_dcache]
489    uint32_t * m_cpt_dcache_store_after_store; //[m_nb_dcache]
490    uint32_t * m_cpt_icache_miss_victim_wait; //[m_nb_icache]
491    uint32_t * m_cpt_dcache_miss_victim_wait; //[m_nb_dcache]
492
493    uint32_t ** m_cpt_fsm_dcache;  //[m_nb_dcache]
494    uint32_t ** m_cpt_fsm_icache;  //[m_nb_icache]
495    uint32_t  * m_cpt_fsm_cmd;
496    uint32_t  * m_cpt_fsm_rsp;
497    uint32_t  * m_cpt_fsm_tgt;
498    uint32_t  * m_cpt_fsm_cleanup;
499
500    // Non blocking multi-cache
501    typename iss_t::InstructionRequest  * ireq        ; //[m_nb_icache]
502    typename iss_t::InstructionResponse * irsp        ; //[m_nb_icache]
503    bool                                * ireq_cached ; //[m_nb_icache]
504    uint32_t                            * ireq_num_cpu; //[m_nb_dcache]
505    typename iss_t::DataRequest         * dreq        ; //[m_nb_dcache]
506    typename iss_t::DataResponse        * drsp        ; //[m_nb_dcache]
507    bool                                * dreq_cached ; //[m_nb_dcache]
508    uint32_t                            * dreq_num_cpu; //[m_nb_dcache]
509
510    const uint32_t m_num_cache_LSB;
511    const uint32_t m_num_cache_MSB;
512          addr_40  m_num_cache_LSB_mask;
513          addr_40  m_num_cache_mask;
514
515protected:
516    SC_HAS_PROCESS(VciCcXCacheWrapperV4_CMP);
517
518public:
519
520    VciCcXCacheWrapperV4_CMP(
521                       sc_module_name insname,
522                       int proc_id,
523                       const soclib::common::MappingTable &mtp,
524                       const soclib::common::MappingTable &mtc,
525                       const soclib::common::IntTab &initiator_index_rw,
526                       const soclib::common::IntTab &initiator_index_c,
527                       const soclib::common::IntTab &target_index,
528                       size_t nb_cpu,
529                       size_t nb_dcache,
530                       size_t icache_ways,
531                       size_t icache_sets,
532                       size_t icache_words,
533                       size_t dcache_ways,
534                       size_t dcache_sets,
535                       size_t dcache_words,
536                       size_t wbuf_nwords,
537                       size_t wbuf_nlines,
538                       size_t wbuf_timeout,
539                       write_policy_t write_policy=WRITE_THROUGH
540                         );
541
542    ~VciCcXCacheWrapperV4_CMP();
543
544  void print_trace(size_t mode = 0);
545  void print_cpi();
546  void print_stats(bool print_wbuf=true, bool print_fsm=true);
547
548  void stop_simulation (uint32_t);
549  void log_transaction ( bool generate_file_icache
550                        ,bool generate_file_dcache
551                        ,bool generate_file_cmd
552                        ,bool generate_file_tgt
553                        ,bool generate_file_cleanup);
554
555  void vhdl_testbench (bool generate_file_mwbuf);
556
557private:
558
559    void transition();
560    void genMoore();
561
562    uint32_t get_num_cache     (addr_40 & addr);
563    uint32_t get_num_cache_only(addr_40   addr);
564    void     set_num_cache     (addr_40 & addr, uint32_t num_cache);
565    addr_40  set_num_cache_only(addr_40   addr, uint32_t num_cache);
566
567    soclib_static_assert((int)iss_t::SC_ATOMIC     == (int)vci_param::STORE_COND_ATOMIC);
568    soclib_static_assert((int)iss_t::SC_NOT_ATOMIC == (int)vci_param::STORE_COND_NOT_ATOMIC);
569};
570
571}}
572
573#endif /* SOCLIB_CABA_VCI_CC_XCACHE_WRAPPER_V4_CMP_H */
574
575// Local Variables:
576// tab-width: 4
577// c-basic-offset: 4
578// c-file-offsets:((innamespace . 0)(inline-open . 0))
579// indent-tabs-mode: nil
580// End:
581
582// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
Note: See TracBrowser for help on using the repository browser.