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

Subversion Repositories m1_core

[/] [m1_core/] [tags/] [first/] [hdl/] [rtl/] [m1_cpu/] [m1_cpu.v] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 fafa1971
/*
2
 * Simply RISC M1 Central Processing Unit
3
 *
4
 * TODO:
5
 * 1) check pipeline stages (especially load delay slot and branch delay slot)
6
 * 2) check interfaces with multiplier and divider
7
 * 3) interrupt and exception handling, SYSCALL and BREAK
8
 */
9
 
10
`include "m1_defs.h"
11
 
12
module m1_cpu (
13
    sys_clock_i, sys_reset_i, sys_irq_i,
14
    imem_addr_o, imem_data_i, imem_read_o, imem_busy_i,
15
    dmem_addr_o, dmem_data_i, dmem_data_o, dmem_read_o, dmem_write_o, dmem_busy_i , dmem_sel_o
16
  );
17
 
18
  /*
19
   * Input/Output
20
   */
21
 
22
  // System inputs
23
  input sys_clock_i;                                     // System Clock
24
  input sys_reset_i;                                     // System Reset
25
  input[31:0] sys_irq_i;                                 // Interrupt Requests (currently unused)
26
 
27
  // Instruction Memory
28
  output[31:0] imem_addr_o;                              // I$ Address
29
  input[31:0] imem_data_i;                               // I$ Data
30
  output imem_read_o;                                    // I$ Read
31
  input imem_busy_i;                                     // I$ Busy
32
 
33
  // Data Memory
34
  output[31:0] dmem_addr_o;                              // D$ Address
35
  input[31:0] dmem_data_i;                               // D$ Read Data
36
  output[31:0] dmem_data_o;                              // D$ Write Data
37
  output dmem_read_o;                                    // D$ Read
38
  output dmem_write_o;                                   // D$ Write
39
  output[3:0] dmem_sel_o;                                // D$ Byte selector
40
  input dmem_busy_i;                                     // D$ Busy
41
 
42
  /*
43
   * Registers
44
   */
45
 
46
  // Register file
47
  reg[31:0] GPR[0:31];                           // General Purpose Registers
48
  reg[31:0] PC;                                  // Program Counter
49
  reg[31:0] HI, LO;                              // HI and LO registers (for multiplication/division)
50
  reg[31:0] SysCon[0:31];                        // System Control registers
51
 
52
  /*
53
   * Pipeline latches
54
   */
55
 
56
  // Latch 1: IF/ID
57
  reg[31:0] if_id_opcode;                                            // Instruction Register
58
  reg[31:0] if_id_addr, if_id_addrnext;                              // Addresses of the fetched opcode and of the next one
59
 
60
  // Latch 2: ID/EX
61
<<<<<<< m1_cpu.v
62
  reg[31:0] id_ex_opcode;
63
  reg[31:0] id_ex_addr, id_ex_addrnext;
64
  reg[31:0] id_ex_addrbranch, id_ex_addrjump, id_ex_addrjr;          // Evaluated jump addresses
65
  reg[31:0] id_ex_alu_a, id_ex_alu_b;                                // ALU operands
66
  reg[4:0] id_ex_alu_func;                                           // ALU operation code
67
  reg id_ex_alu_signed;                                              // ALU operation is signed
68
  reg id_ex_branch, id_ex_jump, id_ex_jr, id_ex_linked;              // Instruction is a jump
69
  reg id_ex_mult, id_ex_div;                                         // Instruction is a multiplication/division
70
  reg id_ex_load, id_ex_store;                                       // Instruction is a load/store
71
  reg[2:0] id_ex_size;                                               // Load/store size (see defs.h)
72
  reg[31:0] id_ex_store_value;                                       // Store value
73
  reg[4:0] id_ex_destreg;                                            // Destination register (GPR number)
74
  reg id_ex_desthi, id_ex_destlo;                                    // Destination register (HI/LO)
75
  reg[4:0] id_ex_destsyscon;                                         // Destination register (System Control)
76
=======
77
  reg[31:0] id_ex_pc, id_ex_pcnext;
78
  reg[31:0] id_ex_pcjump, id_ex_pcbranch;                // Jump addresses
79
  reg[31:0] id_ex_alu_a, id_ex_alu_b;                    // ALU operands
80
  reg[4:0] id_ex_alu_func;                               // ALU operation code
81
  reg id_ex_alu_signed;                                  // ALU operation is signed
82
  reg id_ex_jump, id_ex_branch, id_ex_linked;            // Instruction is a jump
83
  reg id_ex_load, id_ex_store;                           // Instruction is a load/store
84
  reg[31:0] id_ex_store_value;                           // Store value
85
  reg[4:0] id_ex_destreg;                                // Destination register (GPR)
86
  reg id_ex_desthi, id_ex_destlo;                        // Destination register (HI/LO)
87
>>>>>>> 1.9
88
 
89
  // Latch 3: EX/MEM
90
<<<<<<< m1_cpu.v
91
  reg[31:0] ex_mem_opcode;
92
  reg[31:0] ex_mem_addr, ex_mem_addrnext;
93
  reg[31:0] ex_mem_addrbranch, ex_mem_addrjump, ex_mem_addrjr;
94
  reg[63:0] ex_mem_aluout;                                           // ALU result
95
  reg ex_mem_branch, ex_mem_jump, ex_mem_jr, ex_mem_linked;
96
  reg ex_mem_mult, ex_mem_div;
97
  reg ex_mem_load,ex_mem_store;
98
  reg[31:0] ex_mem_store_value;
99
  reg[3:0] ex_mem_store_sel;                                         // Byte Selector on Stores
100
  reg[4:0] ex_mem_destreg;
101
  reg ex_mem_desthi, ex_mem_destlo;
102
  reg[4:0] ex_mem_destsyscon;
103
=======
104
  reg[31:0] ex_mem_pc, ex_mem_pcnext;
105
  reg[31:0] ex_mem_pcjump, ex_mem_pcbranch;
106
  reg[63:0] ex_mem_alu_out;                               // ALU result
107
  reg ex_mem_jump, ex_mem_branch, ex_mem_linked;
108
  reg ex_mem_load, ex_mem_store;
109
  reg[31:0] ex_mem_store_value;
110
  reg[4:0] ex_mem_destreg;
111
  reg ex_mem_desthi, ex_mem_destlo;
112
>>>>>>> 1.9
113
 
114
  // Latch 4: MEM/WB
115
  reg[31:0] mem_wb_opcode;
116
  reg[31:0] mem_wb_addr, mem_wb_addrnext;
117
  reg[63:0] mem_wb_value;                                            // Write-back value
118
  reg[4:0] mem_wb_destreg;
119
  reg mem_wb_desthi, mem_wb_destlo;
120
  reg[4:0] mem_wb_destsyscon;
121
 
122
  /*
123
   * Wires
124
   */
125
 
126
  // Incremented Program Counters
127
  wire[31:0] PCnext = PC + 4;
128
 
129
  // Memories
130
  assign imem_read_o = 1;
131
  assign imem_addr_o = PC;
132
  assign dmem_addr_o = ex_mem_aluout;
133
  assign dmem_read_o = ex_mem_load;
134
  assign dmem_write_o = ex_mem_store;
135
  assign dmem_data_o = ex_mem_store_value;
136
  assign dmem_sel_o = ex_mem_store_sel;
137
 
138
  // Decode fields from the Instruction Register
139
  wire[5:0] if_id_op = if_id_opcode[31:26];                                     // Operation code
140
  wire[4:0] if_id_rs = if_id_opcode[25:21];                                     // Source register
141
  wire[4:0] if_id_rt = if_id_opcode[20:16];                                     // Target register
142
  wire[4:0] if_id_rd = if_id_opcode[15:11];                                     // Destination register
143
  wire[31:0] if_id_imm_signext = {{16{if_id_opcode[15]}}, if_id_opcode[15:0]};  // Immediate field with sign-extension
144
  wire[31:0] if_id_imm_zeroext = {16'b0, if_id_opcode[15:0]};                   // Immediate field with zero-extension
145
  wire[25:0] if_id_index = if_id_opcode[25:0];                                  // Index field
146
  wire[4:0] if_id_shamt = if_id_opcode[10:6];                                   // Shift amount
147
  wire[5:0] if_id_func = if_id_opcode[5:0];                                     // Function
148
 
149
  // Name the System Configuration registers
150
  wire[31:0] BadVAddr = SysCon[`SYSCON_BADVADDR];
151
  wire[31:0] Status = SysCon[`SYSCON_STATUS];
152
  wire[31:0] Cause = SysCon[`SYSCON_CAUSE];
153
  wire[31:0] EPC = SysCon[`SYSCON_EPC];
154
  wire[31:0] PrID = SysCon[`SYSCON_PRID];
155
 
156
  // Decode fields from the System Configuration registers
157
  wire cause_bd = Cause[31];                // Branch Delay
158
  wire[1:0] cause_ce = Cause[29:28];        // Coprocessor Error
159
  wire[5:0] cause_ip = Cause[15:10];        // Interrupts Pending
160
  wire[1:0] cause_sw = Cause[9:8];          // Software interrupts
161
  wire[3:0] cause_exccode = Cause[5:2];     // Exception Code
162
  wire[3:0] status_cu = Status[31:28];      // Coprocessor Usability
163
  wire status_bev = Status[22];             // Bootstrap Exception Vector
164
  wire status_ts = Status [21];             // TLB Shutdown
165
  wire status_pe = Status[20];              // Parity Error
166
  wire status_cm = Status[19];              // Cache Miss
167
  wire status_pz = Status[18];              // Parity Zero
168
  wire status_swc = Status[17];             // Swap Caches
169
  wire status_isc = Status[16];             // Isolate Cache
170
  wire[7:0] status_intmask = Status[15:0];  // Interrupt Mask
171
  wire status_kuo = Status[5];              // Kernel/User mode Old
172
  wire status_ieo = Status[4];              // Interrupt Enable Old
173
  wire status_kup = Status[3];              // Kernel/User mode Previous
174
  wire status_iep = Status[2];              // Interrupt Enable Previous
175
  wire status_kuc = Status[1];              // Kernel/User mode Current
176
  wire status_iec = Status[0];              // Interrupt Enable Current
177
  wire[7:0] prid_imp = PrID[15:8];          // Implementation
178
  wire[7:0] prid_rev = PrID[7:0];           // Revision
179
 
180
  // True for still undecoded operations that read GPR[rs]
181
  wire if_id_reads_rs = (
182
    if_id_op==`OPCODE_BEQ || if_id_op==`OPCODE_BNE || if_id_op==`OPCODE_BLEZ || if_id_op==`OPCODE_BGTZ ||
183
    if_id_op==`OPCODE_ADDI || if_id_op==`OPCODE_ADDIU || if_id_op==`OPCODE_SLTI || if_id_op==`OPCODE_SLTIU ||
184
    if_id_op==`OPCODE_ANDI || if_id_op==`OPCODE_ORI || if_id_op==`OPCODE_XORI || if_id_op==`OPCODE_LB ||
185
    if_id_op==`OPCODE_LH || if_id_op==`OPCODE_LWL || if_id_op==`OPCODE_LW || if_id_op==`OPCODE_LBU ||
186
    if_id_op==`OPCODE_LHU || if_id_op==`OPCODE_LWR || if_id_op==`OPCODE_SB || if_id_op==`OPCODE_SH ||
187
    if_id_op==`OPCODE_SWL || if_id_op==`OPCODE_SW || if_id_op==`OPCODE_SWR || (
188
      if_id_op==`OPCODE_SPECIAL && (
189
        if_id_func==`FUNCTION_SLLV || if_id_func==`FUNCTION_SRLV || if_id_func==`FUNCTION_SRAV ||
190
        if_id_func==`FUNCTION_JR || if_id_func==`FUNCTION_JALR || if_id_func==`FUNCTION_MTHI ||
191
        if_id_func==`FUNCTION_MTLO || if_id_func==`FUNCTION_MULT || if_id_func==`FUNCTION_MULTU ||
192
        if_id_func==`FUNCTION_DIV || if_id_func==`FUNCTION_DIVU || if_id_func==`FUNCTION_ADD ||
193
        if_id_func==`FUNCTION_ADDU || if_id_func==`FUNCTION_SUB || if_id_func==`FUNCTION_SUBU ||
194
        if_id_func==`FUNCTION_AND || if_id_func==`FUNCTION_OR || if_id_func==`FUNCTION_XOR ||
195
        if_id_func==`FUNCTION_NOR || if_id_func==`FUNCTION_SLT || if_id_func==`FUNCTION_SLTU
196
      )
197
    ) || (
198
      if_id_op==`OPCODE_BCOND && (
199
        if_id_rt==`BCOND_BLTZ || if_id_rt==`BCOND_BGEZ || if_id_rt==`BCOND_BLTZAL || if_id_rt==`BCOND_BGEZAL
200
      )
201
   )
202
  );
