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 2

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

Line No. Rev Author Line
1 2 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2017 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Instruction Cache.
6
 */
7
 
8
#ifndef __DEBUGGER_RIVERLIB_ICACHE_H__
9
#define __DEBUGGER_RIVERLIB_ICACHE_H__
10
 
11
#include <systemc.h>
12
#include "../river_cfg.h"
13
 
14
namespace debugger {
15
 
16
//#define DBG_ICACHE_TB
17
 
18
SC_MODULE(ICache) {
19
    sc_in<bool> i_clk;
20
    sc_in<bool> i_nrst;
21
    // Control path:
22
    sc_in<bool> i_req_ctrl_valid;
23
    sc_in<sc_uint<BUS_ADDR_WIDTH>> i_req_ctrl_addr;
24
    sc_out<bool> o_req_ctrl_ready;
25
    sc_out<bool> o_resp_ctrl_valid;
26
    sc_out<sc_uint<BUS_ADDR_WIDTH>> o_resp_ctrl_addr;
27
    sc_out<sc_uint<32>> o_resp_ctrl_data;
28
    sc_in<bool> i_resp_ctrl_ready;
29
    // Memory interface:
30
    sc_in<bool> i_req_mem_ready;
31
    sc_out<bool> o_req_mem_valid;
32
    sc_out<bool> o_req_mem_write;
33
    sc_out<sc_uint<BUS_ADDR_WIDTH>> o_req_mem_addr;
34
    sc_out<sc_uint<BUS_DATA_BYTES>> o_req_mem_strob;
35
    sc_out<sc_uint<BUS_DATA_WIDTH>> o_req_mem_data;
36
    sc_in<bool> i_resp_mem_data_valid;
37
    sc_in<sc_uint<BUS_DATA_WIDTH>> i_resp_mem_data;
38
    sc_out<sc_uint<2>> o_istate;
39
 
40
    void comb();
41
    void registers();
42
 
43
    SC_HAS_PROCESS(ICache);
44
 
45
    ICache(sc_module_name name_);
46
 
47
    void generateVCD(sc_trace_file *i_vcd, sc_trace_file *o_vcd);
48
 
49
private:
50
    enum EState {
51
        State_Idle,
52
        State_WaitGrant,
53
        State_WaitResp,
54
        State_WaitAccept
55
    };
56
 
57
    struct RegistersType {
58
        sc_signal<sc_uint<BUS_ADDR_WIDTH - 3>> iline_addr;
59
        sc_signal<sc_uint<BUS_DATA_WIDTH>> iline_data;
60
        sc_signal<sc_uint<BUS_ADDR_WIDTH>> iline_addr_req;
61
        sc_signal<sc_uint<32>> iline_data_hit;
62
        sc_signal<sc_uint<BUS_ADDR_WIDTH>> iline_addr_hit;
63
        sc_signal<sc_uint<2>> state;
64
        sc_signal<bool> hit_line;
65
    } v, r;
66
    bool w_hit_req;
67
    bool w_hit_line;
68
    bool w_hit;
69
};
70
 
71
 
72
#ifdef DBG_ICACHE_TB
73
SC_MODULE(ICache_tb) {
74
    void comb0();
75
    void registers() {
76
        r = v;
77
    }
78
 
79
    SC_HAS_PROCESS(ICache_tb);
80
 
81
    ICache_tb(sc_module_name name_) : sc_module(name_),
82
        w_clk("clk0", 10, SC_NS) {
83
        SC_METHOD(comb0);
84
        sensitive << w_nrst;
85
        sensitive << w_req_ctrl_valid;
86
        sensitive << wb_req_ctrl_addr;
87
        sensitive << w_req_ctrl_ready;
88
        sensitive << w_resp_ctrl_valid;
89
        sensitive << wb_resp_ctrl_addr;
90
        sensitive << wb_resp_ctrl_data;
91
        sensitive << w_resp_ctrl_ready;
92
        sensitive << w_req_mem_ready;
93
        sensitive << w_req_mem_valid;
94
        sensitive << w_req_mem_write;
95
        sensitive << wb_req_mem_addr;
96
        sensitive << wb_req_mem_strob;
97
        sensitive << wb_req_mem_data;
98
        sensitive << w_resp_mem_data_valid;
99
        sensitive << wb_resp_mem_data;
100
        sensitive << wb_istate;
101
        sensitive << r.clk_cnt;
102
        sensitive << r.mem_raddr;
103
        sensitive << r.mem_state;
104
        sensitive << r.mem_cnt;
105
        sensitive << r.mem_wait_cnt;
106
        sensitive << r.fetch_state;
107
        sensitive << r.fetch_cnt;
108
 
109
        SC_METHOD(registers);
110
        sensitive << w_clk.posedge_event();
111
 
112
        tt = new ICache("tt");
113
        tt->i_clk(w_clk);
114
        tt->i_nrst(w_nrst);
115
        tt->i_req_ctrl_valid(w_req_ctrl_valid);
116
        tt->i_req_ctrl_addr(wb_req_ctrl_addr);
117
        tt->o_req_ctrl_ready(w_req_ctrl_ready);
118
        tt->o_resp_ctrl_valid(w_resp_ctrl_valid);
119
        tt->o_resp_ctrl_addr(wb_resp_ctrl_addr);
120
        tt->o_resp_ctrl_data(wb_resp_ctrl_data);
121
        tt->i_resp_ctrl_ready(w_resp_ctrl_ready);
122
        tt->i_req_mem_ready(w_req_mem_ready);
123
        tt->o_req_mem_valid(w_req_mem_valid);
124
        tt->o_req_mem_write(w_req_mem_write);
125
        tt->o_req_mem_addr(wb_req_mem_addr);
126
        tt->o_req_mem_strob(wb_req_mem_strob);
127
        tt->o_req_mem_data(wb_req_mem_data);
128
        tt->i_resp_mem_data_valid(w_resp_mem_data_valid);
129
        tt->i_resp_mem_data(wb_resp_mem_data);
130
        tt->o_istate(wb_istate);
131
 
132
        tb_vcd = sc_create_vcd_trace_file("icache_tb");
133
        tb_vcd->set_time_unit(1, SC_PS);
134
        sc_trace(tb_vcd, w_nrst, "w_nrst");
135
        sc_trace(tb_vcd, w_clk, "w_clk");
136
        sc_trace(tb_vcd, r.clk_cnt, "clk_cnt");
137
        sc_trace(tb_vcd, w_req_ctrl_valid, "w_req_ctrl_valid");
138
        sc_trace(tb_vcd, wb_req_ctrl_addr, "wb_req_ctrl_addr");
139
        sc_trace(tb_vcd, w_req_ctrl_ready, "w_req_ctrl_ready");
140
        sc_trace(tb_vcd, w_resp_ctrl_valid, "w_resp_ctrl_valid");
141
        sc_trace(tb_vcd, wb_resp_ctrl_addr, "wb_resp_ctrl_addr");
142
        sc_trace(tb_vcd, wb_resp_ctrl_data, "wb_resp_ctrl_data");
143
        sc_trace(tb_vcd, w_resp_ctrl_ready, "w_resp_ctrl_ready");
144
        sc_trace(tb_vcd, w_req_mem_ready, "w_req_mem_ready");
145
        sc_trace(tb_vcd, w_req_mem_valid, "w_req_mem_valid");
146
        sc_trace(tb_vcd, w_req_mem_write, "w_req_mem_write");
147
        sc_trace(tb_vcd, wb_req_mem_addr, "wb_req_mem_addr");
148
        sc_trace(tb_vcd, wb_req_mem_strob, "wb_req_mem_strob");
149
        sc_trace(tb_vcd, wb_req_mem_data, "wb_req_mem_data");
150
        sc_trace(tb_vcd, w_resp_mem_data_valid, "w_resp_mem_data_valid");
151
        sc_trace(tb_vcd, wb_resp_mem_data, "wb_resp_mem_data");
152
        sc_trace(tb_vcd, wb_istate, "wb_istate");
153
        sc_trace(tb_vcd, wb_istate_z, "wb_istate_z");
154
        sc_trace(tb_vcd, w_ierr_state, "w_ierr_state");
155
        sc_trace(tb_vcd, r.mem_state, "r_mem_state");
156
        sc_trace(tb_vcd, r.mem_raddr, "r_mem_raddr");
157
 
158
        tt->generateVCD(tb_vcd, tb_vcd);
159
    }
160
 
161
private:
162
    ICache *tt;
163
 
164
    sc_clock w_clk;
165
    sc_signal<bool> w_nrst;
166
    // Control path:
167
    sc_signal<bool> w_req_ctrl_valid;
168
    sc_signal<sc_uint<BUS_ADDR_WIDTH>> wb_req_ctrl_addr;
169
    sc_signal<bool> w_req_ctrl_ready;
170
    sc_signal<bool> w_resp_ctrl_valid;
171
    sc_signal<sc_uint<BUS_ADDR_WIDTH>> wb_resp_ctrl_addr;
172
    sc_signal<sc_uint<32>> wb_resp_ctrl_data;
173
    sc_signal<bool> w_resp_ctrl_ready;
174
    // Memory interface:
175
    sc_signal<bool> w_req_mem_ready;
176
    sc_signal<bool> w_req_mem_valid;
177
    sc_signal<bool> w_req_mem_write;
178
    sc_signal<sc_uint<BUS_ADDR_WIDTH>> wb_req_mem_addr;
179
    sc_signal<sc_uint<BUS_DATA_BYTES>> wb_req_mem_strob;
180
    sc_signal<sc_uint<BUS_DATA_WIDTH>> wb_req_mem_data;
181
    sc_signal<bool> w_resp_mem_data_valid;
182
    sc_signal<sc_uint<BUS_DATA_WIDTH>> wb_resp_mem_data;
183
    sc_signal<sc_uint<2>> wb_istate;
184
 
185
    struct RegistersType {
186
        sc_signal<sc_uint<32>> clk_cnt;
187
        sc_signal<sc_uint<2>> fetch_state;
188
        sc_signal<sc_uint<8>> fetch_cnt;
189
        sc_signal<sc_uint<8>> fetch_wait_cnt;
190
        sc_signal<sc_uint<2>> mem_state;
191
        sc_signal<sc_uint<32>> mem_raddr;
192
        sc_signal<sc_uint<8>> mem_cnt;
193
        sc_signal<sc_uint<8>> mem_wait_cnt;
194
    } v, r;
195
    sc_trace_file *tb_vcd;
196
};
197
#endif  // DBG_ICACHE_TB
198
 
199
}  // namespace debugger
200
 
201
#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.