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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [cpu_sysc_plugin/] [rtl_wrapper.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
 */
16 3 sergeykhbr
 
17
#ifndef __DEBUGGER_RTL_WRAPPER_H__
18
#define __DEBUGGER_RTL_WRAPPER_H__
19
 
20
#include "async_tqueue.h"
21 4 sergeykhbr
#include "coreservices/imemop.h"
22
#include "coreservices/ireset.h"
23
#include "coreservices/icpugen.h"
24 3 sergeykhbr
#include "coreservices/icpuriscv.h"
25
#include "coreservices/iclklistener.h"
26
#include "riverlib/river_cfg.h"
27
#include <systemc.h>
28
#include "api_utils.h"
29
 
30
namespace debugger {
31
 
32
class RtlWrapper : public sc_module,
33 4 sergeykhbr
                   public IResetListener,
34
                   public ICpuGeneric,
35 3 sergeykhbr
                   public ICpuRiscV {
36 4 sergeykhbr
 public:
37 3 sergeykhbr
    sc_clock o_clk;
38
    sc_out<bool> o_nrst;
39
    // Timer:
40
    sc_in<sc_uint<RISCV_ARCH>> i_time;
41
    // Memory interface:
42
    sc_out<bool> o_req_mem_ready;
43
    sc_in<bool> i_req_mem_valid;
44
    sc_in<bool> i_req_mem_write;
45
    sc_in<sc_uint<BUS_ADDR_WIDTH>> i_req_mem_addr;
46
    sc_in<sc_uint<BUS_DATA_BYTES>> i_req_mem_strob;
47
    sc_in<sc_uint<BUS_DATA_WIDTH>> i_req_mem_data;
48
    sc_out<bool> o_resp_mem_data_valid;
49
    sc_out<sc_uint<BUS_DATA_WIDTH>> o_resp_mem_data;
50
    /** Interrupt line from external interrupts controller. */
51
    sc_out<bool> o_interrupt;
52
    // Debug interface
53
    sc_out<bool> o_dport_valid;                          // Debug access from DSU is valid
54
    sc_out<bool> o_dport_write;                          // Write value
55
    sc_out<sc_uint<2>> o_dport_region;                   // Registers region ID: 0=CSR; 1=IREGS; 2=Control
56
    sc_out<sc_uint<12>> o_dport_addr;                    // Register index
57
    sc_out<sc_uint<RISCV_ARCH>> o_dport_wdata;           // Write value
58
    sc_in<bool> i_dport_ready;                           // Response is ready
59
    sc_in<sc_uint<RISCV_ARCH>> i_dport_rdata;            // Response value
60
 
61
 
62
    struct RegistersType {
63
        sc_signal<sc_uint<BUS_DATA_WIDTH>> resp_mem_data;
64
        sc_signal<bool> resp_mem_data_valid;
65
        sc_signal<sc_uint<3>> wait_state_cnt;
66
        sc_signal<sc_bv<5>> nrst;
67
        sc_signal<bool> interrupt;
68
        // Debug port latches:
69
        sc_signal<bool> dport_valid;
70
        sc_signal<bool> dport_write;
71
        sc_signal<sc_uint<2>> dport_region;
72
        sc_signal<sc_uint<12>> dport_addr;
73
        sc_signal<sc_uint<RISCV_ARCH>> dport_wdata;
74
    } r, v;
75
    bool w_nrst;
76
    bool w_interrupt;
77
 
78
    void clk_gen();
79
    void comb();
80
    void registers();
81
    void clk_negedge_proc();
82
 
83
    SC_HAS_PROCESS(RtlWrapper);
84
 
85
    RtlWrapper(IFace *parent, sc_module_name name);
86
    virtual ~RtlWrapper();
87
 
88 4 sergeykhbr
 public:
89 3 sergeykhbr
    void generateRef(bool v) { generate_ref_ = v; }
90
    void generateVCD(sc_trace_file *i_vcd, sc_trace_file *o_vcd);
91 4 sergeykhbr
    void setBus(IMemoryOperation *v) { ibus_ = v; }
92 3 sergeykhbr
    /** Default time resolution 1 picosecond. */
93
    void setClockHz(double hz);
94
 
95 4 sergeykhbr
    /** ICpuGeneric interface */
96 3 sergeykhbr
    virtual void raiseSignal(int idx);
97
    virtual void lowerSignal(int idx);
98
    virtual void nb_transport_debug_port(DebugPortTransactionType *trans,
99
                                        IDbgNbResponse *cb);
100
 
101 4 sergeykhbr
    /** IClock */
102
    virtual void registerStepCallback(IClockListener *cb, uint64_t t);
103
 
104
    /** IResetListener */
105
    virtual void reset(bool active) {
106
        o_nrst.write(!active);
107
    }
108
 
109
 
110
 private:
111 3 sergeykhbr
    IFace *getInterface(const char *name) { return iparent_; }
112
    uint64_t mask2offset(uint8_t mask);
113
    uint32_t mask2size(uint8_t mask);       // nask with removed offset
114
 
115 4 sergeykhbr
 private:
116
    IMemoryOperation *ibus_;
117 3 sergeykhbr
    IFace *iparent_;    // pointer on parent module object (used for logging)
118
    int clockCycles_;   // default in [ps]
119 4 sergeykhbr
    ClockAsyncTQueueType step_queue_;
120 3 sergeykhbr
    bool generate_ref_;
121
 
122
    sc_uint<32> t_trans_idx_up;
123
    sc_uint<32> t_trans_idx_down;
124
 
125
    struct DebugPortType {
126
        event_def valid;
127
        DebugPortTransactionType *trans;
128
        IDbgNbResponse *cb;
129
        unsigned trans_idx_up;
130
        unsigned trans_idx_down;
131
        unsigned idx_missmatch;
132
    } dport_;
133
};
134
 
135
}  // namespace debugger
136
 
137
#endif  // __DEBUGGER_RTL_WRAPPER_H__

powered by: WebSVN 2.1.0

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