203
 
204
  // True for still undecoded operations that read GPR[rt]
205
  wire if_id_reads_rt = (
206
    if_id_op==`OPCODE_BEQ || if_id_op==`OPCODE_BNE || if_id_op==`OPCODE_SB || if_id_op==`OPCODE_SH ||
207
    if_id_op==`OPCODE_SWL || if_id_op==`OPCODE_SW || if_id_op==`OPCODE_SWR || (
208
      if_id_op==`OPCODE_SPECIAL && (
209
        if_id_func==`FUNCTION_SLL || if_id_func==`FUNCTION_SRL || if_id_func==`FUNCTION_SRA ||
210
        if_id_func==`FUNCTION_SLLV || if_id_func==`FUNCTION_SRLV || if_id_func==`FUNCTION_SRAV ||
211
        if_id_func==`FUNCTION_MULT || if_id_func==`FUNCTION_MULTU || if_id_func==`FUNCTION_DIV ||
212
        if_id_func==`FUNCTION_DIVU || if_id_func==`FUNCTION_ADD || if_id_func==`FUNCTION_ADDU ||
213
        if_id_func==`FUNCTION_SUB || if_id_func==`FUNCTION_SUBU || if_id_func==`FUNCTION_AND ||
214
        if_id_func==`FUNCTION_OR || if_id_func==`FUNCTION_XOR || if_id_func==`FUNCTION_NOR ||
215
        if_id_func==`FUNCTION_SLT || if_id_func==`FUNCTION_SLTU
216
      )
217
    )
218
  );
219
 
220
  // True for still undecoded operations that read the HI register
221
  wire if_id_reads_hi = (if_id_op==`OPCODE_SPECIAL && if_id_func==`FUNCTION_MFHI);
222
 
223
  // True for still undecoded operations that read the LO register
224
  wire if_id_reads_lo = (if_id_op==`OPCODE_SPECIAL && if_id_func==`FUNCTION_MFLO);
225
 
226
  // Finally detect a RAW hazard
227
  wire raw_detected = (
228
    (if_id_reads_rs && if_id_rs!=0 &&
229
      (if_id_rs==id_ex_destreg || if_id_rs==ex_mem_destreg || if_id_rs==mem_wb_destreg)) ||
230
    (if_id_reads_rt && if_id_rt!=0 &&
231
      (if_id_rt==id_ex_destreg || if_id_rt==ex_mem_destreg || if_id_rt==mem_wb_destreg)) ||
232
    (if_id_reads_hi && (id_ex_desthi || ex_mem_desthi || mem_wb_desthi)) ||
233
    (if_id_reads_lo && (id_ex_destlo || ex_mem_destlo || mem_wb_destlo))
234
  );
235
 
236
  // Stall signals for all the stages
237
  wire if_stall, id_stall, ex_stall, mem_stall, wb_stall;
238
 
239
  // Wires connected to the ALU module instance
240
  wire[31:0] alu_a_i = id_ex_alu_a;
241
  wire[31:0] alu_b_i = id_ex_alu_b;
242
  wire[4:0] alu_func_i = id_ex_alu_func;
243
  wire alu_signed_i = id_ex_alu_signed;
244
  wire[31:0] alu_result_o;
245
  wire alu_carry_o;
246
 
247
  // Wires connected to the Multiplier module instance
248
  wire[31:0] mul_a_i = id_ex_alu_a;
249
  wire[31:0] mul_b_i = id_ex_alu_b;
250
  wire mul_signed_i = id_ex_alu_signed;
251
  wire[63:0] mul_product_o;
252
  reg mul_req_i;                            // Alternating Bit Protocol (ABP) request must be stored
253
  wire mul_ack_o;
254
  wire mul_ready = (mul_req_i==mul_ack_o);  // Convert ABP ack to true/false format
255
  wire mul_busy = !mul_ready;
256
 
257
  // Wires connected to the Divider module instance
258
  wire[31:0] div_a_i = id_ex_alu_a;
259
  wire[31:0] div_b_i = id_ex_alu_b;
260
  wire div_signed_i;
261
  wire[31:0] div_quotient_o;
262
  wire[31:0] div_remainder_o;
263
  reg div_req_i;                            // Alternating Bit Protocol (ABP) request must be stored
264
  wire div_ack_o;
265
  wire div_ready = (div_req_i==div_ack_o);  // Convert ABP ack to true/false format
266
  wire div_busy = !div_ready;
267
 
268
  /*
269
   * Module instances
270
   */
271
 
272
  alu alu_0(alu_a_i, alu_b_i, alu_func_i, alu_signed_i, alu_result_o, alu_carry_o);
273
  multiplier mul_0(sys_reset_i, sys_clock_i, mul_a_i, mul_b_i, mul_signed_i, mul_product_o, mul_req_i, mul_ack_o);
274
  divider div_0(sys_reset_i, sys_clock_i, div_a_i, div_b_i, div_signed_i, div_quotient_o, div_remainder_o, div_req_i, div_ack_o);
275
 
276
  /*
277
   * Combinational logic
278
   */
279
 
280
  assign if_stall = id_stall || imem_busy_i;
281
  assign id_stall = ex_stall || raw_detected;
282
  assign ex_stall = mem_stall || mul_busy || div_busy;
283
  assign mem_stall = wb_stall || dmem_busy_i;
284
  assign wb_stall = 0;
285
 
286
  /*
287
   * Sequential logic
288
   */
289
 
290
  always @ (posedge sys_clock_i) begin
291
    if (sys_reset_i==1) begin
292
 
293
      $display("================> Time %t <================", $time);
294
 
295
      // Initialize all the registers
296
 
297
      // GPRs initialization
298
      GPR[0] <= 0;  GPR[1] <= 0;  GPR[2] <= 0;  GPR[3] <= 0;  GPR[4] <= 0;  GPR[5] <= 0;  GPR[6] <= 0;  GPR[7] <= 0;
299
      GPR[8] <= 0;  GPR[9] <= 0;  GPR[10] <= 0; GPR[11] <= 0; GPR[12] <= 0; GPR[13] <= 0; GPR[14] <= 0; GPR[15] <= 0;
300
      GPR[16] <= 0; GPR[17] <= 0; GPR[18] <= 0; GPR[19] <= 0; GPR[20] <= 0; GPR[21] <= 0; GPR[22] <= 0; GPR[23] <= 0;
301
      GPR[24] <= 0; GPR[25] <= 0; GPR[26] <= 0; GPR[27] <= 0; GPR[28] <= 0; GPR[29] <= 0; GPR[30] <= 0; GPR[31] <= 0;
302
 
303
      // System registers
304
      PC <= `BOOT_ADDRESS;
305
      HI <= 0;
306
      LO <= 0;
307
 
308
      // System Control registers initialization
309
      SysCon[0] <= 0;  SysCon[1] <= 0;  SysCon[2] <= 0;  SysCon[3] <= 0;  SysCon[4] <= 0;  SysCon[5] <= 0;  SysCon[6] <= 0;  SysCon[7] <= 0;
310
      SysCon[8] <= 0;  SysCon[9] <= 0;  SysCon[10] <= 0; SysCon[11] <= 0; SysCon[12] <= 0; SysCon[13] <= 0; SysCon[14] <= 0; SysCon[15] <= 0;
311
      SysCon[16] <= 0; SysCon[17] <= 0; SysCon[18] <= 0; SysCon[19] <= 0; SysCon[20] <= 0; SysCon[21] <= 0; SysCon[22] <= 0; SysCon[23] <= 0;
312
      SysCon[24] <= 0; SysCon[25] <= 0; SysCon[26] <= 0; SysCon[27] <= 0; SysCon[28] <= 0; SysCon[29] <= 0; SysCon[30] <= 0; SysCon[31] <= 0;
313
 
314
      // Initialize ABP requests to instantiated modules
315
      mul_req_i <= 0;
316
      div_req_i <= 0;
317
 
318
      // Latch 1: IF/ID
319
      if_id_opcode <= `NOP;
320
      if_id_addr <= `BOOT_ADDRESS;
321
      if_id_addrnext <= 0;
322
 
323
      // Latch 2: ID/EX
324
      id_ex_opcode <= 0;
325
      id_ex_addr <= 0;
326
      id_ex_addrnext <= 0;
327
      id_ex_addrjump <= 0;
328
      id_ex_addrbranch <= 0;
329
      id_ex_alu_a <= 0;
330
      id_ex_alu_b <= 0;
331
      id_ex_alu_func <= `ALU_OP_ADD;
332
      id_ex_alu_signed <= 0;
333
      id_ex_branch <= 0;
334
      id_ex_jump <= 0;
335
      id_ex_jr <=0;
336
      id_ex_linked <= 0;
337
      id_ex_mult <= 0;
338
      id_ex_div <= 0;
339
      id_ex_load <= 0;
340
      id_ex_store <= 0;
341
      id_ex_size <= 0;
342
      id_ex_store_value <= 0;
343
      id_ex_destreg <= 0;
344
      id_ex_desthi <= 0;
345
      id_ex_destlo <= 0;
346
      id_ex_destsyscon <= 0;
347
 
348
      // Latch 3: EX/MEM
349
      ex_mem_opcode <= 0;
350
      ex_mem_addr <= 0;
351
      ex_mem_addrnext <= 0;
352
      ex_mem_addrjump <= 0;
353
      ex_mem_addrbranch <= 0;
354
      ex_mem_aluout <= 0;
355
      ex_mem_branch <= 0;
356
      ex_mem_jump <= 0;
357
      ex_mem_jr <= 0;
358
      ex_mem_linked <= 0;
359
      ex_mem_mult <= 0;
360
      ex_mem_div <= 0;
361
      ex_mem_load <= 0;
362
      ex_mem_store <= 0;
363
      ex_mem_store_value <= 0;
364
      ex_mem_store_sel <= 0;
365
      ex_mem_destreg <= 0;
366
      ex_mem_desthi <= 0;
367
      ex_mem_destlo <= 0;
368
      ex_mem_destsyscon <= 0;
369
 
370
      // Latch 4: MEM/WB
371
      mem_wb_opcode <= 0;
372
      mem_wb_addr <= 0;
373
      mem_wb_addrnext <= 0;
374
      mem_wb_value <= 0;
375
      mem_wb_destreg <= 0;
376
      mem_wb_desthi <= 0;
377
      mem_wb_destlo <= 0;
378
      mem_wb_destsyscon <= 0;
379
 
380
    end else begin
381
 
382
      $display("================> Time %t <================", $time);
383
 
384
      /*
385
       * Pipeline Stage 1: Instruction Fetch (IF)
386
       *
387
       * READ/WRITE:
388
       * - read memory
389
       * - write the IF/ID latch
390
       * - write the PC register
391
       *
392
       * DESCRIPTION:
393
       * This stage usually reads the next instruction from the PC address in memory and
394
       * then updates the PC value by incrementing it by 4.
395
       * When a hazard is detected this stage is idle.
396
       */
397
 
398
      // A RAW hazard will stall the CPU
399
      if(if_stall) begin
400
        $display("INFO: CPU(%m)-IF: Fetching stalled");
401
 
402
      // Branch taken: insert a bubble and increment PC
403
      end else if(ex_mem_branch==1 && ex_mem_aluout==1) begin
404
        $display("INFO: CPU(%m)-IF: Bubble inserted due branch taken in EX/MEM instruction @ADDR=%X w/OPCODE=%X having ALUout=%X",
405
          ex_mem_addr, ex_mem_opcode, ex_mem_aluout);
