OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [cpu_sysc_plugin/] [riverlib/] [cache/] [cache_top.cpp] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Memory Cache Top level.
6
 */
7
 
8
#include "cache_top.h"
9
 
10
namespace debugger {
11
 
12
CacheTop::CacheTop(sc_module_name name_) : sc_module(name_) {
13
    SC_METHOD(comb);
14
    sensitive << i_nrst;
15
    sensitive << i_req_mem_ready;
16
    sensitive << i.req_mem_valid;
17
    sensitive << i.req_mem_write;
18
    sensitive << i.req_mem_addr;
19
    sensitive << i.req_mem_strob;
20
    sensitive << i.req_mem_wdata;
21
    sensitive << d.req_mem_valid;
22
    sensitive << d.req_mem_write;
23
    sensitive << d.req_mem_addr;
24
    sensitive << d.req_mem_strob;
25
    sensitive << d.req_mem_wdata;
26
    sensitive << i_resp_mem_data_valid;
27
    sensitive << i_resp_mem_data;
28
    sensitive << r.state;
29
 
30
    SC_METHOD(registers);
31
    sensitive << i_clk.pos();
32
 
33
    i0 = new ICache("i0");
34
    i0->i_clk(i_clk);
35
    i0->i_nrst(i_nrst);
36
    i0->i_req_ctrl_valid(i_req_ctrl_valid);
37
    i0->i_req_ctrl_addr(i_req_ctrl_addr);
38
    i0->o_req_ctrl_ready(o_req_ctrl_ready);
39
    i0->o_resp_ctrl_valid(o_resp_ctrl_valid);
40
    i0->o_resp_ctrl_addr(o_resp_ctrl_addr);
41
    i0->o_resp_ctrl_data(o_resp_ctrl_data);
42
    i0->i_resp_ctrl_ready(i_resp_ctrl_ready);
43
    i0->i_req_mem_ready(w_ctrl_req_ready);
44
    i0->o_req_mem_valid(i.req_mem_valid);
45
    i0->o_req_mem_write(i.req_mem_write);
46
    i0->o_req_mem_addr(i.req_mem_addr);
47
    i0->o_req_mem_strob(i.req_mem_strob);
48
    i0->o_req_mem_data(i.req_mem_wdata);
49
    i0->i_resp_mem_data_valid(w_ctrl_resp_mem_data_valid);
50
    i0->i_resp_mem_data(wb_ctrl_resp_mem_data);
51
    i0->o_istate(o_istate);
52
 
53
    d0 = new DCache("d0");
54
    d0->i_clk(i_clk);
55
    d0->i_nrst(i_nrst);
56
    d0->i_req_data_valid(i_req_data_valid);
57
    d0->i_req_data_write(i_req_data_write);
58
    d0->i_req_data_sz(i_req_data_size);
59
    d0->i_req_data_addr(i_req_data_addr);
60
    d0->i_req_data_data(i_req_data_data);
61
    d0->o_req_data_ready(o_req_data_ready);
62
    d0->o_resp_data_valid(o_resp_data_valid);
63
    d0->o_resp_data_addr(o_resp_data_addr);
64
    d0->o_resp_data_data(o_resp_data_data);
65
    d0->i_resp_data_ready(i_resp_data_ready);
66
    d0->i_req_mem_ready(w_data_req_ready);
67
    d0->o_req_mem_valid(d.req_mem_valid);
68
    d0->o_req_mem_write(d.req_mem_write);
69
    d0->o_req_mem_addr(d.req_mem_addr);
70
    d0->o_req_mem_strob(d.req_mem_strob);
71
    d0->o_req_mem_data(d.req_mem_wdata);
72
    d0->i_resp_mem_data_valid(w_data_resp_mem_data_valid);
73
    d0->i_resp_mem_data(wb_data_resp_mem_data);
74
    d0->o_dstate(o_dstate);
75
 
76
#ifdef DBG_ICACHE_TB
77
    i0_tb = new ICache_tb("ictb0");
78
#endif
79
};
80
 
81
void CacheTop::generateVCD(sc_trace_file *i_vcd, sc_trace_file *o_vcd) {
82
    if (o_vcd) {
83
        sc_trace(o_vcd, i_req_data_valid, "/top/cache0/i_req_data_valid");
84
        sc_trace(o_vcd, i_req_data_write, "/top/cache0/i_req_data_write");
85
        sc_trace(o_vcd, i_req_data_addr, "/top/cache0/i_req_data_addr");
86
        sc_trace(o_vcd, i_req_data_data, "/top/cache0/i_req_data_data");
87
 
88
        sc_trace(o_vcd, w_data_resp_mem_data_valid, "/top/cache0/w_data_resp_mem_data_valid");
89
        sc_trace(o_vcd, wb_data_resp_mem_data, "/top/cache0/wb_data_resp_mem_data");
90
        sc_trace(o_vcd, w_ctrl_resp_mem_data_valid, "/top/cache0/w_ctrl_resp_mem_data_valid");
91
        sc_trace(o_vcd, wb_ctrl_resp_mem_data, "/top/cache0/wb_ctrl_resp_mem_data");
92
 
93
        sc_trace(o_vcd, i_req_mem_ready, "/top/cache0/i_req_mem_ready");
94
        sc_trace(o_vcd, o_req_mem_valid, "/top/cache0/o_req_mem_valid");
95
        sc_trace(o_vcd, o_req_mem_write, "/top/cache0/o_req_mem_write");
96
        sc_trace(o_vcd, o_req_mem_addr, "/top/cache0/o_req_mem_addr");
97
        sc_trace(o_vcd, o_req_mem_strob, "/top/cache0/o_req_mem_strob");
98
        sc_trace(o_vcd, o_req_mem_data, "/top/cache0/o_req_mem_data");
99
        sc_trace(o_vcd, i_resp_mem_data_valid, "/top/cache0/i_resp_mem_data_valid");
100
        sc_trace(o_vcd, i_resp_mem_data, "/top/cache0/i_resp_mem_data");
101
        sc_trace(o_vcd, o_istate, "/top/cache0/o_istate");
102
        sc_trace(o_vcd, o_dstate, "/top/cache0/o_dstate");
103
        sc_trace(o_vcd, o_cstate, "/top/cache0/o_cstate");
104
    }
105
    i0->generateVCD(i_vcd, o_vcd);
106
    d0->generateVCD(i_vcd, o_vcd);
107
}
108
 
109
CacheTop::~CacheTop() {
110
    delete i0;
111
    delete d0;
112
}
113
 
114
 
115
void CacheTop::comb() {
116
    bool w_mem_write;
117
    sc_uint<BUS_ADDR_WIDTH> wb_mem_addr;
118
    sc_uint<BUS_DATA_BYTES> wb_mem_strob;
119
    sc_uint<BUS_DATA_WIDTH> wb_mem_wdata;
120
 
121
    v = r;
122
 
123
    w_mem_write = 0;
124
    wb_mem_addr = 0;
125
    wb_mem_strob = 0;
126
    wb_mem_wdata = 0;
127
 
128
    w_data_req_ready = 0;
129
    w_data_resp_mem_data_valid = 0;
130
    wb_data_resp_mem_data = 0;
131
    w_ctrl_req_ready = 0;
132
    w_ctrl_resp_mem_data_valid = 0;
133
    wb_ctrl_resp_mem_data = 0;
134
 
135
    switch (r.state.read()) {
136
    case State_Idle:
137
        if (d.req_mem_valid.read()) {
138
            w_data_req_ready = i_req_mem_ready;
139
            w_mem_write = d.req_mem_write;
140
            wb_mem_addr = d.req_mem_addr;
141
            wb_mem_strob = d.req_mem_strob;
142
            wb_mem_wdata = d.req_mem_wdata;
143
            if (i_req_mem_ready.read()) {
144
                v.state = State_DMem;
145
            }
146
        } else if (i.req_mem_valid.read()) {
147
            w_ctrl_req_ready = i_req_mem_ready;
148
            w_mem_write = i.req_mem_write;
149
            wb_mem_addr = i.req_mem_addr;
150
            wb_mem_strob = i.req_mem_strob;
151
            wb_mem_wdata = i.req_mem_wdata;
152
            if (i_req_mem_ready.read()) {
153
                v.state = State_IMem;
154
            }
155
        }
156
        break;
157
 
158
    case State_DMem:
159
        w_data_req_ready = i_req_mem_ready;
160
        w_mem_write = d.req_mem_write;
161
        wb_mem_addr = d.req_mem_addr;
162
        wb_mem_strob = d.req_mem_strob;
163
        wb_mem_wdata = d.req_mem_wdata;
164
        if (i_resp_mem_data_valid.read()) {
165
            if (!d.req_mem_valid.read() && i.req_mem_valid.read()) {
166
                v.state = State_IMem;
167
                w_data_req_ready = 0;
168
                w_ctrl_req_ready = i_req_mem_ready;
169
                w_mem_write = i.req_mem_write;
170
                wb_mem_addr = i.req_mem_addr;
171
                wb_mem_strob = i.req_mem_strob;
172
                wb_mem_wdata = i.req_mem_wdata;
173
            } else if (!(d.req_mem_valid | i.req_mem_valid)) {
174
                v.state = State_Idle;
175
            }
176
        }
177
        w_data_resp_mem_data_valid = i_resp_mem_data_valid;
178
        wb_data_resp_mem_data = i_resp_mem_data;
179
        break;
180
 
181
    case State_IMem:
182
        w_ctrl_req_ready = i_req_mem_ready;
183
        w_mem_write = i.req_mem_write;
184
        wb_mem_addr = i.req_mem_addr;
185
        wb_mem_strob = i.req_mem_strob;
186
        wb_mem_wdata = i.req_mem_wdata;
187
        if (i_resp_mem_data_valid.read()) {
188
            if (d.req_mem_valid.read()) {
189
                v.state = State_DMem;
190
                w_data_req_ready = i_req_mem_ready;
191
                w_ctrl_req_ready = 0;
192
                w_mem_write = d.req_mem_write;
193
                wb_mem_addr = d.req_mem_addr;
194
                wb_mem_strob = d.req_mem_strob;
195
                wb_mem_wdata = d.req_mem_wdata;
196
            } else if (!(d.req_mem_valid | i.req_mem_valid)) {
197
                v.state = State_Idle;
198
            }
199
        }
200
        w_ctrl_resp_mem_data_valid = i_resp_mem_data_valid;
201
        wb_ctrl_resp_mem_data = i_resp_mem_data;
202
        break;
203
    default:;
204
    }
205
 
206
    if (!i_nrst.read()) {
207
        v.state = State_Idle;
208
    }
209
 
210
    o_req_mem_valid = i.req_mem_valid | d.req_mem_valid;
211
    o_req_mem_write = w_mem_write;
212
    o_req_mem_addr = wb_mem_addr;
213
    o_req_mem_strob = wb_mem_strob;
214
    o_req_mem_data = wb_mem_wdata;
215
    o_cstate = r.state;
216
}
217
 
218
void CacheTop::registers() {
219
    r = v;
220
}
221
 
222
}  // namespace debugger
223
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.