1 |
4 |
igorloi |
//
|
2 |
|
|
// $Id: sc_cpu.h,v 1.1 2006-01-25 17:00:01 igorloi Exp $
|
3 |
|
|
//
|
4 |
|
|
|
5 |
|
|
#ifndef _SC_CPU_H
|
6 |
|
|
#define _SC_CPU_H
|
7 |
|
|
|
8 |
|
|
#include <systemc.h>
|
9 |
|
|
#include "../constants/config.h"
|
10 |
|
|
#include "../constants/constants.h"
|
11 |
|
|
#include "pc_stage.h"
|
12 |
|
|
#include "if_stage.h"
|
13 |
|
|
#include "id_stage.h"
|
14 |
|
|
#include "ex_stage.h"
|
15 |
|
|
#include "mem_stage.h"
|
16 |
|
|
#include "enable_stage.h"
|
17 |
|
|
#include "writeback_ctrl.h"
|
18 |
|
|
#include "mux_instaddr.h"
|
19 |
|
|
|
20 |
|
|
#ifdef _MULT_PIPELINE_
|
21 |
|
|
#include "or_gate.h"
|
22 |
|
|
#endif
|
23 |
|
|
|
24 |
|
|
SC_MODULE(sc_cpu)
|
25 |
|
|
{
|
26 |
|
|
// to CP0_STAGE
|
27 |
|
|
sc_in<sc_lv<32> > new_pc;
|
28 |
|
|
sc_in<sc_logic> load_epc;
|
29 |
|
|
sc_out<sc_lv<32> > pc_in;
|
30 |
|
|
sc_out<sc_lv<32> > pc_out;
|
31 |
|
|
sc_out<sc_logic> id_branch;
|
32 |
|
|
sc_out<sc_logic> id_ctrl;
|
33 |
|
|
sc_out<sc_logic> id_ex_datarw;
|
34 |
|
|
sc_out<sc_logic> id_ex_datareq;
|
35 |
|
|
sc_in<sc_logic> addr_err;
|
36 |
|
|
sc_in<bool> insthold;
|
37 |
|
|
sc_out<sc_lv<4> > cp0_inst;
|
38 |
|
|
sc_out<sc_lv<32> > reg_rs;
|
39 |
|
|
sc_in<sc_lv<32> > reg_out;
|
40 |
|
|
sc_out<sc_uint<5> > reg_no;
|
41 |
|
|
sc_out<sc_logic> reg_rw;
|
42 |
|
|
sc_out<sc_lv<32> > ex_id_forward;
|
43 |
|
|
|
44 |
|
|
|
45 |
|
|
// EXCEPTION SIGNAL FROM DATAMEM AND INSTMEM
|
46 |
|
|
//*****************************************************************************************************
|
47 |
|
|
sc_in<sc_logic> inst_addrl; // disaligned address in instmem during fetch stage
|
48 |
|
|
sc_in<sc_logic> IBUS; //page fault in instmem
|
49 |
|
|
sc_in<sc_logic> data_addrl; //disaligned address in datamem during load instruction
|
50 |
|
|
sc_in<sc_logic> data_addrs; //disaligned address in datamem during store instruction
|
51 |
|
|
sc_in<sc_logic> DBUS; //page fault in instmem
|
52 |
|
|
//*****************************************************************************************************
|
53 |
|
|
|
54 |
|
|
// EXCEPTION SIGNALS TO ENABLE/DISABLE PIPELINED STAGE
|
55 |
|
|
//*****************************************************************************************************
|
56 |
|
|
sc_signal<sc_logic> enable_pc;
|
57 |
|
|
sc_signal<sc_logic> enable_fetch;
|
58 |
|
|
sc_signal<sc_logic> enable_decode;
|
59 |
|
|
sc_signal<sc_logic> enable_execute;
|
60 |
|
|
sc_signal<sc_logic> enable_memstage;
|
61 |
|
|
sc_signal<sc_logic> if_exception;
|
62 |
|
|
sc_signal<sc_logic> id_exception;
|
63 |
|
|
sc_signal<sc_logic> ex_exception;
|
64 |
|
|
sc_signal<sc_logic> mem_exception;
|
65 |
|
|
sc_signal<sc_logic> wb_exception;
|
66 |
|
|
sc_signal<sc_logic> interrupt_exception;
|
67 |
|
|
//*****************************************************************************************************
|
68 |
|
|
|
69 |
|
|
// INTERRUPT SIGNALS
|
70 |
|
|
//**********************************************
|
71 |
|
|
sc_in<bool> interrupt_signal;
|
72 |
|
|
sc_out<bool> m_wb_interrupt_signal;
|
73 |
|
|
sc_in<sc_logic> enable_interrupt;
|
74 |
|
|
sc_in<sc_logic> enable_kernel_mode;
|
75 |
|
|
//**********************************************
|
76 |
|
|
|
77 |
|
|
|
78 |
|
|
// PIPELINED EXCEPTION SIGNALS
|
79 |
|
|
//*****************************************************************************************************
|
80 |
|
|
sc_signal<sc_lv<32> > id_ex_inst; // from id_stage to ex_stage
|
81 |
|
|
sc_signal<sc_lv<32> > ex_mem_inst; // from ex_stage to mem_stage
|
82 |
|
|
sc_signal<sc_lv<32> > mem_wb_inst; // from mem_stage to WriteBack
|
83 |
|
|
sc_signal<sc_logic> if_id_inst_addrl; // from if_stage to id_stage
|
84 |
|
|
sc_signal<sc_logic> if_id_IBUS; // from if_stage to id_stage
|
85 |
|
|
sc_signal<sc_logic> id_ex_inst_addrl; // from id_stage to ex_stage
|
86 |
|
|
sc_signal<sc_logic> id_ex_IBUS; // from id_stage to ex_stage
|
87 |
|
|
sc_signal<sc_logic> id_ex_syscall_exception; // from id_stage to ex_stage
|
88 |
|
|
sc_signal<sc_logic> id_ex_illegal_instruction; // from id_stage to ex_stage
|
89 |
|
|
sc_signal<sc_logic> ex_m_ovf_excep; // from ex_stage to mem_stage
|
90 |
|
|
sc_signal<sc_logic> ex_m_inst_addrl; // from ex_stage to mem_stage
|
91 |
|
|
sc_signal<sc_logic> ex_m_IBUS; // from ex_stage to mem_stage
|
92 |
|
|
sc_signal<sc_logic> ex_m_syscall_exception; // from ex_stage to mem_stage
|
93 |
|
|
sc_signal<sc_logic> ex_m_illegal_instruction; // from ex_stage to mem_stage
|
94 |
|
|
sc_out<sc_logic> m_wb_DBUS; // from mem_stage to cp0_cause
|
95 |
|
|
sc_out<sc_logic> m_wb_data_addrl; // from mem_stage to cp0_cause
|
96 |
|
|
sc_out<sc_logic> m_wb_data_addrs; // from mem_stage to cp0_cause
|
97 |
|
|
sc_out<sc_logic> m_wb_ovf_excep; // from mem_stage to cp0_cause
|
98 |
|
|
sc_out<sc_logic> m_wb_syscall_exception; // from mem_stage to cp0_cause
|
99 |
|
|
sc_out<sc_logic> m_wb_illegal_instruction; // from mem_stage to cp0_cause
|
100 |
|
|
sc_out<sc_logic> m_wb_IBUS; // from mem_stage to cp0_cause
|
101 |
|
|
sc_out<sc_logic> m_wb_inst_addrl; // from mem_stage to cp0_cause
|
102 |
|
|
|
103 |
|
|
sc_signal<sc_uint<32> > if_id_instaddr; // from if_stage to id_stage (victim address instruction)
|
104 |
|
|
sc_signal<sc_uint<32> > id_ex_instaddr; // from id_stage to ex_stage (victim address instruction)
|
105 |
|
|
sc_signal<sc_uint<32> > ex_m_instaddr; // from ex_stage to mem_stage address for INTERRUPT EPC
|
106 |
|
|
sc_signal<sc_uint<32> > m_wb_instaddr; // from mem_stage to mux_instaddr (victim address instruction)
|
107 |
|
|
sc_out<sc_uint<32> > m_wb_instaddr_s; // from mux_instaddr to EPC
|
108 |
|
|
sc_out<sc_uint<32> > m_wb_dataaddr; // from mem_stage to cpo_cause (victim address instruction)
|
109 |
|
|
//*****************************************************************************************************
|
110 |
|
|
|
111 |
|
|
|
112 |
|
|
|
113 |
|
|
//
|
114 |
|
|
// Very basic signals for the CPU!
|
115 |
|
|
//
|
116 |
|
|
//! Main clock signal
|
117 |
|
|
sc_in<bool> in_clk;
|
118 |
|
|
//! Main reset signal
|
119 |
|
|
sc_in<bool> reset;
|
120 |
|
|
|
121 |
|
|
//
|
122 |
|
|
// Instruction memory interface
|
123 |
|
|
//
|
124 |
|
|
//! Instruction memory input data
|
125 |
|
|
// sc_inout_rv<32> instdata;
|
126 |
|
|
sc_in<sc_lv<32> > instdataread;
|
127 |
|
|
sc_out<sc_lv<32> > instdatawrite;
|
128 |
|
|
//! Instruction memory address
|
129 |
|
|
sc_out<sc_uint<32> > instaddr;
|
130 |
|
|
//! Instruction memory request
|
131 |
|
|
sc_out<sc_logic> instreq;
|
132 |
|
|
//! Instruction memory read/write signal. 1 for write. 0 for read.
|
133 |
|
|
sc_out<sc_logic> instrw;
|
134 |
|
|
//! Hold signal from cp0 (Was: instruction memory)
|
135 |
|
|
|
136 |
|
|
|
137 |
|
|
//sc_in<bool> x_insthold; //in sc_risc!
|
138 |
|
|
|
139 |
|
|
//
|
140 |
|
|
// Data memory interface
|
141 |
|
|
//
|
142 |
|
|
//! Data memory in/out data
|
143 |
|
|
// sc_inout_rv<32> data;
|
144 |
|
|
sc_in<sc_lv<32> > dataread;
|
145 |
|
|
sc_out<sc_lv<32> > datawrite;
|
146 |
|
|
//! Data memory address
|
147 |
|
|
sc_out<sc_uint<32> > dataaddr;
|
148 |
|
|
//! Data memory request
|
149 |
|
|
sc_out<sc_logic> datareq;
|
150 |
|
|
//! Data memory read/write signal. 1 for write. 0 for read.
|
151 |
|
|
sc_out<sc_logic> datarw;
|
152 |
|
|
//! Byte select signal. Select bytes to be written. 01 for byte, 10 for halfword
|
153 |
|
|
sc_out<sc_lv<2> > databs;
|
154 |
|
|
//! Hold signal from data memory
|
155 |
|
|
sc_in<bool> datahold;
|
156 |
|
|
|
157 |
|
|
|
158 |
|
|
// Misc. signals
|
159 |
|
|
sc_signal<sc_lv<32> > id_new_pc;
|
160 |
|
|
sc_signal<sc_lv<32> > id_jmp_tar;
|
161 |
|
|
sc_signal<sc_lv<32> > if_id_inst;
|
162 |
|
|
sc_signal<sc_lv<32> > if_id_next_pc;
|
163 |
|
|
|
164 |
|
|
// signal from id_stage to ex_stage
|
165 |
|
|
sc_signal<sc_lv<32> > id_ex_alu1;
|
166 |
|
|
sc_signal<sc_lv<32> > id_ex_alu2;
|
167 |
|
|
sc_signal<sc_lv<32> > id_ex_datastore;
|
168 |
|
|
sc_signal<sc_lv<6> > id_ex_alu_ctrl;
|
169 |
|
|
sc_signal<sc_lv<6> > id_ex_alu_opcode;
|
170 |
|
|
sc_signal<sc_lv<6> > id_ex_alu_function;
|
171 |
|
|
sc_signal<sc_logic> id_ex_equal;
|
172 |
|
|
sc_signal<sc_lv<2> > id_ex_byteselect;
|
173 |
|
|
sc_signal<sc_logic> id_ex_bssign;
|
174 |
|
|
sc_signal<sc_lv<5> > id_ex_alu_sa;
|
175 |
|
|
|
176 |
|
|
// signal to mem_stage through ex_stage
|
177 |
|
|
sc_signal<sc_logic> id_ex_memtoreg;
|
178 |
|
|
sc_signal<sc_lv<2> > id_ex_m_byteselect;
|
179 |
|
|
sc_signal<sc_logic> id_ex_m_bssign;
|
180 |
|
|
|
181 |
|
|
// signal to mem_stage
|
182 |
|
|
sc_signal<sc_logic> id_ex_m_datareq;
|
183 |
|
|
sc_signal<sc_logic> id_ex_m_datarw;
|
184 |
|
|
sc_signal<sc_lv<32> > id_ex_m_datastore;
|
185 |
|
|
sc_signal<sc_lv<32> > ex_m_alu;
|
186 |
|
|
sc_signal<sc_logic> id_ex_m_memtoreg;
|
187 |
|
|
sc_signal<sc_logic> m_ocp_cmd;
|
188 |
|
|
|
189 |
|
|
// signal to control save in register
|
190 |
|
|
sc_signal<sc_lv<5> > id_ex_writeregister_out;
|
191 |
|
|
sc_signal<sc_logic> id_ex_regwrite_out;
|
192 |
|
|
|
193 |
|
|
// forwarding control signal
|
194 |
|
|
sc_signal<sc_lv<5> > id_ex_m_writeregister;
|
195 |
|
|
sc_signal<sc_lv<5> > id_ex_m_wb_writeregister;
|
196 |
|
|
sc_signal<sc_logic> id_ex_m_regwrite;
|
197 |
|
|
sc_signal<sc_logic> id_ex_m_wb_regwrite;
|
198 |
|
|
//sc_signal<sc_lv<32> > ex_id_forward;
|
199 |
|
|
sc_signal<sc_lv<32> > m_id_forward;
|
200 |
|
|
sc_signal<sc_lv<32> > wb_id_forward;
|
201 |
|
|
|
202 |
|
|
|
203 |
|
|
// signals between ID stage and cp0
|
204 |
|
|
|
205 |
|
|
sc_signal<sc_logic> inst_break;
|
206 |
|
|
sc_signal<sc_logic> inst_syscall;
|
207 |
|
|
|
208 |
|
|
#ifdef _MULT_PIPELINE_
|
209 |
|
|
sc_signal<bool> hold_pipe;
|
210 |
|
|
sc_signal<bool> insthold_W;
|
211 |
|
|
#endif
|
212 |
|
|
|
213 |
|
|
pc_stage *pc;
|
214 |
|
|
if_stage *if_s;
|
215 |
|
|
id_stage *id;
|
216 |
|
|
ex_stage *ex;
|
217 |
|
|
mem_stage *mem;
|
218 |
|
|
enable_stage *enable_stage1;
|
219 |
|
|
writeback_ctrl *writeback_ctrl1;
|
220 |
|
|
mux_instaddr *mux_instaddr1;
|
221 |
|
|
#ifdef _MULT_PIPELINE_
|
222 |
|
|
or_gate *og1;
|
223 |
|
|
#endif
|
224 |
|
|
|
225 |
|
|
void clocktik()
|
226 |
|
|
{
|
227 |
|
|
};
|
228 |
|
|
|
229 |
|
|
SC_HAS_PROCESS(sc_cpu);
|
230 |
|
|
sc_cpu(const sc_module_name& name_);
|
231 |
|
|
|
232 |
|
|
};
|
233 |
|
|
|
234 |
|
|
#endif
|