406
        if_id_opcode <= `BUBBLE;
407
        PC <= ex_mem_addrbranch;
408
 
409
      // Jump to the required immediate address
410
      end else if(id_ex_jump==1) begin
411
        $display("INFO: CPU(%m)-IF: Bubble inserted due to jump in ID/EX instruction @ADDR=%X w/OPCODE=%X", id_ex_addr, id_ex_opcode);
412
        if_id_opcode <= `BUBBLE;
413
        PC <= id_ex_addrjump;
414
 
415
      // Jump to the required address stored in GPR
416
      end else if(id_ex_jr==1) begin
417
        $display("INFO: CPU(%m)-IF: Bubble inserted due to jump register in ID/EX instruction @ADDR=%X w/OPCODE=%X", id_ex_addr, id_ex_opcode);
418
        if_id_opcode <= `BUBBLE;
419
        PC <= id_ex_addrjr;
420
 
421
      // Normal execution
422
      end else begin
423
        $display("INFO: CPU(%m)-IF: Fetched from Program Counter @ADDR=%h getting OPCODE=%X", PC, imem_data_i);
424
        if_id_opcode <= imem_data_i;
425
        if_id_addr <= PC;
426
        if_id_addrnext <= PCnext;
427
        PC <= PCnext;
428
      end
429
 
430
      /*
431
       * Pipeline Stage 2: Instruction Decode (ID)
432
       *
433
       * READ/WRITE:
434
       * - read the IF/ID latch
435
       * - read the register file
436
       * - write the ID/EX latch
437
       *
438
       * DESCRIPTION:
439
       * This stage decodes the instruction and puts the values for the ALU inputs
440
       */
441
 
442
      if(id_stall) begin
443
 
444
        // Insert a bubble in the pipeline
445
        $display("INFO: CPU(%m)-ID: Decoding stalled");
446
        id_ex_alu_a <= 0;
447
        id_ex_alu_b <= 0;
448
        id_ex_alu_func <= `ALU_OP_ADD;
449
        id_ex_alu_signed <= 0;
450
        id_ex_branch <= 0;
451
        id_ex_jump <= 0;
452
        id_ex_jr <= 0;
453
        id_ex_linked <= 0;
454
        id_ex_mult <= 0;
455
        id_ex_div <= 0;
456
        id_ex_load <= 0;
457
        id_ex_store <= 0;
458
        id_ex_size <= 0;
459
        id_ex_store_value <= 0;
460
        id_ex_destreg <= 0;
461
        id_ex_desthi <= 0;
462
        id_ex_destlo <= 0;
463
 
464
      end else begin
465
 
466
        id_ex_opcode <= if_id_opcode;
467
        id_ex_addr <= if_id_addr;
468
        id_ex_addrnext <= if_id_addrnext;
469
        id_ex_addrbranch <= if_id_addrnext + {if_id_imm_signext[29:0], 2'b00};
470
        id_ex_addrjump <= {if_id_addr[31:28], if_id_index, 2'b00};
471
        id_ex_addrjr <= GPR[if_id_rs];
472
 
473
        if(if_id_opcode==`BUBBLE) $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BUBBLE", if_id_addr, if_id_opcode);
474
        else case(if_id_op)
475
          `OPCODE_J:
476
            begin
477
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as J %h", if_id_addr, if_id_opcode, if_id_index);
478
              id_ex_alu_a <= 0;
479
              id_ex_alu_b <= 0;
480
              id_ex_alu_func <= `ALU_OP_ADD;
481
              id_ex_alu_signed <= 0;
482
              id_ex_branch <= 0;
483
              id_ex_jump <= 1;
484
              id_ex_jr <= 0;
485
              id_ex_linked <= 0;
486
              id_ex_mult <= 0;
487
              id_ex_div <= 0;
488
              id_ex_load <= 0;
489
              id_ex_store <= 0;
490
              id_ex_size <= 0;
491
              id_ex_store_value <= 0;
492
              id_ex_destreg <= 0;
493
              id_ex_desthi <= 0;
494
              id_ex_destlo <= 0;
495
              id_ex_destsyscon <= 0;
496
            end
497
          `OPCODE_JAL:
498
            begin
499
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as JAL %h", if_id_addr, if_id_opcode, if_id_index);
500
              id_ex_alu_a <= if_id_addrnext;
501
              id_ex_alu_b <= 0;
502
              id_ex_alu_func <= `ALU_OP_ADD;
503
              id_ex_alu_signed <= 0;
504
              id_ex_branch <= 0;
505
              id_ex_jump <= 1;
506
              id_ex_jr <= 0;
507
              id_ex_linked <= 1;
508
              id_ex_mult <= 0;
509
              id_ex_div <= 0;
510
              id_ex_load <= 0;
511
              id_ex_store <= 0;
512
              id_ex_size <= 0;
513
              id_ex_store_value <= 0;
514
              id_ex_destreg <= 31;
515
              id_ex_desthi <= 0;
516
              id_ex_destlo <= 0;
517
              id_ex_destsyscon <= 0;
518
            end
519
          `OPCODE_BEQ:
520
            begin
521
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BEQ r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_rt, if_id_imm_signext);
522
              id_ex_alu_a <= GPR[if_id_rs];
523
              id_ex_alu_b <= GPR[if_id_rt];
524
              id_ex_alu_func <= `ALU_OP_SEQ;
525
              id_ex_alu_signed <= 0;
526
              id_ex_branch <= 1;
527
              id_ex_jump <= 0;
528
              id_ex_jr <= 0;
529
              id_ex_linked <= 0;
530
              id_ex_mult <= 0;
531
              id_ex_div <= 0;
532
              id_ex_load <= 0;
533
              id_ex_store <= 0;
534
              id_ex_size <= 0;
535
              id_ex_store_value <= 0;
536
              id_ex_destreg <= 0;
537
              id_ex_desthi <= 0;
538
              id_ex_destlo <= 0;
539
              id_ex_destsyscon <= 0;
540
            end
541
          `OPCODE_BNE:
542
            begin
543
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BNE r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_rt, if_id_imm_signext);
544
              id_ex_alu_a <= GPR[if_id_rs];
545
              id_ex_alu_b <= GPR[if_id_rt];
546
              id_ex_alu_func <= `ALU_OP_SNE;
547
              id_ex_alu_signed <= 0;
548
              id_ex_branch <= 1;
549
              id_ex_jump <= 0;
550
              id_ex_jr <= 0;
551
              id_ex_linked <= 0;
552
              id_ex_mult <= 0;
553
              id_ex_div <= 0;
554
              id_ex_load <= 0;
555
              id_ex_store <= 0;
556
              id_ex_size <= 0;
557
              id_ex_store_value <= 0;
558
              id_ex_destreg <= 0;
559
              id_ex_desthi <= 0;
560
              id_ex_destlo <= 0;
561
              id_ex_destsyscon <= 0;
562
            end
563
          `OPCODE_BLEZ:
564
            begin
565
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BLEZ r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_imm_signext);
566
              id_ex_alu_a <= GPR[if_id_rs];
567
              id_ex_alu_b <= 0;
568
              id_ex_alu_func <= `ALU_OP_SLE;
569
              id_ex_alu_signed <= 0;
570
              id_ex_branch <= 1;
571
              id_ex_jump <= 0;
572
              id_ex_jr <= 0;
573
              id_ex_linked <= 0;
574
              id_ex_mult <= 0;
575
              id_ex_div <= 0;
576
              id_ex_load <= 0;
577
              id_ex_store <= 0;
578
              id_ex_size <= 0;
579
              id_ex_store_value <= 0;
580
              id_ex_destreg <= 0;
581
              id_ex_desthi <= 0;
582
              id_ex_destlo <= 0;
583
              id_ex_destsyscon <= 0;
584
            end
585
          `OPCODE_BGTZ:
586
            begin
587
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BGTZ r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_imm_signext);
588
              id_ex_alu_a <= GPR[if_id_rs];
589
              id_ex_alu_b <= 0;
590
              id_ex_alu_func <= `ALU_OP_SGT;
591
              id_ex_alu_signed <= 0;
592
              id_ex_branch <= 1;
593
              id_ex_jump <= 0;
594
              id_ex_jr <= 0;
595
              id_ex_linked <= 0;
596
              id_ex_mult <= 0;
597
              id_ex_div <= 0;
598
              id_ex_load <= 0;
599
              id_ex_store <= 0;
600
              id_ex_size <= 0;
601
              id_ex_store_value <= 0;
602
              id_ex_destreg <= 0;
603
              id_ex_desthi <= 0;
604
              id_ex_destlo <= 0;
605
              id_ex_destsyscon <= 0;
606
            end
607
          `OPCODE_ADDI:
608
            begin
609
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as ADDI r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_signext);
610
              id_ex_alu_a <= GPR[if_id_rs];
611
              id_ex_alu_b <= if_id_imm_signext;
612
              id_ex_alu_func <= `ALU_OP_ADD;
613
              id_ex_alu_signed <= 1;
614
              id_ex_branch <= 0;
615
              id_ex_jump <= 0;
616
              id_ex_jr <= 0;
617
              id_ex_linked <= 0;
618
              id_ex_mult <= 0;
619
              id_ex_div <= 0;
620
              id_ex_load <= 0;
621
              id_ex_store <= 0;
622
              id_ex_size <= 0;
623
              id_ex_store_value <= 0;
624
              id_ex_destreg <= if_id_rt;
625
              id_ex_desthi <= 0;
626
              id_ex_destlo <= 0;
627
              id_ex_destsyscon <= 0;
628
            end
629
          `OPCODE_ADDIU:
630
            begin
631
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as ADDIU r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_signext);
632
              id_ex_alu_a <= GPR[if_id_rs];
633
              id_ex_alu_b <= if_id_imm_signext;
634
              id_ex_alu_func <= `ALU_OP_ADD;
635
              id_ex_alu_signed <= 0;
636
              id_ex_branch <= 0;
637
              id_ex_jump <= 0;
638
              id_ex_jr <= 0;
639
              id_ex_linked <= 0;
640
              id_ex_mult <= 0;
641
              id_ex_div <= 0;
642
              id_ex_load <= 0;
643
              id_ex_store <= 0;
644
              id_ex_size <= 0;
645
              id_ex_store_value <= 0;
646
              id_ex_destreg <= if_id_rt;
647
              id_ex_desthi <= 0;
648
              id_ex_destlo <= 0;
649
              id_ex_destsyscon <= 0;
650
            end
651
          `OPCODE_SLTI:
652
            begin
653
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SLTI r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_signext);
654
              id_ex_alu_a <= GPR[if_id_rs];
655
              id_ex_alu_b <= if_id_imm_signext;
656
              id_ex_alu_func <= `ALU_OP_SLT;
657
              id_ex_alu_signed <= 1;
658
              id_ex_branch <= 0;
659
              id_ex_jump <= 0;
660
              id_ex_jr <= 0;
661
              id_ex_linked <= 0;
662
              id_ex_mult <= 0;
663
              id_ex_div <= 0;
664
              id_ex_load <= 0;
665
              id_ex_store <= 0;
666
              id_ex_size <= 0;
667
              id_ex_store_value <= 0;
668
              id_ex_destreg <= if_id_rt;
669
              id_ex_desthi <= 0;
670
              id_ex_destlo <= 0;
671
              id_ex_destsyscon <= 0;
672
            end
673
          `OPCODE_SLTIU:
674
            begin
675
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SLTIU r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_signext);
676
              id_ex_alu_a <= GPR[if_id_rs];
677
              id_ex_alu_b <= if_id_imm_signext;
678
              id_ex_alu_func <= `ALU_OP_SLT;
679
              id_ex_alu_signed <= 0;
680
              id_ex_branch <= 0;
681
              id_ex_jump <= 0;
682
              id_ex_jr <= 0;
683
              id_ex_linked <= 0;
684
              id_ex_mult <= 0;
685
              id_ex_div <= 0;
686
              id_ex_load <= 0;
687
              id_ex_store <= 0;
688
              id_ex_size <= 0;
689
              id_ex_store_value <= 0;
690
              id_ex_destreg <= if_id_rt;
691
              id_ex_desthi <= 0;
692
              id_ex_destlo <= 0;
693
              id_ex_destsyscon <= 0;
694
            end
695
          `OPCODE_ANDI:
