source: trunk/modules/vci_cc_xcache_wrapper/caba/source/include/vci_cc_xcache_wrapper.h @ 2

Last change on this file since 2 was 2, checked in by nipo, 14 years ago

Import TSAR modules in TSAR's own svn

  • Property svn:eol-style set to native
  • Property svn:keywords set to "Author Date Id Rev URL Revision"
  • Property svn:mime-type set to text/plain
File size: 10.0 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_H
30#define SOCLIB_CABA_VCI_CC_XCACHE_WRAPPER_H
31
32#include <inttypes.h>
33#include <systemc>
34#include "caba_base_module.h"
35#include "write_buffer.h"
36#include "generic_cache.h"
37#include "vci_initiator.h"
38#include "vci_target.h"
39#include "mapping_table.h"
40#include "static_assert.h"
41
42namespace soclib {
43namespace caba {
44
45using namespace sc_core;
46
47////////////////////////////////////////////
48template<typename vci_param, typename iss_t>
49class VciCcXcacheWrapper
50///////////////////////////////////////////
51    : public soclib::caba::BaseModule
52{
53    typedef uint32_t    addr_t;
54    typedef uint32_t    data_t;
55    typedef uint32_t    tag_t;
56    typedef uint32_t    be_t;
57
58    enum dcache_fsm_state_e {
59        DCACHE_IDLE,
60        DCACHE_WRITE_UPDT,
61        DCACHE_WRITE_REQ,
62        DCACHE_MISS_WAIT,
63        DCACHE_MISS_UPDT,
64        DCACHE_UNC_WAIT,
65        DCACHE_INVAL,
66        DCACHE_ERROR,
67        DCACHE_CC_CHECK,
68        DCACHE_CC_INVAL,
69        DCACHE_CC_UPDT,
70        DCACHE_CC_NOP,
71    };
72
73    enum icache_fsm_state_e {
74        ICACHE_IDLE,
75        ICACHE_MISS_WAIT,
76        ICACHE_MISS_UPDT,
77        ICACHE_UNC_WAIT,
78        ICACHE_ERROR,
79        ICACHE_CC_INVAL,
80    };
81
82    enum cmd_fsm_state_e {
83        CMD_IDLE,
84        CMD_INS_MISS,
85        CMD_INS_UNC,
86        CMD_DATA_MISS,
87        CMD_DATA_UNC,
88        CMD_DATA_WRITE,
89        CMD_INS_CLEANUP,
90        CMD_DATA_CLEANUP,
91    };
92
93    enum rsp_fsm_state_e {
94        RSP_IDLE,
95        RSP_INS_MISS,
96        RSP_INS_UNC,
97        RSP_DATA_MISS,
98        RSP_DATA_UNC,
99        RSP_DATA_WRITE,
100        RSP_INS_CLEANUP,
101        RSP_DATA_CLEANUP,
102    };
103
104    enum tgt_fsm_state_e {
105        TGT_IDLE,
106        TGT_UPDT_WORD,
107        TGT_UPDT_DATA,
108        TGT_REQ_BROADCAST,
109        TGT_REQ_DCACHE,
110        TGT_RSP_BROADCAST,
111        TGT_RSP_DCACHE,
112    };
113
114public:
115
116    // PORTS
117    sc_in<bool>                             p_clk;
118    sc_in<bool>                             p_resetn;
119    sc_in<bool>                             p_irq[iss_t::n_irq];
120    soclib::caba::VciInitiator<vci_param>   p_vci_ini;
121    soclib::caba::VciTarget<vci_param>      p_vci_tgt;
122
123private:
124
125    // STRUCTURAL PARAMETERS
126    const soclib::common::AddressDecodingTable<uint32_t, bool>  m_cacheability_table;
127    const soclib::common::Segment                               m_segment;
128    iss_t                                                       m_iss;
129    const uint32_t                                              m_srcid;   
130    addr_t                                                      m_cleanup_address;
131   
132    const size_t                                                m_dcache_ways;
133    const size_t                                                m_dcache_words;
134    const size_t                                                m_dcache_yzmask;
135    const size_t                                                m_icache_ways;
136    const size_t                                                m_icache_words;
137    const size_t                                                m_icache_yzmask;
138
139    // REGISTERS
140    sc_signal<int>          r_dcache_fsm;
141    sc_signal<int>          r_dcache_fsm_save;
142    sc_signal<addr_t>       r_dcache_addr_save;
143    sc_signal<data_t>       r_dcache_wdata_save;
144    sc_signal<data_t>       r_dcache_rdata_save;
145    sc_signal<int>          r_dcache_type_save;
146    sc_signal<be_t>         r_dcache_be_save;
147    sc_signal<bool>         r_dcache_cached_save;
148    sc_signal<bool>         r_dcache_cleanup_req;
149    sc_signal<data_t>       r_dcache_cleanup_line;
150    sc_signal<bool>         r_dcache_miss_req;
151    sc_signal<bool>         r_dcache_unc_req;
152    sc_signal<bool>         r_dcache_write_req;
153    sc_signal<bool>         r_dcache_inval_rsp;
154
155    sc_signal<int>          r_icache_fsm;
156    sc_signal<int>          r_icache_fsm_save;
157    sc_signal<addr_t>       r_icache_addr_save;
158    sc_signal<bool>         r_icache_miss_req;
159    sc_signal<bool>         r_icache_unc_req;
160    sc_signal<bool>         r_icache_cleanup_req;
161    sc_signal<data_t>       r_icache_cleanup_line;
162    sc_signal<bool>         r_icache_inval_rsp;
163
164    sc_signal<int>          r_vci_cmd_fsm;
165    sc_signal<size_t>       r_vci_cmd_min;       
166    sc_signal<size_t>       r_vci_cmd_max;       
167    sc_signal<size_t>       r_vci_cmd_cpt;       
168     
169    sc_signal<int>          r_vci_rsp_fsm;
170    sc_signal<bool>         r_vci_rsp_ins_error;   
171    sc_signal<bool>         r_vci_rsp_data_error;   
172    sc_signal<size_t>       r_vci_rsp_cpt; 
173
174    data_t                  *r_icache_miss_buf;   
175    data_t                  *r_dcache_miss_buf;   
176    sc_signal<bool>         r_icache_buf_unc_valid;
177    sc_signal<bool>         r_dcache_buf_unc_valid;
178
179    data_t                  *r_tgt_buf;
180    bool                    *r_tgt_val;
181
182    sc_signal<int>          r_vci_tgt_fsm;
183    sc_signal<size_t>       r_tgt_addr;
184    sc_signal<size_t>       r_tgt_word;
185    sc_signal<bool>         r_tgt_update;
186    sc_signal<size_t>       r_tgt_srcid;
187    sc_signal<size_t>       r_tgt_pktid;
188    sc_signal<size_t>       r_tgt_trdid;
189    sc_signal<size_t>       r_tgt_plen;
190    sc_signal<bool>         r_tgt_icache_req;
191    sc_signal<bool>         r_tgt_dcache_req;
192    sc_signal<bool>         r_tgt_icache_rsp;
193    sc_signal<bool>         r_tgt_dcache_rsp;
194
195    WriteBuffer<addr_t>     r_wbuf;
196    GenericCache<addr_t>    r_icache;
197    GenericCache<addr_t>    r_dcache;
198
199    // Activity counters
200    uint32_t m_cpt_dcache_data_read;        // DCACHE DATA READ
201    uint32_t m_cpt_dcache_data_write;       // DCACHE DATA WRITE
202    uint32_t m_cpt_dcache_dir_read;         // DCACHE DIR READ
203    uint32_t m_cpt_dcache_dir_write;        // DCACHE DIR WRITE
204
205    uint32_t m_cpt_icache_data_read;        // ICACHE DATA READ
206    uint32_t m_cpt_icache_data_write;       // ICACHE DATA WRITE
207    uint32_t m_cpt_icache_dir_read;         // ICACHE DIR READ
208    uint32_t m_cpt_icache_dir_write;        // ICACHE DIR WRITE
209
210    uint32_t m_cpt_cc_update;               // number of coherence update packets
211    uint32_t m_cpt_cc_inval;                // number of coherence inval packets
212
213    uint32_t m_cpt_frz_cycles;              // number of cycles where the cpu is frozen
214    uint32_t m_cpt_total_cycles;                // total number of cycles
215
216    uint32_t m_cpt_read;                    // total number of read instructions
217    uint32_t m_cpt_write;                   // total number of write instructions
218    uint32_t m_cpt_data_miss;               // number of read miss
219    uint32_t m_cpt_ins_miss;                // number of instruction miss
220    uint32_t m_cpt_unc_read;                // number of read uncached
221    uint32_t m_cpt_write_cached;            // number of cached write
222
223    uint32_t m_cost_write_frz;              // number of frozen cycles related to write buffer         
224    uint32_t m_cost_data_miss_frz;          // number of frozen cycles related to data miss
225    uint32_t m_cost_unc_read_frz;           // number of frozen cycles related to uncached read
226    uint32_t m_cost_ins_miss_frz;           // number of frozen cycles related to ins miss
227
228    uint32_t m_cpt_imiss_transaction;       // number of VCI instruction miss transactions
229    uint32_t m_cpt_dmiss_transaction;       // number of VCI data miss transactions
230    uint32_t m_cpt_unc_transaction;         // number of VCI uncached read transactions
231    uint32_t m_cpt_write_transaction;       // number of VCI write transactions
232
233    uint32_t m_cost_imiss_transaction;      // cumulated duration for VCI IMISS transactions
234    uint32_t m_cost_dmiss_transaction;      // cumulated duration for VCI DMISS transactions
235    uint32_t m_cost_unc_transaction;        // cumulated duration for VCI UNC transactions
236    uint32_t m_cost_write_transaction;      // cumulated duration for VCI WRITE transactions
237    uint32_t m_length_write_transaction;    // cumulated length for VCI WRITE transactions
238
239protected:
240    SC_HAS_PROCESS(VciCcXcacheWrapper);
241
242public:
243
244    VciCcXcacheWrapper(
245                       sc_module_name insname,
246                       int proc_id,
247                       const soclib::common::MappingTable &mtp,
248                       const soclib::common::MappingTable &mtc,
249                       const soclib::common::IntTab &initiator_index,
250                       const soclib::common::IntTab &target_index,
251                       size_t icache_ways,
252                       size_t icache_sets,
253                       size_t icache_words,
254                       size_t dcache_ways,
255                       size_t dcache_sets,
256                       size_t dcache_words,
257                       addr_t cleanup_offset );
258
259    ~VciCcXcacheWrapper();
260
261    void print_cpi();
262    void print_stats();
263
264private:
265
266    void transition();
267    void genMoore();
268
269    soclib_static_assert((int)iss_t::SC_ATOMIC == (int)vci_param::STORE_COND_ATOMIC);
270    soclib_static_assert((int)iss_t::SC_NOT_ATOMIC == (int)vci_param::STORE_COND_NOT_ATOMIC);
271};
272
273}}
274
275#endif /* SOCLIB_CABA_VCI_CC_XCACHE_WRAPPER_H */
276
277// Local Variables:
278// tab-width: 4
279// c-basic-offset: 4
280// c-file-offsets:((innamespace . 0)(inline-open . 0))
281// indent-tabs-mode: nil
282// End:
283
284// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
285
286
287
Note: See TracBrowser for help on using the repository browser.