| 1 | #ifndef _FSM_H
|
|---|
| 2 | #define _FSM_H
|
|---|
| 3 | #include "systemc.h"
|
|---|
| 4 | #include "constants.h"
|
|---|
| 5 |
|
|---|
| 6 | #include <iostream>
|
|---|
| 7 | #include <fstream>
|
|---|
| 8 | #include <string>
|
|---|
| 9 | using namespace std;
|
|---|
| 10 |
|
|---|
| 11 | #define MEMNOP 0
|
|---|
| 12 | #define MEMREAD 1
|
|---|
| 13 | #define MEMWRITE 2
|
|---|
| 14 |
|
|---|
| 15 | #define R_RS 0
|
|---|
| 16 | #define R_RT 1
|
|---|
| 17 |
|
|---|
| 18 | #define W_RT 0
|
|---|
| 19 | #define W_RD 1
|
|---|
| 20 |
|
|---|
| 21 | #define MUX_ADDR_AD 0
|
|---|
| 22 | #define MUX_ADDR_PC 1
|
|---|
| 23 |
|
|---|
| 24 | #define MUX_X_PC 0
|
|---|
| 25 | #define MUX_X_RF 1
|
|---|
| 26 | #define MUX_X_AD 2
|
|---|
| 27 | #define MUX_X_DT 3
|
|---|
| 28 | #define MUX_X_CST0 4
|
|---|
| 29 |
|
|---|
| 30 | #define MUX_Y_CST0 0
|
|---|
| 31 | #define MUX_Y_CST4 1
|
|---|
| 32 | #define MUX_Y_AD 2
|
|---|
| 33 | #define MUX_Y_SE32 3
|
|---|
| 34 | #define MUX_Y_SHF2 4
|
|---|
| 35 | #define MUX_Y_NSE32 5
|
|---|
| 36 |
|
|---|
| 37 | #define ALU_OP_ADD 2
|
|---|
| 38 | #define ALU_OP_SUB 6
|
|---|
| 39 | #define ALU_OP_OR 7
|
|---|
| 40 |
|
|---|
| 41 | #define S_RESET 0
|
|---|
| 42 | #define S_PCPLUS4 1
|
|---|
| 43 | #define S_LW1 2
|
|---|
| 44 | #define S_LW2 3
|
|---|
| 45 | #define S_LW3 4
|
|---|
| 46 | #define S_SW1 5
|
|---|
| 47 | #define S_SW2 6
|
|---|
| 48 | #define S_SW3 7
|
|---|
| 49 | #define S_ADDI1 8
|
|---|
| 50 | #define S_ADDI2 9
|
|---|
| 51 |
|
|---|
| 52 | SC_MODULE(fsm)
|
|---|
| 53 | {
|
|---|
| 54 | sc_in<bool> clk;
|
|---|
| 55 | sc_in<bool> reset;
|
|---|
| 56 | sc_in<sc_uint<32> > ir;
|
|---|
| 57 | sc_in<bool> zero;
|
|---|
| 58 |
|
|---|
| 59 | sc_out<bool> write_pc;
|
|---|
| 60 | sc_out<bool> mux_rf_w;
|
|---|
| 61 | sc_out<bool> write_rf;
|
|---|
| 62 | sc_out<bool> mux_rf_r;
|
|---|
| 63 | sc_out<bool> write_ad;
|
|---|
| 64 | sc_out<bool> write_dt;
|
|---|
| 65 | sc_out<bool> write_ir;
|
|---|
| 66 | sc_out<sc_uint<3> > mux_x;
|
|---|
| 67 | sc_out<sc_uint<3> > mux_y;
|
|---|
| 68 | sc_out<bool> mux_addr;
|
|---|
| 69 | sc_out<sc_uint<3> > alu_op;
|
|---|
| 70 | sc_out<sc_uint<2> > memrw;
|
|---|
| 71 |
|
|---|
| 72 | sc_signal<int> state,next_state;
|
|---|
| 73 |
|
|---|
| 74 | SC_CTOR(fsm)
|
|---|
| 75 | {
|
|---|
| 76 |
|
|---|
| 77 | SC_METHOD(mReg);
|
|---|
| 78 | sensitive << clk.pos();
|
|---|
| 79 | SC_METHOD(mNextState);
|
|---|
| 80 | sensitive << state << ir << zero;
|
|---|
| 81 | SC_METHOD(mMooreOutputs);
|
|---|
| 82 | sensitive << state;
|
|---|
| 83 | }
|
|---|
| 84 |
|
|---|
| 85 | void mReg()
|
|---|
| 86 | {
|
|---|
| 87 | if (reset==0)
|
|---|
| 88 | state=S_RESET;
|
|---|
| 89 | else
|
|---|
| 90 | state=next_state;
|
|---|
| 91 | }
|
|---|
| 92 |
|
|---|
| 93 | void mNextState()
|
|---|
| 94 | {
|
|---|
| 95 | sc_uint<32> ir_value=ir.read();
|
|---|
| 96 | switch (state)
|
|---|
| 97 | {
|
|---|
| 98 | case S_RESET: // 0
|
|---|
| 99 | next_state=S_PCPLUS4;
|
|---|
| 100 | break;
|
|---|
| 101 | case S_PCPLUS4: // 1
|
|---|
| 102 | if ((int)ir_value.range(31,26)==OP_LW)
|
|---|
| 103 | next_state=S_LW1;
|
|---|
| 104 | else if ((int)ir_value.range(31,26)==OP_SW)
|
|---|
| 105 | next_state=S_SW1;
|
|---|
| 106 | else if ((int)ir_value.range(31,26)==OP_ADDI)
|
|---|
| 107 | next_state=S_ADDI1;
|
|---|
| 108 | break;
|
|---|
| 109 | case S_LW1: //2
|
|---|
| 110 | next_state=S_LW2;
|
|---|
| 111 | break;
|
|---|
| 112 | case S_LW2: //3
|
|---|
| 113 | next_state=S_LW3;
|
|---|
| 114 | break;
|
|---|
| 115 | case S_LW3: //4
|
|---|
| 116 | next_state=S_PCPLUS4;
|
|---|
| 117 | break;
|
|---|
| 118 | case S_SW1:
|
|---|
| 119 | next_state=S_SW2;
|
|---|
| 120 | break;
|
|---|
| 121 | case S_SW2:
|
|---|
| 122 | next_state=S_SW3;
|
|---|
| 123 | break;
|
|---|
| 124 | case S_SW3:
|
|---|
| 125 | next_state=S_PCPLUS4;
|
|---|
| 126 | break;
|
|---|
| 127 | case S_ADDI1:
|
|---|
| 128 | next_state=S_ADDI2;
|
|---|
| 129 | break;
|
|---|
| 130 | case S_ADDI2:
|
|---|
| 131 | next_state=S_PCPLUS4;
|
|---|
| 132 | break;
|
|---|
| 133 | default:
|
|---|
| 134 | cout << "Erreur dans la fonction mNextState de fsm" << endl ;
|
|---|
| 135 | exit(1);
|
|---|
| 136 | break;
|
|---|
| 137 | }
|
|---|
| 138 | }
|
|---|
| 139 |
|
|---|
| 140 | void mMooreOutputs()
|
|---|
| 141 | {
|
|---|
| 142 | sc_uint<32> ir_value=ir.read();
|
|---|
| 143 | switch(state)
|
|---|
| 144 | {
|
|---|
| 145 | case S_RESET:
|
|---|
| 146 | write_pc=0;
|
|---|
| 147 | mux_rf_w=W_RT;
|
|---|
| 148 | write_rf=0;
|
|---|
| 149 | mux_rf_r=R_RS;
|
|---|
| 150 | write_ad=0;
|
|---|
| 151 | write_dt=0;
|
|---|
| 152 | write_ir=1;
|
|---|
| 153 | mux_x=MUX_X_CST0;
|
|---|
| 154 | mux_y=MUX_Y_CST0;
|
|---|
| 155 | mux_addr=MUX_ADDR_PC;
|
|---|
| 156 | alu_op=ALU_OP_ADD;
|
|---|
| 157 | memrw=MEMREAD;
|
|---|
| 158 | break;
|
|---|
| 159 |
|
|---|
| 160 | case S_PCPLUS4:
|
|---|
| 161 | write_pc=1;
|
|---|
| 162 | mux_rf_w=W_RT;
|
|---|
| 163 | write_rf=0;
|
|---|
| 164 | mux_rf_r=R_RS;
|
|---|
| 165 | write_ad=0;
|
|---|
| 166 | write_dt=0;
|
|---|
| 167 | write_ir=0;
|
|---|
| 168 | mux_x=MUX_X_PC;
|
|---|
| 169 | mux_y=MUX_Y_CST4;
|
|---|
| 170 | mux_addr=MUX_ADDR_PC;
|
|---|
| 171 | alu_op=ALU_OP_ADD;
|
|---|
| 172 | memrw=MEMNOP;
|
|---|
| 173 | break;
|
|---|
| 174 |
|
|---|
| 175 | case S_LW1: // RS+IMD16 -> AD
|
|---|
| 176 | write_pc=0;
|
|---|
| 177 | mux_rf_w=W_RT;
|
|---|
| 178 | write_rf=0;
|
|---|
| 179 | mux_rf_r=R_RS;
|
|---|
| 180 | write_ad=1;
|
|---|
| 181 | write_dt=0;
|
|---|
| 182 | write_ir=0;
|
|---|
| 183 | mux_x=MUX_X_RF;
|
|---|
| 184 | mux_y=MUX_Y_SE32;
|
|---|
| 185 | mux_addr=MUX_ADDR_PC;
|
|---|
| 186 | alu_op=ALU_OP_ADD;
|
|---|
| 187 | memrw=MEMNOP;
|
|---|
| 188 | break;
|
|---|
| 189 |
|
|---|
| 190 | case S_LW2:
|
|---|
| 191 | write_pc=0;
|
|---|
| 192 | mux_rf_w=W_RT;
|
|---|
| 193 | write_rf=0;
|
|---|
| 194 | mux_rf_r=R_RS;
|
|---|
| 195 | write_ad=0;
|
|---|
| 196 | write_dt=1;
|
|---|
| 197 | write_ir=0;
|
|---|
| 198 | mux_x=MUX_X_CST0;
|
|---|
| 199 | mux_y=MUX_Y_CST0;
|
|---|
| 200 | mux_addr=MUX_ADDR_AD;
|
|---|
| 201 | alu_op=ALU_OP_ADD;
|
|---|
| 202 | memrw=MEMREAD;
|
|---|
| 203 | break;
|
|---|
| 204 |
|
|---|
| 205 | case S_LW3: // DT -> R[20:16], MEM[PC]->IR
|
|---|
| 206 | write_pc=0;
|
|---|
| 207 | mux_rf_w=W_RT;
|
|---|
| 208 | write_rf=1;
|
|---|
| 209 | mux_rf_r=R_RS;
|
|---|
| 210 | write_ad=0;
|
|---|
| 211 | write_dt=0;
|
|---|
| 212 | write_ir=1;
|
|---|
| 213 | mux_x=MUX_X_DT; // DT
|
|---|
| 214 | mux_y=MUX_Y_CST0; //CST0
|
|---|
| 215 | mux_addr=MUX_ADDR_PC;
|
|---|
| 216 | alu_op=ALU_OP_ADD;
|
|---|
| 217 | memrw=MEMREAD;
|
|---|
| 218 | break;
|
|---|
| 219 |
|
|---|
| 220 | case S_SW1: // RS+IMD16 -> AD
|
|---|
| 221 | write_pc=0;
|
|---|
| 222 | mux_rf_w=W_RT;
|
|---|
| 223 | write_rf=0;
|
|---|
| 224 | mux_rf_r=R_RS;
|
|---|
| 225 | write_ad=1;
|
|---|
| 226 | write_dt=0;
|
|---|
| 227 | write_ir=0;
|
|---|
| 228 | mux_x=MUX_X_RF;
|
|---|
| 229 | mux_y=MUX_Y_SE32;
|
|---|
| 230 | mux_addr=MUX_ADDR_PC;
|
|---|
| 231 | alu_op=ALU_OP_ADD;
|
|---|
| 232 | memrw=MEMNOP;
|
|---|
| 233 | break;
|
|---|
| 234 |
|
|---|
| 235 | case S_SW2: // R[20->16] -> MEM[AD]
|
|---|
| 236 | write_pc=0;
|
|---|
| 237 | mux_rf_w=W_RT;
|
|---|
| 238 | write_rf=0;
|
|---|
| 239 | mux_rf_r=R_RT;
|
|---|
| 240 | write_ad=0;
|
|---|
| 241 | write_dt=0;
|
|---|
| 242 | write_ir=0;
|
|---|
| 243 | mux_x=MUX_X_RF; // RF
|
|---|
| 244 | mux_y=MUX_Y_CST0; // CST0
|
|---|
| 245 | mux_addr=MUX_ADDR_AD;
|
|---|
| 246 | alu_op=ALU_OP_ADD;
|
|---|
| 247 | memrw=MEMWRITE;
|
|---|
| 248 | break;
|
|---|
| 249 |
|
|---|
| 250 | case S_SW3: // MEM[PC] -> IR
|
|---|
| 251 | write_pc=0;
|
|---|
| 252 | mux_rf_w=W_RT;
|
|---|
| 253 | write_rf=0;
|
|---|
| 254 | mux_rf_r=R_RS;
|
|---|
| 255 | write_ad=0;
|
|---|
| 256 | write_dt=0;
|
|---|
| 257 | write_ir=1;
|
|---|
| 258 | mux_x=MUX_X_CST0; // CST0
|
|---|
| 259 | mux_y=MUX_Y_CST0; // CST0
|
|---|
| 260 | mux_addr=MUX_ADDR_PC;
|
|---|
| 261 | alu_op=ALU_OP_ADD;
|
|---|
| 262 | memrw=MEMREAD;
|
|---|
| 263 | break;
|
|---|
| 264 |
|
|---|
| 265 | case S_ADDI1:
|
|---|
| 266 | write_pc=0;
|
|---|
| 267 | mux_rf_w=W_RT;
|
|---|
| 268 | write_rf=0;
|
|---|
| 269 | mux_rf_r=R_RS;
|
|---|
| 270 | write_ad=1;
|
|---|
| 271 | write_dt=0;
|
|---|
| 272 | write_ir=0;
|
|---|
| 273 | mux_x=MUX_X_RF;
|
|---|
| 274 | mux_y=MUX_Y_SE32;
|
|---|
| 275 | mux_addr=MUX_ADDR_PC;
|
|---|
| 276 | alu_op=ALU_OP_ADD;
|
|---|
| 277 | memrw=MEMNOP;
|
|---|
| 278 | break;
|
|---|
| 279 |
|
|---|
| 280 | case S_ADDI2:
|
|---|
| 281 | write_pc=0;
|
|---|
| 282 | mux_rf_w=W_RT;
|
|---|
| 283 | write_rf=1;
|
|---|
| 284 | mux_rf_r=R_RS;
|
|---|
| 285 | write_ad=0;
|
|---|
| 286 | write_dt=0;
|
|---|
| 287 | write_ir=1;
|
|---|
| 288 | mux_x=MUX_X_AD;
|
|---|
| 289 | mux_y=MUX_Y_CST0;
|
|---|
| 290 | mux_addr=MUX_ADDR_PC;
|
|---|
| 291 | alu_op=ALU_OP_ADD;
|
|---|
| 292 | memrw=MEMREAD;
|
|---|
| 293 | break;
|
|---|
| 294 | default:
|
|---|
| 295 | cout << "Erreur dans la fonction mMooreOutputs de fsm" << endl ;
|
|---|
| 296 | exit(1);
|
|---|
| 297 | break;
|
|---|
| 298 | }
|
|---|
| 299 | }
|
|---|
| 300 | };
|
|---|
| 301 | #endif
|
|---|