696
            begin
697
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as ANDI r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_zeroext);
698
              id_ex_alu_a <= GPR[if_id_rs];
699
              id_ex_alu_b <= if_id_imm_zeroext;
700
              id_ex_alu_func <= `ALU_OP_AND;
701
              id_ex_alu_signed <= 0;
702
              id_ex_branch <= 0;
703
              id_ex_jump <= 0;
704
              id_ex_jr <= 0;
705
              id_ex_linked <= 0;
706
              id_ex_mult <= 0;
707
              id_ex_div <= 0;
708
              id_ex_load <= 0;
709
              id_ex_store <= 0;
710
              id_ex_size <= 0;
711
              id_ex_store_value <= 0;
712
              id_ex_destreg <= if_id_rt;
713
              id_ex_desthi <= 0;
714
              id_ex_destlo <= 0;
715
              id_ex_destsyscon <= 0;
716
            end
717
          `OPCODE_ORI:
718
            begin
719
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as ORI r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_zeroext);
720
              id_ex_alu_a <= GPR[if_id_rs];
721
              id_ex_alu_b <= if_id_imm_zeroext;
722
              id_ex_alu_func <= `ALU_OP_OR;
723
              id_ex_alu_signed <= 0;
724
              id_ex_branch <= 0;
725
              id_ex_jump <= 0;
726
              id_ex_jr <= 0;
727
              id_ex_linked <= 0;
728
              id_ex_mult <= 0;
729
              id_ex_div <= 0;
730
              id_ex_load <= 0;
731
              id_ex_store <= 0;
732
              id_ex_size <= 0;
733
              id_ex_store_value <= 0;
734
              id_ex_destreg <= if_id_rt;
735
              id_ex_desthi <= 0;
736
              id_ex_destlo <= 0;
737
              id_ex_destsyscon <= 0;
738
            end
739
          `OPCODE_XORI:
740
            begin
741
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as XORI r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_rs, if_id_imm_zeroext);
742
              id_ex_alu_a <= GPR[if_id_rs];
743
              id_ex_alu_b <= if_id_imm_zeroext;
744
              id_ex_alu_func <= `ALU_OP_XOR;
745
              id_ex_alu_signed <= 0;
746
              id_ex_branch <= 0;
747
              id_ex_jump <= 0;
748
              id_ex_jr <= 0;
749
              id_ex_linked <= 0;
750
              id_ex_mult <= 0;
751
              id_ex_div <= 0;
752
              id_ex_load <= 0;
753
              id_ex_store <= 0;
754
              id_ex_size <= 0;
755
              id_ex_store_value <= 0;
756
              id_ex_destreg <= if_id_rt;
757
              id_ex_desthi <= 0;
758
              id_ex_destlo <= 0;
759
              id_ex_destsyscon <= 0;
760
            end
761
          `OPCODE_LUI:
762
            begin
763
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LUI r%d, %h", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_zeroext);
764
              id_ex_alu_a <= if_id_imm_zeroext;
765
              id_ex_alu_b <= 16;
766
              id_ex_alu_func <= `ALU_OP_SLL;
767
              id_ex_alu_signed <= 0;
768
              id_ex_branch <= 0;
769
              id_ex_jump <= 0;
770
              id_ex_jr <= 0;
771
              id_ex_linked <= 0;
772
              id_ex_mult <= 0;
773
              id_ex_div <= 0;
774
              id_ex_load <= 0;
775
              id_ex_store <= 0;
776
              id_ex_size <= 0;
777
              id_ex_store_value <= 0;
778
              id_ex_destreg <= if_id_rt;
779
              id_ex_desthi <= 0;
780
              id_ex_destlo <= 0;
781
              id_ex_destsyscon <= 0;
782
            end
783
          `OPCODE_COP0:
784
            begin
785
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as COP0", if_id_addr, if_id_opcode);
786
            end
787
          `OPCODE_COP1:
788
            begin
789
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as COP1", if_id_addr, if_id_opcode);
790
            end
791
          `OPCODE_COP2:
792
            begin
793
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as COP2", if_id_addr, if_id_opcode);
794
            end
795
          `OPCODE_COP3:
796
            begin
797
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as COP3", if_id_addr, if_id_opcode);
798
            end
799
          `OPCODE_LB:
800
            begin
801
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LB r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
802
              id_ex_alu_a <= GPR[if_id_rs];
803
              id_ex_alu_b <= if_id_imm_signext;
804
              id_ex_alu_func <= `ALU_OP_ADD;
805
              id_ex_alu_signed <= 1;
806
              id_ex_branch <= 0;
807
              id_ex_jump <= 0;
808
              id_ex_jr <= 0;
809
              id_ex_linked <= 0;
810
              id_ex_mult <= 0;
811
              id_ex_div <= 0;
812
              id_ex_load <= 1;
813
              id_ex_store <= 0;
814
              id_ex_size <= `SIZE_BYTE;
815
              id_ex_store_value <= 0;
816
              id_ex_destreg <= if_id_rt;
817
              id_ex_desthi <= 0;
818
              id_ex_destlo <= 0;
819
              id_ex_destsyscon <= 0;
820
            end
821
          `OPCODE_LH:
822
            begin
823
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LH r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
824
              id_ex_alu_a <= GPR[if_id_rs];
825
              id_ex_alu_b <= if_id_imm_signext;
826
              id_ex_alu_func <= `ALU_OP_ADD;
827
              id_ex_alu_signed <= 1;
828
              id_ex_branch <= 0;
829
              id_ex_jump <= 0;
830
              id_ex_jr <= 0;
831
              id_ex_linked <= 0;
832
              id_ex_mult <= 0;
833
              id_ex_div <= 0;
834
              id_ex_load <= 1;
835
              id_ex_store <= 0;
836
              id_ex_size <= `SIZE_HALF;
837
              id_ex_store_value <= 0;
838
              id_ex_destreg <= if_id_rt;
839
              id_ex_desthi <= 0;
840
              id_ex_destlo <= 0;
841
              id_ex_destsyscon <= 0;
842
            end
843
          `OPCODE_LWL:
844
            begin
845
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LWL r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
846
              id_ex_alu_a <= GPR[if_id_rs];
847
              id_ex_alu_b <= if_id_imm_signext;
848
              id_ex_alu_func <= `ALU_OP_ADD;
849
              id_ex_alu_signed <= 1;
850
              id_ex_branch <= 0;
851
              id_ex_jump <= 0;
852
              id_ex_jr <= 0;
853
              id_ex_linked <= 0;
854
              id_ex_mult <= 0;
855
              id_ex_div <= 0;
856
              id_ex_load <= 1;
857
              id_ex_store <= 0;
858
              id_ex_size <= `SIZE_LEFT;
859
              id_ex_store_value <= 0;
860
              id_ex_destreg <= if_id_rt;
861
              id_ex_desthi <= 0;
862
              id_ex_destlo <= 0;
863
              id_ex_destsyscon <= 0;
864
            end
865
          `OPCODE_LW:
866
            begin
867
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LW r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
868
              id_ex_alu_a <= GPR[if_id_rs];
869
              id_ex_alu_b <= if_id_imm_signext;
870
              id_ex_alu_func <= `ALU_OP_ADD;
871
              id_ex_alu_signed <= 1;
872
              id_ex_branch <= 0;
873
              id_ex_jump <= 0;
874
              id_ex_jr <= 0;
875
              id_ex_linked <= 0;
876
              id_ex_mult <= 0;
877
              id_ex_div <= 0;
878
              id_ex_load <= 1;
879
              id_ex_store <= 0;
880
              id_ex_size <= `SIZE_WORD;
881
              id_ex_store_value <= 0;
882
              id_ex_destreg <= if_id_rt;
883
              id_ex_desthi <= 0;
884
              id_ex_destlo <= 0;
885
              id_ex_destsyscon <= 0;
886
            end
887
          `OPCODE_LBU:
888
            begin
889
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LBU r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
890
              id_ex_alu_a <= GPR[if_id_rs];
891
              id_ex_alu_b <= if_id_imm_signext;
892
              id_ex_alu_func <= `ALU_OP_ADD;
893
              id_ex_alu_signed <= 0;
894
              id_ex_branch <= 0;
895
              id_ex_jump <= 0;
896
              id_ex_jr <= 0;
897
              id_ex_linked <= 0;
898
              id_ex_mult <= 0;
899
              id_ex_div <= 0;
900
              id_ex_load <= 1;
901
              id_ex_store <= 0;
902
              id_ex_size <= `SIZE_BYTE;
903
              id_ex_store_value <= 0;
904
              id_ex_destreg <= if_id_rt;
905
              id_ex_desthi <= 0;
906
              id_ex_destlo <= 0;
907
              id_ex_destsyscon <= 0;
908
            end
909
          `OPCODE_LHU:
910
            begin
911
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LHU r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
912
              id_ex_alu_a <= GPR[if_id_rs];
913
              id_ex_alu_b <= if_id_imm_signext;
914
              id_ex_alu_func <= `ALU_OP_ADD;
915
              id_ex_alu_signed <= 0;
916
              id_ex_branch <= 0;
917
              id_ex_jump <= 0;
918
              id_ex_jr <= 0;
919
              id_ex_linked <= 0;
920
              id_ex_mult <= 0;
921
              id_ex_div <= 0;
922
              id_ex_load <= 1;
923
              id_ex_store <= 0;
924
              id_ex_size <= `SIZE_HALF;
925
              id_ex_store_value <= 0;
926
              id_ex_destreg <= if_id_rt;
927
              id_ex_desthi <= 0;
928
              id_ex_destlo <= 0;
929
              id_ex_destsyscon <= 0;
930
            end
931
          `OPCODE_LWR:
932
            begin
933
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LWR r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
934
              id_ex_alu_a <= GPR[if_id_rs];
935
              id_ex_alu_b <= if_id_imm_signext;
936
              id_ex_alu_func <= `ALU_OP_ADD;
937
              id_ex_alu_signed <= 1;
938
              id_ex_branch <= 0;
939
              id_ex_jump <= 0;
940
              id_ex_jr <= 0;
941
              id_ex_linked <= 0;
942
              id_ex_mult <= 0;
943
              id_ex_div <= 0;
944
              id_ex_load <= 1;
945
              id_ex_store <= 0;
946
              id_ex_size <= `SIZE_RIGHT;
947
              id_ex_store_value <= 0;
948
              id_ex_destreg <= if_id_rt;
949
              id_ex_desthi <= 0;
950
              id_ex_destlo <= 0;
951
              id_ex_destsyscon <= 0;
952
            end
953
          `OPCODE_SB:
954
            begin
955
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SB r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
956
              id_ex_alu_a <= GPR[if_id_rs];
957
              id_ex_alu_b <= if_id_imm_signext;
958
              id_ex_alu_func <= `ALU_OP_ADD;
959
              id_ex_alu_signed <= 1;
960
              id_ex_branch <= 0;
961
              id_ex_jump <= 0;
962
              id_ex_jr <= 0;
963
              id_ex_linked <= 0;
964
              id_ex_mult <= 0;
965
              id_ex_div <= 0;
966
              id_ex_load <= 0;
967
              id_ex_store <= 1;
968
              id_ex_size <= `SIZE_BYTE;
969
              id_ex_store_value <= GPR[if_id_rt];
970
              id_ex_destreg <= 0;
971
              id_ex_desthi <= 0;
972
              id_ex_destlo <= 0;
973
              id_ex_destsyscon <= 0;
974
            end
975
          `OPCODE_SH:
976
            begin
977
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SH r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
978
              id_ex_alu_a <= GPR[if_id_rs];
979
              id_ex_alu_b <= if_id_imm_signext;
980
              id_ex_alu_func <= `ALU_OP_ADD;
981
              id_ex_alu_signed <= 1;
982
              id_ex_branch <= 0;
983
              id_ex_jump <= 0;
984
              id_ex_jr <= 0;
985
              id_ex_linked <= 0;
986
              id_ex_mult <= 0;
987
              id_ex_div <= 0;
988
              id_ex_load <= 0;
989
              id_ex_store <= 1;
990
              id_ex_size <= `SIZE_HALF;
