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/] [icache.h] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 sergeykhbr
/*
2
 *  Copyright 2018 Sergey Khabarov, sergeykhbr@gmail.com
3
 *
4
 *  Licensed under the Apache License, Version 2.0 (the "License");
5
 *  you may not use this file except in compliance with the License.
6
 *  You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 *  Unless required by applicable law or agreed to in writing, software
11
 *  distributed under the License is distributed on an "AS IS" BASIS,
12
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 *  See the License for the specific language governing permissions and
14
 *  limitations under the License.
15 3 sergeykhbr
 */
16
 
17
#ifndef __DEBUGGER_RIVERLIB_ICACHE_H__
18
#define __DEBUGGER_RIVERLIB_ICACHE_H__
19
 
20
#include <systemc.h>
21
#include "../river_cfg.h"
22
 
23
namespace debugger {
24
 
25
//#define DBG_ICACHE_TB
26
 
27
SC_MODULE(ICache) {
28
    sc_in<bool> i_clk;
29
    sc_in<bool> i_nrst;
30
    // Control path:
31
    sc_in<bool> i_req_ctrl_valid;
32
    sc_in<sc_uint<BUS_ADDR_WIDTH>> i_req_ctrl_addr;
33
    sc_out<bool> o_req_ctrl_ready;
34
    sc_out<bool> o_resp_ctrl_valid;
35
    sc_out<sc_uint<BUS_ADDR_WIDTH>> o_resp_ctrl_addr;
36
    sc_out<sc_uint<32>> o_resp_ctrl_data;
37
    sc_in<bool> i_resp_ctrl_ready;
38
    // Memory interface:
39
    sc_in<bool> i_req_mem_ready;
40
    sc_out<bool> o_req_mem_valid;
41
    sc_out<bool> o_req_mem_write;
42
    sc_out<sc_uint<BUS_ADDR_WIDTH>> o_req_mem_addr;
43
    sc_out<sc_uint<BUS_DATA_BYTES>> o_req_mem_strob;
44
    sc_out<sc_uint<BUS_DATA_WIDTH>> o_req_mem_data;
45
    sc_in<bool> i_resp_mem_data_valid;
46
    sc_in<sc_uint<BUS_DATA_WIDTH>> i_resp_mem_data;
47
    sc_out<sc_uint<2>> o_istate;
48
 
49
    void comb();
50
    void registers();
51
 
52
    SC_HAS_PROCESS(ICache);
53
 
54
    ICache(sc_module_name name_);
55
 
56
    void generateVCD(sc_trace_file *i_vcd, sc_trace_file *o_vcd);
57
 
58
private:
59
    enum EState {
60
        State_Idle,
61
        State_WaitGrant,
62
        State_WaitResp,
63
        State_WaitAccept
64
    };
65 4 sergeykhbr
    enum EHit {
66
        Hit_Line1,
67
        Hit_Line2,
68
        Hit_Response,
69
        Hit_Total
70
    };
71
    static const int ILINE_TOTAL = 2;
72 3 sergeykhbr
 
73 4 sergeykhbr
    struct line_type {
74
        sc_signal<sc_uint<BUS_ADDR_WIDTH - 3>> addr;
75
        sc_signal<sc_uint<BUS_DATA_WIDTH>> data;
76
    };
77
    struct line_signal_type {
78
        sc_bv<ILINE_TOTAL + 1> hit;     // Hit_Total = ILINE_TOTAL + 1
79
        sc_bv<ILINE_TOTAL> hit_hold;
80
        sc_uint<BUS_DATA_WIDTH> hit_data;
81
        sc_uint<BUS_DATA_WIDTH> hold_data;
82
    };
83
 
84 3 sergeykhbr
    struct RegistersType {
85 4 sergeykhbr
        line_type iline[ILINE_TOTAL];
86 3 sergeykhbr
        sc_signal<sc_uint<BUS_ADDR_WIDTH>> iline_addr_req;
87 4 sergeykhbr
        sc_signal<sc_uint<BUS_ADDR_WIDTH>> addr_processing;
88 3 sergeykhbr
        sc_signal<sc_uint<2>> state;
89 4 sergeykhbr
        sc_signal<bool> double_req;         // request 2-lines
90
        sc_signal<bool> delay_valid;
91
        sc_signal<sc_uint<32>> delay_data;
92 3 sergeykhbr
    } v, r;
93 4 sergeykhbr
    bool w_need_mem_req;
94
    sc_uint<32> wb_hit_word;
95
    line_signal_type wb_l[ILINE_TOTAL];
96
    bool w_reuse_lastline;
97
    bool w_wait_response;
98 3 sergeykhbr
};
99
 
100
 
101
#ifdef DBG_ICACHE_TB
102
SC_MODULE(ICache_tb) {
103
    void comb0();
104
    void registers() {
105
        r = v;
106
    }
107
 
108
    SC_HAS_PROCESS(ICache_tb);
109
 
110
    ICache_tb(sc_module_name name_) : sc_module(name_),
111
        w_clk("clk0", 10, SC_NS) {
112
        SC_METHOD(comb0);
113
        sensitive << w_nrst;
114
        sensitive << w_req_ctrl_valid;
115
        sensitive << wb_req_ctrl_addr;
116
        sensitive << w_req_ctrl_ready;
117
        sensitive << w_resp_ctrl_valid;
118
        sensitive << wb_resp_ctrl_addr;
119
        sensitive << wb_resp_ctrl_data;
120
        sensitive << w_resp_ctrl_ready;
121
        sensitive << w_req_mem_ready;
122
        sensitive << w_req_mem_valid;
123
        sensitive << w_req_mem_write;
124
        sensitive << wb_req_mem_addr;
125
        sensitive << wb_req_mem_strob;
126
        sensitive << wb_req_mem_data;
127
        sensitive << w_resp_mem_data_valid;
128
        sensitive << wb_resp_mem_data;
129
        sensitive << wb_istate;
130
        sensitive << r.clk_cnt;
131
        sensitive << r.mem_raddr;
132
        sensitive << r.mem_state;
133
        sensitive << r.mem_cnt;
134
        sensitive << r.mem_wait_cnt;
135
        sensitive << r.fetch_state;
136
        sensitive << r.fetch_cnt;
137
 
138
        SC_METHOD(registers);
139
        sensitive << w_clk.posedge_event();
140
 
141
        tt = new ICache("tt");
142
        tt->i_clk(w_clk);
143
        tt->i_nrst(w_nrst);
144
        tt->i_req_ctrl_valid(w_req_ctrl_valid);
145
        tt->i_req_ctrl_addr(wb_req_ctrl_addr);
146
        tt->o_req_ctrl_ready(w_req_ctrl_ready);
147
        tt->o_resp_ctrl_valid(w_resp_ctrl_valid);
148
        tt->o_resp_ctrl_addr(wb_resp_ctrl_addr);
149
        tt->o_resp_ctrl_data(wb_resp_ctrl_data);
150
        tt->i_resp_ctrl_ready(w_resp_ctrl_ready);
151
        tt->i_req_mem_ready(w_req_mem_ready);
152
        tt->o_req_mem_valid(w_req_mem_valid);
153
        tt->o_req_mem_write(w_req_mem_write);
154
        tt->o_req_mem_addr(wb_req_mem_addr);
155
        tt->o_req_mem_strob(wb_req_mem_strob);
156
        tt->o_req_mem_data(wb_req_mem_data);
157
        tt->i_resp_mem_data_valid(w_resp_mem_data_valid);
158
        tt->i_resp_mem_data(wb_resp_mem_data);
159
        tt->o_istate(wb_istate);
160
 
161
        tb_vcd = sc_create_vcd_trace_file("icache_tb");
162
        tb_vcd->set_time_unit(1, SC_PS);
163
        sc_trace(tb_vcd, w_nrst, "w_nrst");
164
        sc_trace(tb_vcd, w_clk, "w_clk");
165
        sc_trace(tb_vcd, r.clk_cnt, "clk_cnt");
166
        sc_trace(tb_vcd, w_req_ctrl_valid, "w_req_ctrl_valid");
167
        sc_trace(tb_vcd, wb_req_ctrl_addr, "wb_req_ctrl_addr");
168
        sc_trace(tb_vcd, w_req_ctrl_ready, "w_req_ctrl_ready");
169
        sc_trace(tb_vcd, w_resp_ctrl_valid, "w_resp_ctrl_valid");
170
        sc_trace(tb_vcd, wb_resp_ctrl_addr, "wb_resp_ctrl_addr");
171
        sc_trace(tb_vcd, wb_resp_ctrl_data, "wb_resp_ctrl_data");
172
        sc_trace(tb_vcd, w_resp_ctrl_ready, "w_resp_ctrl_ready");
173
        sc_trace(tb_vcd, w_req_mem_ready, "w_req_mem_ready");
174
        sc_trace(tb_vcd, w_req_mem_valid, "w_req_mem_valid");
175
        sc_trace(tb_vcd, w_req_mem_write, "w_req_mem_write");
176
        sc_trace(tb_vcd, wb_req_mem_addr, "wb_req_mem_addr");
177
        sc_trace(tb_vcd, wb_req_mem_strob, "wb_req_mem_strob");
178
        sc_trace(tb_vcd, wb_req_mem_data, "wb_req_mem_data");
179
        sc_trace(tb_vcd, w_resp_mem_data_valid, "w_resp_mem_data_valid");
180
        sc_trace(tb_vcd, wb_resp_mem_data, "wb_resp_mem_data");
181
        sc_trace(tb_vcd, wb_istate, "wb_istate");
182
        sc_trace(tb_vcd, wb_istate_z, "wb_istate_z");
183
        sc_trace(tb_vcd, w_ierr_state, "w_ierr_state");
184
        sc_trace(tb_vcd, r.mem_state, "r_mem_state");
185
        sc_trace(tb_vcd, r.mem_raddr, "r_mem_raddr");
186
 
187
        tt->generateVCD(tb_vcd, tb_vcd);
188
    }
189
 
190
private:
191
    ICache *tt;
192
 
193
    sc_clock w_clk;
194
    sc_signal<bool> w_nrst;
195
    // Control path:
196
    sc_signal<bool> w_req_ctrl_valid;
197
    sc_signal<sc_uint<BUS_ADDR_WIDTH>> wb_req_ctrl_addr;
198
    sc_signal<bool> w_req_ctrl_ready;
199
    sc_signal<bool> w_resp_ctrl_valid;
200
    sc_signal<sc_uint<BUS_ADDR_WIDTH>> wb_resp_ctrl_addr;
201
    sc_signal<sc_uint<32>> wb_resp_ctrl_data;
202
    sc_signal<bool> w_resp_ctrl_ready;
203
    // Memory interface:
204
    sc_signal<bool> w_req_mem_ready;
205
    sc_signal<bool> w_req_mem_valid;
206
    sc_signal<bool> w_req_mem_write;
207
    sc_signal<sc_uint<BUS_ADDR_WIDTH>> wb_req_mem_addr;
208
    sc_signal<sc_uint<BUS_DATA_BYTES>> wb_req_mem_strob;
209
    sc_signal<sc_uint<BUS_DATA_WIDTH>> wb_req_mem_data;
210
    sc_signal<bool> w_resp_mem_data_valid;
211
    sc_signal<sc_uint<BUS_DATA_WIDTH>> wb_resp_mem_data;
212
    sc_signal<sc_uint<2>> wb_istate;
213
 
214
    struct RegistersType {
215
        sc_signal<sc_uint<32>> clk_cnt;
216
        sc_signal<sc_uint<2>> fetch_state;
217
        sc_signal<sc_uint<8>> fetch_cnt;
218
        sc_signal<sc_uint<8>> fetch_wait_cnt;
219
        sc_signal<sc_uint<2>> mem_state;
220
        sc_signal<sc_uint<32>> mem_raddr;
221
        sc_signal<sc_uint<8>> mem_cnt;
222
        sc_signal<sc_uint<8>> mem_wait_cnt;
223
    } v, r;
224
    sc_trace_file *tb_vcd;
225
};
226
#endif  // DBG_ICACHE_TB
227
 
228
}  // namespace debugger
229
 
230
#endif  // __DEBUGGER_RIVERLIB_ICACHE_H__

powered by: WebSVN 2.1.0

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