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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [cpu_sysc_plugin/] [riverlib/] [core/] [br_predic.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 "br_predic.h"
18
 
19
namespace debugger {
20
 
21
BranchPredictor::BranchPredictor(sc_module_name name_) : sc_module(name_) {
22
    SC_METHOD(comb);
23
    sensitive << i_nrst;
24
    sensitive << i_req_mem_fire;
25
    sensitive << i_resp_mem_valid;
26
    sensitive << i_resp_mem_addr;
27
    sensitive << i_resp_mem_data;
28
    sensitive << i_f_predic_miss;
29
    sensitive << i_e_npc;
30
    sensitive << i_ra;
31
    sensitive << r.npc;
32 4 sergeykhbr
    sensitive << r.resp_mem_data;
33
    sensitive << r.resp_mem_addr;
34 3 sergeykhbr
 
35
    SC_METHOD(registers);
36
    sensitive << i_clk.pos();
37
};
38
 
39
void BranchPredictor::generateVCD(sc_trace_file *i_vcd, sc_trace_file *o_vcd) {
40
    if (o_vcd) {
41
        sc_trace(o_vcd, i_req_mem_fire, "/top/proc0/bp0/i_req_mem_fire");
42
        sc_trace(o_vcd, i_resp_mem_valid, "/top/proc0/bp0/i_resp_mem_valid");
43
        sc_trace(o_vcd, i_resp_mem_addr, "/top/proc0/bp0/i_resp_mem_addr");
44
        sc_trace(o_vcd, i_resp_mem_data, "/top/proc0/bp0/i_resp_mem_data");
45
        sc_trace(o_vcd, i_f_predic_miss, "/top/proc0/bp0/i_f_predic_miss");
46
        sc_trace(o_vcd, i_e_npc, "/top/proc0/bp0/i_e_npc");
47
        sc_trace(o_vcd, i_ra, "/top/proc0/bp0/i_ra");
48
 
49
        sc_trace(o_vcd, o_npc_predict, "/top/proc0/bp0/o_npc_predict");
50
        sc_trace(o_vcd, r.npc, "/top/proc0/bp0/r_npc");
51 4 sergeykhbr
        sc_trace(o_vcd, r.resp_mem_data, "/top/proc0/bp0/r_resp_mem_data");
52
        sc_trace(o_vcd, r.resp_mem_addr, "/top/proc0/bp0/r_resp_mem_addr");
53
        sc_trace(o_vcd, wb_npc, "/top/proc0/bp0/wb_npc");
54 3 sergeykhbr
    }
55
}
56
 
57
void BranchPredictor::comb() {
58
    v = r;
59 4 sergeykhbr
    sc_uint<BUS_ADDR_WIDTH> wb_jal_off;
60 3 sergeykhbr
    sc_uint<32> wb_tmp;
61
 
62 4 sergeykhbr
    if (i_resp_mem_valid.read()) {
63
        v.resp_mem_addr = i_resp_mem_addr.read();
64
        v.resp_mem_data = i_resp_mem_data.read();
65 3 sergeykhbr
    }
66 4 sergeykhbr
    wb_tmp = r.resp_mem_data.read();
67
    wb_npc = r.npc.read();
68 3 sergeykhbr
 
69
    if (wb_tmp[31]) {
70 4 sergeykhbr
        wb_jal_off(BUS_ADDR_WIDTH-1, 20) = ~0;
71 3 sergeykhbr
    } else {
72 4 sergeykhbr
        wb_jal_off(BUS_ADDR_WIDTH-1, 20) = 0;
73 3 sergeykhbr
    }
74 4 sergeykhbr
    wb_jal_off(19, 12) = wb_tmp(19, 12);
75
    wb_jal_off[11] = wb_tmp[20];
76
    wb_jal_off(10, 1) = wb_tmp(30, 21);
77
    wb_jal_off[0] = 0;
78 3 sergeykhbr
 
79 4 sergeykhbr
    if (i_f_predic_miss.read()) {
80
        wb_npc = i_e_npc.read();
81
    } else if (wb_tmp == 0x00008067) {
82
        // ret32 pseudo-instruction:
83
        wb_npc = i_ra.read()(BUS_ADDR_WIDTH-1, 0);
84
    //} else if (wb_tmp(6, 0) == 0x6f) {
85
        // jal instruction: Dhry score 35136 -> 36992
86
        //wb_npc = r.resp_mem_addr.read() + wb_jal_off;
87
    } else {
88
        wb_npc = r.npc.read() + 2;
89
    }
90
 
91
    if (i_req_mem_fire.read()) {
92 3 sergeykhbr
        v.npc = wb_npc;
93
    }
94
 
95
    if (!i_nrst.read()) {
96 4 sergeykhbr
        v.npc = RESET_VECTOR - 2;
97
        v.resp_mem_addr = RESET_VECTOR;
98
        v.resp_mem_data = 0;
99 3 sergeykhbr
    }
100
 
101 4 sergeykhbr
    o_npc_predict = wb_npc;
102 3 sergeykhbr
}
103
 
104
void BranchPredictor::registers() {
105
    r = v;
106
}
107
 
108
}  // namespace debugger
109
 

powered by: WebSVN 2.1.0

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