991
              id_ex_store_value <= GPR[if_id_rt];
992
              id_ex_destreg <= 0;
993
              id_ex_desthi <= 0;
994
              id_ex_destlo <= 0;
995
              id_ex_destsyscon <= 0;
996
             end
997
          `OPCODE_SWL:
998
            begin
999
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SWL r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
1000
              id_ex_alu_a <= GPR[if_id_rs];
1001
              id_ex_alu_b <= if_id_imm_signext;
1002
              id_ex_alu_func <= `ALU_OP_ADD;
1003
              id_ex_alu_signed <= 1;
1004
              id_ex_branch <= 0;
1005
              id_ex_jump <= 0;
1006
              id_ex_jr <= 0;
1007
              id_ex_linked <= 0;
1008
              id_ex_mult <= 0;
1009
              id_ex_div <= 0;
1010
              id_ex_load <= 0;
1011
              id_ex_store <= 1;
1012
              id_ex_size <= `SIZE_LEFT;
1013
              id_ex_store_value <= GPR[if_id_rt];
1014
              id_ex_destreg <= 0;
1015
              id_ex_desthi <= 0;
1016
              id_ex_destlo <= 0;
1017
              id_ex_destsyscon <= 0;
1018
            end
1019
          `OPCODE_SW:
1020
            begin
1021
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SW r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
1022
              id_ex_alu_a <= GPR[if_id_rs];
1023
              id_ex_alu_b <= if_id_imm_signext;
1024
              id_ex_alu_func <= `ALU_OP_ADD;
1025
              id_ex_alu_signed <= 1;
1026
              id_ex_branch <= 0;
1027
              id_ex_jump <= 0;
1028
              id_ex_jr <= 0;
1029
              id_ex_linked <= 0;
1030
              id_ex_mult <= 0;
1031
              id_ex_div <= 0;
1032
              id_ex_load <= 0;
1033
              id_ex_store <= 1;
1034
              id_ex_size <= `SIZE_WORD;
1035
              id_ex_store_value <= GPR[if_id_rt];
1036
              id_ex_destreg <= 0;
1037
              id_ex_desthi <= 0;
1038
              id_ex_destlo <= 0;
1039
              id_ex_destsyscon <= 0;
1040
            end
1041
          `OPCODE_SWR:
1042
            begin
1043
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SWR r%d, %d(r%d)", if_id_addr, if_id_opcode, if_id_rt, if_id_imm_signext, if_id_rs);
1044
              id_ex_alu_a <= GPR[if_id_rs];
1045
              id_ex_alu_b <= if_id_imm_signext;
1046
              id_ex_alu_func <= `ALU_OP_ADD;
1047
              id_ex_alu_signed <= 1;
1048
              id_ex_branch <= 0;
1049
              id_ex_jump <= 0;
1050
              id_ex_jr <= 0;
1051
              id_ex_linked <= 0;
1052
              id_ex_mult <= 0;
1053
              id_ex_div <= 0;
1054
              id_ex_load <= 0;
1055
              id_ex_store <= 1;
1056
              id_ex_size <= `SIZE_RIGHT;
1057
              id_ex_store_value <= GPR[if_id_rt];
1058
              id_ex_destreg <= 0;
1059
              id_ex_desthi <= 0;
1060
              id_ex_destlo <= 0;
1061
              id_ex_destsyscon <= 0;
1062
            end
1063
          `OPCODE_LWC1:
1064
            begin
1065
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LWC1", if_id_addr, if_id_opcode);
1066
           end
1067
          `OPCODE_LWC2:
1068
            begin
1069
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LWC2", if_id_addr, if_id_opcode);
1070
            end
1071
          `OPCODE_LWC3:
1072
            begin
1073
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as LWC3", if_id_addr, if_id_opcode);
1074
            end
1075
          `OPCODE_SWC1:
1076
            begin
1077
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SWC1", if_id_addr, if_id_opcode);
1078
            end
1079
          `OPCODE_SWC2:
1080
            begin
1081
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SWC2", if_id_addr, if_id_opcode);
1082
            end
1083
          `OPCODE_SWC3:
1084
            begin
1085
              $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SWC3", if_id_addr, if_id_opcode);
1086
            end
1087
          `OPCODE_SPECIAL:
1088
            case(if_id_func)
1089
              `FUNCTION_SLL:
1090
                begin
1091
                  if(if_id_opcode==`NOP) $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as NOP", if_id_addr, if_id_opcode);
1092
                  else $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SLL r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rd, if_id_rt, if_id_shamt);
1093
                  id_ex_alu_a <= GPR[if_id_rt];
1094
                  id_ex_alu_b <= if_id_shamt;
1095
                  id_ex_alu_func <= `ALU_OP_SLL;
1096
                  id_ex_alu_signed <= 0;
1097
                  id_ex_branch <= 0;
1098
                  id_ex_jump <= 0;
1099
                  id_ex_jr <= 0;
1100
                  id_ex_linked <= 0;
1101
                  id_ex_mult <= 0;
1102
                  id_ex_div <= 0;
1103
                  id_ex_load <= 0;
1104
                  id_ex_store <= 0;
1105
                  id_ex_size <= 0;
1106
                  id_ex_store_value <= 0;
1107
                  id_ex_destreg <= if_id_rd;
1108
                  id_ex_desthi <= 0;
1109
                  id_ex_destlo <= 0;
1110
                  id_ex_destsyscon <= 0;
1111
                end
1112
              `FUNCTION_SRL:
1113
                begin
1114
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SRL r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rd, if_id_rt, if_id_shamt);
1115
                  id_ex_alu_a <= GPR[if_id_rt];
1116
                  id_ex_alu_b <= if_id_shamt;
1117
                  id_ex_alu_func <= `ALU_OP_SRL;
1118
                  id_ex_alu_signed <= 0;
1119
                  id_ex_branch <= 0;
1120
                  id_ex_jump <= 0;
1121
                  id_ex_jr <= 0;
1122
                  id_ex_linked <= 0;
1123
                  id_ex_mult <= 0;
1124
                  id_ex_div <= 0;
1125
                  id_ex_load <= 0;
1126
                  id_ex_store <= 0;
1127
                  id_ex_size <= 0;
1128
                  id_ex_store_value <= 0;
1129
                  id_ex_destreg <= if_id_rd;
1130
                  id_ex_desthi <= 0;
1131
                  id_ex_destlo <= 0;
1132
                  id_ex_destsyscon <= 0;
1133
                end
1134
              `FUNCTION_SRA:
1135
                begin
1136
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SRA r%d, r%d, %h", if_id_addr, if_id_opcode, if_id_rd, if_id_rt, if_id_shamt);
1137
                  id_ex_alu_a <= GPR[if_id_rt];
1138
                  id_ex_alu_b <= if_id_shamt;
1139
                  id_ex_alu_func <= `ALU_OP_SRA;
1140
                  id_ex_alu_signed <= 1;                 // does nothing??
1141
                  id_ex_branch <= 0;
1142
                  id_ex_jump <= 0;
1143
                  id_ex_jr <= 0;
1144
                  id_ex_linked <= 0;
1145
                  id_ex_mult <= 0;
1146
                  id_ex_div <= 0;
1147
                  id_ex_load <= 0;
1148
                  id_ex_store <= 0;
1149
                  id_ex_size <= 0;
1150
                  id_ex_store_value <= 0;
1151
                  id_ex_destreg <= if_id_rd;
1152
                  id_ex_desthi <= 0;
1153
                  id_ex_destlo <= 0;
1154
                  id_ex_destsyscon <= 0;
1155
                end
1156
              `FUNCTION_SLLV:
1157
                begin
1158
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SLLV r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rt, if_id_rs);
1159
                  id_ex_alu_a <= GPR[if_id_rt];
1160
                  id_ex_alu_b <= GPR[if_id_rs];
1161
                  id_ex_alu_func <= `ALU_OP_SLL;
1162
                  id_ex_alu_signed <= 0;
1163
                  id_ex_branch <= 0;
1164
                  id_ex_jump <= 0;
1165
                  id_ex_jr <= 0;
1166
                  id_ex_linked <= 0;
1167
                  id_ex_mult <= 0;
1168
                  id_ex_div <= 0;
1169
                  id_ex_load <= 0;
1170
                  id_ex_store <= 0;
1171
                  id_ex_size <= 0;
1172
                  id_ex_store_value <= 0;
1173
                  id_ex_destreg <= if_id_rd;
1174
                  id_ex_desthi <= 0;
1175
                  id_ex_destlo <= 0;
1176
                  id_ex_destsyscon <= 0;
1177
                end
1178
              `FUNCTION_SRLV:
1179
                begin
1180
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SRLV r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rt, if_id_rs);
1181
                  id_ex_alu_a <= GPR[if_id_rt];
1182
                  id_ex_alu_b <= GPR[if_id_rs];
1183
                  id_ex_alu_func <= `ALU_OP_SRL;
1184
                  id_ex_alu_signed <= 0;
1185
                  id_ex_branch <= 0;
1186
                  id_ex_jump <= 0;
1187
                  id_ex_jr <= 0;
1188
                  id_ex_linked <= 0;
1189
                  id_ex_mult <= 0;
1190
                  id_ex_div <= 0;
1191
                  id_ex_load <= 0;
1192
                  id_ex_store <= 0;
1193
                  id_ex_size <= 0;
1194
                  id_ex_store_value <= 0;
1195
                  id_ex_destreg <= if_id_rd;
1196
                  id_ex_desthi <= 0;
1197
                  id_ex_destlo <= 0;
1198
                  id_ex_destsyscon <= 0;
1199
                end
1200
              `FUNCTION_SRAV:
1201
                begin
1202
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SRAV r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rt, if_id_rs);
1203
                  id_ex_alu_a <= GPR[if_id_rt];
1204
                  id_ex_alu_b <= GPR[if_id_rs];
1205
                  id_ex_alu_func <= `ALU_OP_SRA;
1206
                  id_ex_alu_signed <= 1;
1207
                  id_ex_branch <= 0;
1208
                  id_ex_jump <= 0;
1209
                  id_ex_jr <= 0;
1210
                  id_ex_linked <= 0;
1211
                  id_ex_mult <= 0;
1212
                  id_ex_div <= 0;
1213
                  id_ex_load <= 0;
1214
                  id_ex_store <= 0;
1215
                  id_ex_size <= 0;
1216
                  id_ex_store_value <= 0;
1217
                  id_ex_destreg <= if_id_rd;
1218
                  id_ex_desthi <= 0;
1219
                  id_ex_destlo <= 0;
1220
                  id_ex_destsyscon <= 0;
1221
                end
1222
              `FUNCTION_JR:
1223
                begin
1224
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as JR r%d", if_id_addr, if_id_opcode, if_id_rs);
1225
                  id_ex_alu_a <= 0;
1226
                  id_ex_alu_b <= 0;
1227
                  id_ex_alu_func <= `ALU_OP_ADD;
1228
                  id_ex_alu_signed <= 0;
1229
                  id_ex_branch <= 0;
1230
                  id_ex_jump <= 0;
1231
                  id_ex_jr <= 1;
1232
                  id_ex_linked <= 0;
1233
                  id_ex_mult <= 0;
1234
                  id_ex_div <= 0;
1235
                  id_ex_load <= 0;
1236
                  id_ex_store <= 0;
1237
                  id_ex_size <= 0;
1238
                  id_ex_store_value <= 0;
1239
                  id_ex_destreg <= 0;
1240
                  id_ex_desthi <= 0;
1241
                  id_ex_destlo <= 0;
1242
                  id_ex_destsyscon <= 0;
1243
                end
1244
              `FUNCTION_JALR:
1245
                begin
1246
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as JALR [r%d,] r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs);
1247
                  id_ex_alu_a <= if_id_addrnext;
1248
                  id_ex_alu_b <= 0;
