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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [cpu_sysc_plugin/] [cpu_riscv_rtl.cpp] - 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
#include "api_core.h"
18
#include "cpu_riscv_rtl.h"
19
 
20
namespace debugger {
21
 
22
CpuRiscV_RTL::CpuRiscV_RTL(const char *name)
23
    : IService(name), IHap(HAP_ConfigDone) {
24
    registerInterface(static_cast<IThread *>(this));
25
    registerInterface(static_cast<IClock *>(this));
26
    registerInterface(static_cast<IHap *>(this));
27
    registerAttribute("Bus", &bus_);
28
    registerAttribute("FreqHz", &freqHz_);
29
    registerAttribute("InVcdFile", &InVcdFile_);
30
    registerAttribute("OutVcdFile", &OutVcdFile_);
31
    registerAttribute("GenerateRef", &GenerateRef_);
32
 
33
    bus_.make_string("");
34
    freqHz_.make_uint64(1);
35
    InVcdFile_.make_string("");
36
    OutVcdFile_.make_string("");
37
    GenerateRef_.make_boolean(false);
38
    RISCV_event_create(&config_done_, "riscv_sysc_config_done");
39
    RISCV_register_hap(static_cast<IHap *>(this));
40
 
41
    createSystemC();
42
}
43
 
44
CpuRiscV_RTL::~CpuRiscV_RTL() {
45
    deleteSystemC();
46
    RISCV_event_close(&config_done_);
47
}
48
 
49
void CpuRiscV_RTL::postinitService() {
50 4 sergeykhbr
    ibus_ = static_cast<IMemoryOperation *>(
51
       RISCV_get_service_iface(bus_.to_string(), IFACE_MEMORY_OPERATION));
52 3 sergeykhbr
 
53
    if (!ibus_) {
54
        RISCV_error("Bus interface '%s' not found",
55
                    bus_.to_string());
56
        return;
57
    }
58
 
59
    if (InVcdFile_.size()) {
60
        i_vcd_ = sc_create_vcd_trace_file(InVcdFile_.to_string());
61
        i_vcd_->set_time_unit(1, SC_PS);
62
    } else {
63
        i_vcd_ = 0;
64
    }
65
 
66
    if (OutVcdFile_.size()) {
67
        o_vcd_ = sc_create_vcd_trace_file(OutVcdFile_.to_string());
68
        o_vcd_->set_time_unit(1, SC_PS);
69
    } else {
70
        o_vcd_ = 0;
71
    }
72
 
73
    wrapper_->setBus(ibus_);
74
    wrapper_->setClockHz(freqHz_.to_int());
75
    wrapper_->generateRef(GenerateRef_.to_bool());
76
    wrapper_->generateVCD(i_vcd_, o_vcd_);
77
    top_->generateRef(GenerateRef_.to_bool());
78
    top_->generateVCD(i_vcd_, o_vcd_);
79
 
80
    if (!run()) {
81
        RISCV_error("Can't create thread.", NULL);
82
        return;
83
    }
84
}
85
 
86
void CpuRiscV_RTL::createSystemC() {
87
    sc_set_default_time_unit(1, SC_NS);
88
 
89
    /** Create all objects, then initilize SystemC context: */
90
    wrapper_ = new RtlWrapper(static_cast<IService *>(this), "wrapper");
91 4 sergeykhbr
    registerInterface(static_cast<ICpuGeneric *>(wrapper_));
92 3 sergeykhbr
    registerInterface(static_cast<ICpuRiscV *>(wrapper_));
93 4 sergeykhbr
    registerInterface(static_cast<IResetListener *>(wrapper_));
94 3 sergeykhbr
    w_clk = wrapper_->o_clk;
95
    wrapper_->o_nrst(w_nrst);
96
    wrapper_->i_time(wb_time);
97
    wrapper_->o_req_mem_ready(w_req_mem_ready);
98
    wrapper_->i_req_mem_valid(w_req_mem_valid);
99
    wrapper_->i_req_mem_write(w_req_mem_write);
100
    wrapper_->i_req_mem_addr(wb_req_mem_addr);
101
    wrapper_->i_req_mem_strob(wb_req_mem_strob);
102
    wrapper_->i_req_mem_data(wb_req_mem_data);
103
    wrapper_->o_resp_mem_data_valid(w_resp_mem_data_valid);
104
    wrapper_->o_resp_mem_data(wb_resp_mem_data);
105
    wrapper_->o_interrupt(w_interrupt);
106
    wrapper_->o_dport_valid(w_dport_valid);
107
    wrapper_->o_dport_write(w_dport_write);
108
    wrapper_->o_dport_region(wb_dport_region);
109
    wrapper_->o_dport_addr(wb_dport_addr);
110
    wrapper_->o_dport_wdata(wb_dport_wdata);
111
    wrapper_->i_dport_ready(w_dport_ready);
112
    wrapper_->i_dport_rdata(wb_dport_rdata);
113
 
114
    top_ = new RiverTop("top");
115
    top_->i_clk(wrapper_->o_clk);
116
    top_->i_nrst(w_nrst);
117
    top_->i_req_mem_ready(w_req_mem_ready);
118
    top_->o_req_mem_valid(w_req_mem_valid);
119
    top_->o_req_mem_write(w_req_mem_write);
120
    top_->o_req_mem_addr(wb_req_mem_addr);
121
    top_->o_req_mem_strob(wb_req_mem_strob);
122
    top_->o_req_mem_data(wb_req_mem_data);
123
    top_->i_resp_mem_data_valid(w_resp_mem_data_valid);
124
    top_->i_resp_mem_data(wb_resp_mem_data);
125
    top_->i_ext_irq(w_interrupt);
126
    top_->o_time(wb_time);
127
    top_->i_dport_valid(w_dport_valid);
128
    top_->i_dport_write(w_dport_write);
129
    top_->i_dport_region(wb_dport_region);
130
    top_->i_dport_addr(wb_dport_addr);
131
    top_->i_dport_wdata(wb_dport_wdata);
132
    top_->o_dport_ready(w_dport_ready);
133
    top_->o_dport_rdata(wb_dport_rdata);
134
 
135
    sc_start(0, SC_NS);
136
}
137
 
138
void CpuRiscV_RTL::deleteSystemC() {
139
    delete wrapper_;
140
    delete top_;
141
}
142
 
143
void CpuRiscV_RTL::hapTriggered(IFace *isrc, EHapType type,
144
                                const char *descr) {
145
    RISCV_event_set(&config_done_);
146
}
147
 
148
void CpuRiscV_RTL::stop() {
149
    sc_stop();
150
    IThread::stop();
151
}
152
 
153
void CpuRiscV_RTL::busyLoop() {
154
    RISCV_event_wait(&config_done_);
155
 
156
    sc_start();
157
 
158
    if (i_vcd_) {
159
        sc_close_vcd_trace_file(i_vcd_);
160
    }
161
    if (o_vcd_) {
162
        sc_close_vcd_trace_file(o_vcd_);
163
    }
164
}
165
 
166
}  // namespace debugger
167
 

powered by: WebSVN 2.1.0

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