1249
                  id_ex_alu_func <= `ALU_OP_ADD;
1250
                  id_ex_alu_signed <= 0;
1251
                  id_ex_branch <= 0;
1252
                  id_ex_jump <= 0;
1253
                  id_ex_jr <= 1;
1254
                  id_ex_linked <= 1;
1255
                  id_ex_mult <= 0;
1256
                  id_ex_div <= 0;
1257
                  id_ex_load <= 0;
1258
                  id_ex_store <= 0;
1259
                  id_ex_size <= 0;
1260
                  id_ex_store_value <= 0;
1261
                  id_ex_destreg <= if_id_rd;
1262
                  id_ex_desthi <= 0;
1263
                  id_ex_destlo <= 0;
1264
                  id_ex_destsyscon <= 0;
1265
                end
1266
              `FUNCTION_SYSCALL:
1267
                begin
1268
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SYSCALL", if_id_addr, if_id_opcode);
1269
//                  id_ex_alu_a <= 0;
1270
//                  id_ex_alu_b <= 0;
1271
//                  id_ex_alu_func <= `ALU_OP_ADD;
1272
//                  id_ex_alu_signed <= 0;
1273
//                  id_ex_branch <= 0;
1274
//                  id_ex_jump <= 0;
1275
//                  id_ex_jr <= 0;
1276
//                  id_ex_linked <= 0;
1277
//                  id_ex_mult <= 0;
1278
//                  id_ex_div <= 0;
1279
//                  id_ex_load <= 0;
1280
//                  id_ex_store <= 0;
1281
//                  id_ex_size <= 0;
1282
//                  id_ex_store_value <= 0;
1283
//                  id_ex_destreg <= 0;
1284
//                  id_ex_desthi <= 0;
1285
//                  id_ex_destlo <= 0;
1286
//                  id_ex_destsyscon <= 0;
1287
                end
1288
              `FUNCTION_BREAK:
1289
                begin
1290
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BREAK", if_id_addr, if_id_opcode);
1291
//                  id_ex_alu_a <= 0;
1292
//                  id_ex_alu_b <= 0;
1293
//                  id_ex_alu_func <= `ALU_OP_ADD;
1294
//                  id_ex_alu_signed <= 0;
1295
//                  id_ex_branch <= 0;
1296
//                  id_ex_jump <= 0;
1297
//                  id_ex_jr <= 0;
1298
//                  id_ex_linked <= 0;
1299
//                  id_ex_mult <= 0;
1300
//                  id_ex_div <= 0;
1301
//                  id_ex_load <= 0;
1302
//                  id_ex_store <= 0;
1303
//                  id_ex_size <= 0;
1304
//                  id_ex_store_value <= 0;
1305
//                  id_ex_destreg <= 0;
1306
//                  id_ex_desthi <= 0;
1307
//                  id_ex_destlo <= 0;
1308
//                  id_ex_destsyscon <= 0;
1309
                end
1310
              `FUNCTION_MFHI:
1311
                begin
1312
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as MFHI r%d", if_id_addr, if_id_opcode, if_id_rd);
1313
                  id_ex_alu_a <= HI;
1314
                  id_ex_alu_b <= 0;
1315
                  id_ex_alu_func <= `ALU_OP_ADD;
1316
                  id_ex_alu_signed <= 0;
1317
                  id_ex_branch <= 0;
1318
                  id_ex_jump <= 0;
1319
                  id_ex_jr <= 0;
1320
                  id_ex_linked <= 0;
1321
                  id_ex_mult <= 0;
1322
                  id_ex_div <= 0;
1323
                  id_ex_load <= 0;
1324
                  id_ex_store <= 0;
1325
                  id_ex_size <= 0;
1326
                  id_ex_store_value <= 0;
1327
                  id_ex_destreg <= if_id_rd;
1328
                  id_ex_desthi <= 0;
1329
                  id_ex_destlo <= 0;
1330
                  id_ex_destsyscon <= 0;
1331
                end
1332
              `FUNCTION_MTHI:
1333
                begin
1334
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as MTHI r%d", if_id_addr, if_id_opcode, if_id_rs);
1335
                  id_ex_alu_a <= GPR[if_id_rs];
1336
                  id_ex_alu_b <= 0;
1337
                  id_ex_alu_func <= `ALU_OP_ADD;
1338
                  id_ex_alu_signed <= 0;
1339
                  id_ex_branch <= 0;
1340
                  id_ex_jump <= 0;
1341
                  id_ex_jr <= 0;
1342
                  id_ex_linked <= 0;
1343
                  id_ex_mult <= 0;
1344
                  id_ex_div <= 0;
1345
                  id_ex_load <= 0;
1346
                  id_ex_store <= 0;
1347
                  id_ex_size <= 0;
1348
                  id_ex_store_value <= 0;
1349
                  id_ex_destreg <= 0;
1350
                  id_ex_desthi <= 1;
1351
                  id_ex_destlo <= 0;
1352
                  id_ex_destsyscon <= 0;
1353
                end
1354
              `FUNCTION_MFLO:
1355
                begin
1356
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as MFLO r%d", if_id_addr, if_id_opcode, if_id_rd);
1357
                  id_ex_alu_a <= LO;
1358
                  id_ex_alu_b <= 0;
1359
                  id_ex_alu_func <= `ALU_OP_ADD;
1360
                  id_ex_alu_signed <= 0;
1361
                  id_ex_branch <= 0;
1362
                  id_ex_jump <= 0;
1363
                  id_ex_jr <= 0;
1364
                  id_ex_linked <= 0;
1365
                  id_ex_mult <= 0;
1366
                  id_ex_div <= 0;
1367
                  id_ex_load <= 0;
1368
                  id_ex_store <= 0;
1369
                  id_ex_size <= 0;
1370
                  id_ex_store_value <= 0;
1371
                  id_ex_destreg <= if_id_rd;
1372
                  id_ex_desthi <= 0;
1373
                  id_ex_destlo <= 0;
1374
                  id_ex_destsyscon <= 0;
1375
                end
1376
              `FUNCTION_MTLO:
1377
                begin
1378
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as MTLO r%d", if_id_addr, if_id_opcode, if_id_rs);
1379
                  id_ex_alu_a <= GPR[if_id_rs];
1380
                  id_ex_alu_b <= 0;
1381
                  id_ex_alu_func <= `ALU_OP_ADD;
1382
                  id_ex_alu_signed <= 0;
1383
                  id_ex_branch <= 0;
1384
                  id_ex_jump <= 0;
1385
                  id_ex_linked <= 0;
1386
                  id_ex_mult <= 0;
1387
                  id_ex_div <= 0;
1388
                  id_ex_load <= 0;
1389
                  id_ex_store <= 0;
1390
                  id_ex_size <= 0;
1391
                  id_ex_store_value <= 0;
1392
                  id_ex_destreg <= 0;
1393
                  id_ex_desthi <= 0;
1394
                  id_ex_destlo <= 1;
1395
                  id_ex_destsyscon <= 0;
1396
                end
1397
              `FUNCTION_MULT:
1398
                begin
1399
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as MULT r%d, r%d", if_id_addr, if_id_opcode, if_id_rs, if_id_rt);
1400
                  id_ex_alu_a <= GPR[if_id_rs];
1401
                  id_ex_alu_b <= GPR[if_id_rt];
1402
                  id_ex_alu_func <= `ALU_OP_MULT;
1403
                  id_ex_alu_signed <= 1;
1404
                  id_ex_branch <= 0;
1405
                  id_ex_jump <= 0;
1406
                  id_ex_jr <= 0;
1407
                  id_ex_linked <= 0;
1408
                  id_ex_mult <= 1;
1409
                  id_ex_div <= 0;
1410
                  id_ex_load <= 0;
1411
                  id_ex_store <= 0;
1412
                  id_ex_size <= 0;
1413
                  id_ex_store_value <= 0;
1414
                  id_ex_destreg <= 0;
1415
                  id_ex_desthi <= 1;
1416
                  id_ex_destlo <= 1;
1417
                  id_ex_destsyscon <= 0;
1418
                  mul_req_i <= !mul_req_i;  // Toggle the ABP request
1419
                end
1420
              `FUNCTION_MULTU:
1421
                begin
1422
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as MULTU r%d, r%d", if_id_addr, if_id_opcode, if_id_rs, if_id_rt);
1423
                  id_ex_alu_a <= GPR[if_id_rs];
1424
                  id_ex_alu_b <= GPR[if_id_rt];
1425
                  id_ex_alu_func <= `ALU_OP_MULT;
1426
                  id_ex_alu_signed <= 0;
1427
                  id_ex_branch <= 0;
1428
                  id_ex_jump <= 0;
1429
                  id_ex_jr <= 0;
1430
                  id_ex_linked <= 0;
1431
                  id_ex_mult <= 1;
1432
                  id_ex_div <= 0;
1433
                  id_ex_load <= 0;
1434
                  id_ex_store <= 0;
1435
                  id_ex_size <= 0;
1436
                  id_ex_store_value <= 0;
1437
                  id_ex_destreg <= 0;
1438
                  id_ex_desthi <= 1;
1439
                  id_ex_destlo <= 1;
1440
                  id_ex_destsyscon <= 0;
1441
                  mul_req_i <= !mul_req_i;  // Toggle the ABP request
1442
                end
1443
              `FUNCTION_DIV:
1444
                begin
1445
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as DIV r%d, r%d", if_id_addr, if_id_opcode, if_id_rs, if_id_rt);
1446
                  id_ex_alu_a <= GPR[if_id_rs];
1447
                  id_ex_alu_b <= GPR[if_id_rt];
1448
                  id_ex_alu_func <= `ALU_OP_DIV;
1449
                  id_ex_alu_signed <= 1;
1450
                  id_ex_branch <= 0;
1451
                  id_ex_jump <= 0;
1452
                  id_ex_jr <= 0;
1453
                  id_ex_linked <= 0;
1454
                  id_ex_mult <= 0;
1455
                  id_ex_div <= 1;
1456
                  id_ex_load <= 0;
1457
                  id_ex_store <= 0;
1458
                  id_ex_size <= 0;
1459
                  id_ex_store_value <= 0;
1460
                  id_ex_destreg <= 0;
1461
                  id_ex_desthi <= 1;
1462
                  id_ex_destlo <= 1;
1463
                  id_ex_destsyscon <= 0;
1464
                  div_req_i <= !div_req_i;  // Toggle the ABP request
1465
                end
1466
              `FUNCTION_DIVU:
1467
                begin
1468
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as DIVU r%d, r%d", if_id_addr, if_id_opcode, if_id_rs, if_id_rt);
1469
                  id_ex_alu_a <= GPR[if_id_rs];
1470
                  id_ex_alu_b <= GPR[if_id_rt];
1471
                  id_ex_alu_func <= `ALU_OP_DIV;
1472
                  id_ex_alu_signed <= 0;
1473
                  id_ex_branch <= 0;
1474
                  id_ex_jump <= 0;
1475
                  id_ex_jr <= 0;
1476
                  id_ex_linked <= 0;
1477
                  id_ex_mult <= 0;
1478
                  id_ex_div <= 1;
1479
                  id_ex_load <= 0;
1480
                  id_ex_store <= 0;
1481
                  id_ex_size <= 0;
1482
                  id_ex_store_value <= 0;
1483
                  id_ex_destreg <= 0;
1484
                  id_ex_desthi <= 1;
1485
                  id_ex_destlo <= 1;
1486
                  id_ex_destsyscon <= 0;
1487
                  div_req_i <= !div_req_i;  // Toggle the ABP request
1488
                end
1489
              `FUNCTION_ADD:
1490
                begin
1491
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as ADD r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1492
                  id_ex_alu_a <= GPR[if_id_rs];
1493
                  id_ex_alu_b <= GPR[if_id_rt];
1494
                  id_ex_alu_func <= `ALU_OP_ADD;
1495
                  id_ex_alu_signed <= 1;
1496
                  id_ex_branch <= 0;
1497
                  id_ex_jump <= 0;
1498
                  id_ex_jr <= 0;
1499
                  id_ex_linked <= 0;
1500
                  id_ex_mult <= 0;
1501
                  id_ex_div <= 0;
1502
                  id_ex_load <= 0;
1503
                  id_ex_store <= 0;
1504
                  id_ex_size <= 0;
1505
                  id_ex_store_value <= 0;
1506
                  id_ex_destreg <= if_id_rd;
1507
                  id_ex_desthi <= 0;
1508
                  id_ex_destlo <= 0;
1509
                  id_ex_destsyscon <= 0;
1510
                end
1511
              `FUNCTION_ADDU:
1512
                begin
1513
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as ADDU r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1514
                  id_ex_alu_a <= GPR[if_id_rs];
1515
                  id_ex_alu_b <= GPR[if_id_rt];
1516
                  id_ex_alu_func <= `ALU_OP_ADD;
1517
                  id_ex_alu_signed <= 0;
1518
                  id_ex_branch <= 0;
1519
                  id_ex_jump <= 0;
1520
                  id_ex_jr <= 0;
1521
                  id_ex_linked <= 0;
1522
                  id_ex_mult <= 0;
1523
                  id_ex_div <= 0;
1524
                  id_ex_load <= 0;
1525
                  id_ex_store <= 0;
1526
                  id_ex_size <= 0;
1527
                  id_ex_store_value <= 0;
1528
                  id_ex_destreg <= if_id_rd;
1529
                  id_ex_desthi <= 0;
1530
                  id_ex_destlo <= 0;
1531
                  id_ex_destsyscon <= 0;
1532
                end
1533
              `FUNCTION_SUB:
1534
                begin
1535
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SUB r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1536
                  id_ex_alu_a <= GPR[if_id_rs];
1537
                  id_ex_alu_b <= GPR[if_id_rt];
1538
                  id_ex_alu_func <= `ALU_OP_SUB;
1539
                  id_ex_alu_signed <= 1;
1540
                  id_ex_branch <= 0;
1541
                  id_ex_jump <= 0;
1542
                  id_ex_jr <= 0;
1543
                  id_ex_linked <= 0;
1544
                  id_ex_mult <= 0;
1545
                  id_ex_div <= 0;
1546
                  id_ex_load <= 0;
1547
                  id_ex_store <= 0;
1548
                  id_ex_size <= 0;
1549
                  id_ex_store_value <= 0;
1550
                  id_ex_destreg <= if_id_rd;
1551
                  id_ex_desthi <= 0;
1552
                  id_ex_destlo <= 0;
1553
                  id_ex_destsyscon <= 0;
1554
                end
1555
              `FUNCTION_SUBU:
1556
                begin
1557
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SUBU r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1558
                  id_ex_alu_a <= GPR[if_id_rs];
1559
                  id_ex_alu_b <= GPR[if_id_rt];
1560
                  id_ex_alu_func <= `ALU_OP_SUB;
1561
                  id_ex_alu_signed <= 0;
1562
                  id_ex_branch <= 0;
1563
                  id_ex_jump <= 0;
1564
                  id_ex_jr <= 0;
1565
                  id_ex_linked <= 0;
1566
                  id_ex_mult <= 0;
1567
                  id_ex_div <= 0;
1568
                  id_ex_load <= 0;
1569
                  id_ex_store <= 0;
1570
                  id_ex_size <= 0;
1571
                  id_ex_store_value <= 0;
1572
                  id_ex_destreg <= if_id_rd;
1573
                  id_ex_desthi <= 0;
1574
                  id_ex_destlo <= 0;
1575
                  id_ex_destsyscon <= 0;
1576
                end
1577
              `FUNCTION_AND:
1578
                begin
1579
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as AND r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1580
                  id_ex_alu_a <= GPR[if_id_rs];
1581
                  id_ex_alu_b <= GPR[if_id_rt];
1582
                  id_ex_alu_func <= `ALU_OP_AND;
1583
                  id_ex_alu_signed <= 0;
1584
                  id_ex_branch <= 0;
1585
                  id_ex_jump <= 0;
1586
                  id_ex_jr <= 0;
1587
                  id_ex_linked <= 0;
1588
                  id_ex_mult <= 0;
1589
                  id_ex_div <= 0;
1590
                  id_ex_load <= 0;
1591
                  id_ex_store <= 0;
1592
                  id_ex_size <= 0;
1593
                  id_ex_store_value <= 0;
1594
                  id_ex_destreg <= if_id_rd;
1595
                  id_ex_desthi <= 0;
1596
                  id_ex_destlo <= 0;
1597
                  id_ex_destsyscon <= 0;
1598
                end
1599
              `FUNCTION_OR:
1600
                begin
1601
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as OR r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1602
                  id_ex_alu_a <= GPR[if_id_rs];
1603
                  id_ex_alu_b <= GPR[if_id_rt];
1604
                  id_ex_alu_func <= `ALU_OP_OR;
1605
                  id_ex_alu_signed <= 0;
1606
                  id_ex_branch <= 0;
1607
                  id_ex_jump <= 0;
1608
                  id_ex_jr <= 0;
1609
                  id_ex_linked <= 0;
1610
                  id_ex_mult <= 0;
1611
                  id_ex_div <= 0;
1612
                  id_ex_load <= 0;
1613
                  id_ex_store <= 0;
1614
                  id_ex_size <= 0;
1615
                  id_ex_store_value <= 0;
1616
                  id_ex_destreg <= if_id_rd;
1617
                  id_ex_desthi <= 0;
1618
                  id_ex_destlo <= 0;
1619
                  id_ex_destsyscon <= 0;
1620
                end
1621
              `FUNCTION_XOR:
1622
                begin
1623
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as XOR r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1624
                  id_ex_alu_a <= GPR[if_id_rs];
1625
                  id_ex_alu_b <= GPR[if_id_rt];
1626
                  id_ex_alu_func <= `ALU_OP_XOR;
1627
                  id_ex_alu_signed <= 0;
1628
                  id_ex_branch <= 0;
1629
                  id_ex_jump <= 0;
1630
                  id_ex_jr <= 0;
1631
                  id_ex_linked <= 0;
1632
                  id_ex_mult <= 0;
1633
                  id_ex_div <= 0;
1634
                  id_ex_load <= 0;
1635
                  id_ex_store <= 0;
1636
                  id_ex_size <= 0;
1637
                  id_ex_store_value <= 0;
1638
                  id_ex_destreg <= if_id_rd;
1639
                  id_ex_desthi <= 0;
1640
                  id_ex_destlo <= 0;
1641
                  id_ex_destsyscon <= 0;
1642
                end
1643
              `FUNCTION_NOR:
1644
                begin
1645
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as NOR r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1646
                  id_ex_alu_a <= GPR[if_id_rs];
1647
                  id_ex_alu_b <= GPR[if_id_rt];
1648
                  id_ex_alu_func <= `ALU_OP_NOR;
1649
                  id_ex_alu_signed <= 0;
1650
                  id_ex_branch <= 0;
1651
                  id_ex_jump <= 0;
1652
                  id_ex_jr <= 0;
1653
                  id_ex_linked <= 0;
1654
                  id_ex_mult <= 0;
1655
                  id_ex_div <= 0;
1656
                  id_ex_load <= 0;
1657
                  id_ex_store <= 0;
1658
                  id_ex_size <= 0;
1659
                  id_ex_store_value <= 0;
1660
                  id_ex_destreg <= if_id_rd;
1661
                  id_ex_desthi <= 0;
1662
                  id_ex_destlo <= 0;
1663
                  id_ex_destsyscon <= 0;
1664
                end
1665
              `FUNCTION_SLT:
1666
                begin
1667
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SLT r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1668
                  id_ex_alu_a <= GPR[if_id_rs];
1669
                  id_ex_alu_b <= GPR[if_id_rt];
1670
                  id_ex_alu_func <= `ALU_OP_SLT;
1671
                  id_ex_alu_signed <= 1;
1672
                  id_ex_branch <= 0;
1673
                  id_ex_jump <= 0;
1674
                  id_ex_jr <= 0;
1675
                  id_ex_linked <= 0;
1676
                  id_ex_mult <= 0;
1677
                  id_ex_div <= 0;
1678
                  id_ex_load <= 0;
1679
                  id_ex_store <= 0;
1680
                  id_ex_size <= 0;
1681
                  id_ex_store_value <= 0;
1682
                  id_ex_destreg <= if_id_rd;
1683
                  id_ex_desthi <= 0;
1684
                  id_ex_destlo <= 0;
1685
                  id_ex_destsyscon <= 0;
1686
                end
1687
              `FUNCTION_SLTU:
1688
                begin
1689
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as SLTU r%d, r%d, r%d", if_id_addr, if_id_opcode, if_id_rd, if_id_rs, if_id_rt);
1690
                  id_ex_alu_a <= GPR[if_id_rs];
1691
                  id_ex_alu_b <= GPR[if_id_rt];
1692
                  id_ex_alu_func <= `ALU_OP_SLT;
1693
                  id_ex_alu_signed <= 0;
1694
                  id_ex_branch <= 0;
1695
                  id_ex_jump <= 0;
1696
                  id_ex_jr <= 0;
1697
                  id_ex_linked <= 0;
1698
                  id_ex_mult <= 0;
1699
                  id_ex_div <= 0;
1700
                  id_ex_load <= 0;
1701
                  id_ex_store <= 0;
1702
                  id_ex_size <= 0;
1703
                  id_ex_store_value <= 0;
1704
                  id_ex_destreg <= if_id_rd;
1705
                  id_ex_desthi <= 0;
1706
                  id_ex_destlo <= 0;
1707
                  id_ex_destsyscon <= 0;
1708
                end
1709
            endcase
1710
          `OPCODE_BCOND:
1711
            case(if_id_rt)
1712
              `BCOND_BLTZ:
1713
                begin
1714
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BLTZ r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_imm_signext);
1715
                  id_ex_alu_a <= GPR[if_id_rs];
1716
                  id_ex_alu_b <= 0;
1717
                  id_ex_alu_func <= `ALU_OP_SLT;
1718
                  id_ex_alu_signed <= 1;
1719
                  id_ex_branch <= 1;
1720
                  id_ex_jump <= 0;
1721
                  id_ex_jr <= 0;
1722
                  id_ex_linked <= 0;
1723
                  id_ex_mult <= 0;
1724
                  id_ex_div <= 0;
1725
                  id_ex_load <= 0;
1726
                  id_ex_store <= 0;
1727
                  id_ex_size <= 0;
1728
                  id_ex_store_value <= 0;
1729
                  id_ex_destreg <= if_id_rd;
1730
                  id_ex_desthi <= 0;
1731
                  id_ex_destlo <= 0;
1732
                  id_ex_destsyscon <= 0;
1733
                end
1734
              `BCOND_BGEZ:
1735
                begin
1736
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BGEZ r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_imm_signext);
1737
                  id_ex_alu_a <= GPR[if_id_rs];
1738
                  id_ex_alu_b <= 0;
1739
                  id_ex_alu_func <= `ALU_OP_SGE;
1740
                  id_ex_alu_signed <= 1;
1741
                  id_ex_branch <= 1;
1742
                  id_ex_jump <= 0;
1743
                  id_ex_jr <= 0;
1744
                  id_ex_linked <= 0;
1745
                  id_ex_mult <= 0;
1746
                  id_ex_div <= 0;
1747
                  id_ex_load <= 0;
1748
                  id_ex_store <= 0;
1749
                  id_ex_size <= 0;
1750
                  id_ex_store_value <= 0;
1751
                  id_ex_destreg <= if_id_rd;
1752
                  id_ex_desthi <= 0;
1753
                  id_ex_destlo <= 0;
1754
                  id_ex_destsyscon <= 0;
1755
                end
1756
              `BCOND_BLTZAL:
1757
                begin
1758
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BLTZAL r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_imm_signext);
1759
                  id_ex_alu_a <= GPR[if_id_rs];
1760
                  id_ex_alu_b <= 0;
1761
                  id_ex_alu_func <= `ALU_OP_SLT;
1762
                  id_ex_alu_signed <= 1;
1763
                  id_ex_branch <= 1;
1764
                  id_ex_jump <= 0;
1765
                  id_ex_jr <= 0;
1766
                  id_ex_linked <= 1;
1767
                  id_ex_mult <= 0;
1768
                  id_ex_div <= 0;
1769
                  id_ex_load <= 0;
1770
                  id_ex_store <= 0;
1771
                  id_ex_size <= 0;
1772
                  id_ex_store_value <= 0;
1773
                  id_ex_destreg <= 31;
1774
                  id_ex_desthi <= 0;
1775
                  id_ex_destlo <= 0;
1776
                  id_ex_destsyscon <= 0;
1777
                end
1778
              `BCOND_BGEZAL:
1779
                begin
1780
                  $display("INFO: CPU(%m)-ID: Decoded instruction @ADDR=%X w/OPCODE=%X as BGEZAL r%d, %h", if_id_addr, if_id_opcode, if_id_rs, if_id_imm_signext);
1781
                  id_ex_alu_a <= GPR[if_id_rs];
1782
                  id_ex_alu_b <= 0;
1783
                  id_ex_alu_func <= `ALU_OP_SGE;
1784
                  id_ex_alu_signed <= 1;
1785
                  id_ex_branch <= 1;
1786
                  id_ex_jump <= 0;
1787
                  id_ex_jr <= 0;
1788
                  id_ex_linked <= 1;
1789
                  id_ex_mult <= 0;
1790
                  id_ex_div <= 0;
1791
                  id_ex_load <= 0;
1792
                  id_ex_store <= 0;
1793
                  id_ex_size <= 0;
1794
                  id_ex_store_value <= 0;
1795
                  id_ex_destreg <= 31;
1796
                  id_ex_desthi <= 0;
1797
                  id_ex_destlo <= 0;
1798
                  id_ex_destsyscon <= 0;
1799
                end
1800
            endcase
1801
 
1802
        endcase
1803
 
1804
      end
1805
 
1806
      /*
1807
       * Pipeline Stage 3: Execute (EX)
1808
       *
1809
       * READ/WRITE:
1810
       * - read the ID/EX latch
1811
       * - write the EX/MEM latch
1812
       *
1813
       * DESCRIPTION:
1814
       * This stage takes the result from the ALU and put it in the proper latch.
1815
       * Please note that assignments to ALU inputs are done outside since they're wires.
1816
       */
1817
 
1818
      if(ex_stall) begin
1819
 
1820
        $display("INFO: CPU(%m)-EX: Execution stalled");
1821
 
1822
      end else begin
1823
<<<<<<< m1_cpu.v
1824
 
1825
        // If not stalled propagate values to next latches
1826
        ex_mem_opcode      <= id_ex_opcode;
1827
        ex_mem_addr        <= id_ex_addr;
1828
        ex_mem_addrnext    <= id_ex_addrnext;
1829
        ex_mem_addrjump    <= id_ex_addrjump;
1830
        ex_mem_addrbranch  <= id_ex_addrbranch;
1831
        ex_mem_branch      <= id_ex_branch;
1832
        ex_mem_jump        <= id_ex_jump;
1833
        ex_mem_jr          <= id_ex_jr;
1834
        ex_mem_linked      <= id_ex_linked;
1835
        ex_mem_mult        <= id_ex_mult;
1836
        ex_mem_div         <= id_ex_div;
1837
        ex_mem_load        <= id_ex_load;
1838
        ex_mem_store       <= id_ex_store;
1839
        ex_mem_destreg     <= id_ex_destreg;
1840
        ex_mem_desthi      <= id_ex_desthi;
1841
        ex_mem_destlo      <= id_ex_destlo;
1842
        ex_mem_destsyscon  <= id_ex_destsyscon;
1843
 
1844
        // Choose the output from ALU, Multiplier or Divider
1845
        if(id_ex_mult) ex_mem_aluout <= mul_product_o;
1846
        else if(id_ex_div) ex_mem_aluout <= { div_remainder_o, div_quotient_o };
1847
        else ex_mem_aluout <= alu_result_o;
1848
 
1849
        if(id_ex_store) begin
1850
 
1851
          $display("INFO: CPU(%m)-EX: Execution of Store instruction @ADDR=%X w/OPCODE=%X started to STORE_ADDR=%X", id_ex_addr, id_ex_opcode, alu_result_o);
1852
          case(id_ex_size)
1853
            `SIZE_WORD: begin
1854
              ex_mem_store_value <= id_ex_store_value;
1855
              ex_mem_store_sel <= 4'b1111;
1856
            end
1857
            `SIZE_HALF: begin
1858
              if(alu_result_o[1]==0) begin
1859
                ex_mem_store_value <= {{16'b0},id_ex_store_value[15:0]};
1860
                ex_mem_store_sel <= 4'b0011;
1861
              end else begin
1862
                ex_mem_store_value <= {id_ex_store_value[15:0],{16'b0}};
1863
                ex_mem_store_sel <= 4'b1100;
1864
              end
1865
            end
1866
            `SIZE_BYTE: begin
1867
              case(alu_result_o[1:0])
1868
                2'b00: begin
1869
                  ex_mem_store_value <= {{24'b0},id_ex_store_value[7:0]};
1870
                  ex_mem_store_sel <= 4'b0001;
1871
                end
1872
                2'b01: begin
1873
                  ex_mem_store_value <= {{16'b0},id_ex_store_value[7:0],{8'b0}};
1874
                  ex_mem_store_sel <= 4'b0010;
1875
                end
1876
                2'b10: begin
1877
                  ex_mem_store_value <= {{8'b0},id_ex_store_value[7:0],{16'b0}};
1878
                  ex_mem_store_sel <= 4'b0100;
1879
                end
1880
                2'b11: begin
1881
                  ex_mem_store_value <= {id_ex_store_value[7:0],{24'b0}};
1882
                  ex_mem_store_sel <= 4'b1000;
1883
                end
1884
              endcase
1885
            end
1886
          endcase
1887
 
1888
        end else
1889
 
1890
          // Not a store
1891
          $display("INFO: CPU(%m)-EX: Execution of instruction @ADDR=%X w/OPCODE=%X gave ALU result %X", id_ex_addr, id_ex_opcode, alu_result_o);
1892
// Dunno why but these two cleaning instructions were always executed and prevented stores to work properly
1893
//          ex_mem_store_value <= 0;
1894
//          ex_mem_store_sel <= 4'b0000;
1895
 
1896
        end
1897
=======
1898
        ex_mem_pc          <= id_ex_pc;
1899
        ex_mem_pcnext      <= id_ex_pcnext;
1900
        ex_mem_pcjump      <= id_ex_pcjump;
1901
        ex_mem_pcbranch    <= id_ex_pcbranch;
1902
        ex_mem_alu_out     <= alu_result_o;
1903
        ex_mem_jump        <= id_ex_jump;
1904
        ex_mem_branch      <= id_ex_branch;
1905
        ex_mem_linked      <= id_ex_linked;
1906
        ex_mem_load        <= id_ex_load;
1907
        ex_mem_store       <= id_ex_store;
1908
        ex_mem_store_value <= id_ex_store_value;
1909
        ex_mem_destreg     <= id_ex_destreg;
1910
        ex_mem_desthi      <= id_ex_desthi;
1911
        ex_mem_destlo      <= id_ex_destlo;
1912
>>>>>>> 1.9
1913
      end
1914
 
1915
      /*
1916
       * Pipeline Stage 4: Memory access (MEM)
1917
       *
1918
       * READ/WRITE:
1919
       * - read the EX/MEM latch
1920
       * - read or write memory
1921
       * - write the MEM/WB latch
1922
       *
1923
       * DESCRIPTION:
1924
       * This stage perform accesses to memory to read/write the data during
1925
       * the load/store operations.
1926
       */
1927
 
1928
      if(mem_stall) begin
1929
 
1930
        $display("INFO: CPU(%m)-MEM: Memory stalled");
1931
 
1932
      end else begin
1933
 
1934
        mem_wb_opcode     <= ex_mem_opcode;
1935
        mem_wb_addr       <= ex_mem_addr;
1936
        mem_wb_addrnext   <= ex_mem_addrnext;
1937
        mem_wb_destreg    <= ex_mem_destreg;
1938
        mem_wb_desthi     <= ex_mem_desthi;
1939
        mem_wb_destlo     <= ex_mem_destlo;
1940
        mem_wb_destsyscon <= ex_mem_destsyscon;
1941
 
1942
        if(ex_mem_load) begin
1943
 
1944
          $display("INFO: CPU(%m)-MEM: LOADing value %X", dmem_data_i);
1945
          mem_wb_value[63:32] <= 32'b0;
1946
          mem_wb_value[31:0] <= dmem_data_i;
1947
 
1948
        end else begin
1949
 
1950
          $display("INFO: CPU(%m)-MEM: Propagating value %X", ex_mem_aluout);
1951
          mem_wb_value <= ex_mem_aluout;
1952
 
1953
        end
1954
 
1955
      end
1956
 
1957
      /*
1958
       * Pipeline Stage 5: Write Back (WB)
1959
       *
1960
       * READ/WRITE:
1961
       * - read the MEM/WB latch
1962
       * - write the register file
1963
       *
1964
       * DESCRIPTION:
1965
       * This stage writes back the result into the proper register (GPR, HI, LO).
1966
       */
1967
 
1968
      if(wb_stall) begin
1969
 
1970
        $display("INFO: CPU(%m)-WB: Write-Back stalled");
1971
 
1972
      end else begin
1973
 
1974
        // GPRs
1975
        if(mem_wb_destreg!=0) begin
1976
          $display("INFO: CPU(%m)-WB: Writing Back GPR[%d]=%X", mem_wb_destreg, mem_wb_value[31:0]);
1977
          GPR[mem_wb_destreg] <= mem_wb_value[31:0];
1978
        end
1979
 
1980
        // HI
1981
        if(mem_wb_desthi) begin
1982
          $display("INFO: CPU(%m)-WB: Writing Back HI=%X", mem_wb_value[63:32]);
1983
          HI <= mem_wb_value[63:32];
1984
        end
1985
 
1986
        // LO
1987
        if(mem_wb_destlo) begin
1988
          $display("INFO: CPU(%m)-WB: Writing Back LO=%X", mem_wb_value[31:0]);
1989
          LO <= mem_wb_value[31:0];
1990
        end
1991
 
1992
        // SysCon
1993
        if(mem_wb_destsyscon!=0) begin
1994
          $display("INFO: CPU(%m)-WB: Writing Back SysCon[%d]=%X", mem_wb_destsyscon, mem_wb_value[31:0]);
1995
          GPR[mem_wb_destsyscon] <= mem_wb_value[31:0];
1996
        end
1997
 
1998
        // Idle
1999
        if(mem_wb_destreg==0 & mem_wb_desthi==0 & mem_wb_destlo==0 & mem_wb_destsyscon==0)
2000
          $display("INFO: CPU(%m)-WB: Write-Back has nothing to do");
2001
 
2002
      end
2003
 
2004
      // Display register file at each raising edge
2005
      $display("INFO: CPU(%m)-Regs: R00=%X R01=%X R02=%X R03=%X R04=%X R05=%X R06=%X R07=%X",
2006
        GPR[0], GPR[1], GPR[2], GPR[3], GPR[4], GPR[5], GPR[6], GPR[7]);
2007
      $display("INFO: CPU(%m)-Regs: R08=%X R09=%X R10=%X R11=%X R12=%X R13=%X R14=%X R15=%X",
2008
        GPR[8], GPR[9], GPR[10], GPR[11], GPR[12], GPR[13], GPR[14], GPR[15]);
2009
      $display("INFO: CPU(%m)-Regs: R16=%X R17=%X R18=%X R19=%X R20=%X R21=%X R22=%X R23=%X",
2010
        GPR[16], GPR[17], GPR[18], GPR[19], GPR[20], GPR[21], GPR[22], GPR[23]);
2011
      $display("INFO: CPU(%m)-Regs: R24=%X R25=%X R26=%X R27=%X R28=%X R29=%X R30=%X R31=%X",
2012
        GPR[24], GPR[25], GPR[26], GPR[27], GPR[28], GPR[29], GPR[30], GPR[31]);
2013
      $display("INFO: CPU(%m)-Regs: PC=%X HI=%X LO=%X Status=%X Cause=%X EPC=%X",
2014
        PC, HI, LO, Status, Cause, EPC);
2015
 
2016
  end
2017
 
2018
endmodule
2019
 

powered by: WebSVN 2.1.0

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