OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-5.0/] [rtl/] [verilog/] [mor1kx_decode_execute_cappuccino.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/* ****************************************************************************
2
  This Source Code Form is subject to the terms of the
3
  Open Hardware Description License, v. 1.0. If a copy
4
  of the OHDL was not distributed with this file, You
5
  can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
  Description: Cappuccino decode to execute module.
8
  - Decode to execute stage signal passing.
9
  - Branches are resolved (in decode stage).
10
  - Hazards that can not be resolved by bypassing are detected and
11
    bubbles are inserted on such conditions.
12
 
13
  Generate valid signal when stage is done.
14
 
15
  Copyright (C) 2012 Julius Baxter <juliusbaxter@gmail.com>
16
  Copyright (C) 2013 Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
17
 
18
***************************************************************************** */
19
 
20
`include "mor1kx-defines.v"
21
 
22
module mor1kx_decode_execute_cappuccino
23
  #(
24
    parameter OPTION_OPERAND_WIDTH = 32,
25
    parameter OPTION_RESET_PC = {{(OPTION_OPERAND_WIDTH-13){1'b0}},
26
                                 `OR1K_RESET_VECTOR,8'd0},
27
 
28
    parameter OPTION_RF_ADDR_WIDTH = 5,
29
 
30
    parameter FEATURE_SYSCALL = "ENABLED",
31
    parameter FEATURE_TRAP = "ENABLED",
32
    parameter FEATURE_DELAY_SLOT = "ENABLED",
33
 
34
    parameter FEATURE_MULTIPLIER = "THREESTAGE",
35
 
36
    parameter FEATURE_FPU   = "NONE", // ENABLED|NONE
37
 
38
    parameter FEATURE_INBUILT_CHECKERS = "ENABLED"
39
    )
40
   (
41
    input                                 clk,
42
    input                                 rst,
43
 
44
    // pipeline control signal in
45
    input                                 padv_i,
46
    input [OPTION_OPERAND_WIDTH-1:0]       pc_decode_i,
47
 
48
    // input from register file
49
    input [OPTION_OPERAND_WIDTH-1:0]       decode_rfb_i,
50
    input [OPTION_OPERAND_WIDTH-1:0]       execute_rfb_i,
51
 
52
    // Branch prediction signals
53
    input                                 predicted_flag_i,
54
    output reg                            execute_predicted_flag_o,
55
    // The target pc that should be used in case of branch misprediction
56
    output reg [OPTION_OPERAND_WIDTH-1:0] execute_mispredict_target_o,
57
 
58
    input                                 pipeline_flush_i,
59
 
60
    // ALU related inputs from decode
61
    input [`OR1K_ALU_OPC_WIDTH-1:0]        decode_opc_alu_i,
62
    input [`OR1K_ALU_OPC_WIDTH-1:0]        decode_opc_alu_secondary_i,
63
 
64
    input [`OR1K_IMM_WIDTH-1:0]    decode_imm16_i,
65
    input [OPTION_OPERAND_WIDTH-1:0]       decode_immediate_i,
66
    input                                 decode_immediate_sel_i,
67
 
68
    //  ALU related outputs to execute
69
    output reg [`OR1K_ALU_OPC_WIDTH-1:0]  execute_opc_alu_o,
70
    output reg [`OR1K_ALU_OPC_WIDTH-1:0]  execute_opc_alu_secondary_o,
71
 
72
    output reg [`OR1K_IMM_WIDTH-1:0]       execute_imm16_o,
73
    output reg [OPTION_OPERAND_WIDTH-1:0] execute_immediate_o,
74
    output reg                            execute_immediate_sel_o,
75
 
76
    // Adder control logic from decode
77
    input                                 decode_adder_do_sub_i,
78
    input                                 decode_adder_do_carry_i,
79
 
80
    // Adder control logic to execute
81
    output reg                            execute_adder_do_sub_o,
82
    output reg                            execute_adder_do_carry_o,
83
 
84
    // Upper 10 bits of immediate for jumps and branches
85
    input [9:0]                    decode_immjbr_upper_i,
86
    output reg [9:0]                       execute_immjbr_upper_o,
87
 
88
    // GPR numbers
89
    output reg [OPTION_RF_ADDR_WIDTH-1:0] execute_rfd_adr_o,
90
    input [OPTION_RF_ADDR_WIDTH-1:0]       decode_rfd_adr_i,
91
    input [OPTION_RF_ADDR_WIDTH-1:0]       decode_rfa_adr_i,
92
    input [OPTION_RF_ADDR_WIDTH-1:0]       decode_rfb_adr_i,
93
    input [OPTION_RF_ADDR_WIDTH-1:0]       ctrl_rfd_adr_i,
94
    input                                 ctrl_op_lsu_load_i,
95
    input                                 ctrl_op_mfspr_i,
96
    input                                 ctrl_op_mul_i,
97
 
98
    // Control signal inputs from decode stage
99
    input                                 decode_rf_wb_i,
100
 
101
    input                                 decode_op_alu_i,
102
 
103
    input                                 decode_op_setflag_i,
104
 
105
    input                                 decode_op_jbr_i,
106
    input                                 decode_op_jr_i,
107
    input                                 decode_op_jal_i,
108
    input                                 decode_op_bf_i,
109
    input                                 decode_op_bnf_i,
110
    input                                 decode_op_brcond_i,
111
    input                                 decode_op_branch_i,
112
 
113
    input                                 decode_op_lsu_load_i,
114
    input                                 decode_op_lsu_store_i,
115
    input                                 decode_op_lsu_atomic_i,
116
    input [1:0]                    decode_lsu_length_i,
117
    input                                 decode_lsu_zext_i,
118
 
119
    input                                 decode_op_mfspr_i,
120
    input                                 decode_op_mtspr_i,
121
 
122
    input                                 decode_op_rfe_i,
123
    input                                 decode_op_add_i,
124
    input                                 decode_op_mul_i,
125
    input                                 decode_op_mul_signed_i,
126
    input                                 decode_op_mul_unsigned_i,
127
    input                                 decode_op_div_i,
128
    input                                 decode_op_div_signed_i,
129
    input                                 decode_op_div_unsigned_i,
130
    input                                 decode_op_shift_i,
131
    input                                 decode_op_ffl1_i,
132
    input                                 decode_op_movhi_i,
133
    input                                 decode_op_ext_i,
134
    input                                 decode_op_msync_i,
135
    input [`OR1K_FPUOP_WIDTH-1:0]         decode_op_fpu_i,
136
 
137
    input [`OR1K_OPCODE_WIDTH-1:0]         decode_opc_insn_i,
138
 
139
    // Control signal outputs to execute stage
140
    output reg                            execute_rf_wb_o,
141
 
142
    output reg                            execute_op_alu_o,
143
 
144
    output reg                            execute_op_setflag_o,
145
 
146
    output reg                            execute_op_jbr_o,
147
    output reg                            execute_op_jr_o,
148
    output reg                            execute_op_jal_o,
149
    output reg                            execute_op_brcond_o,
150
    output reg                            execute_op_branch_o,
151
 
152
    output reg                            execute_op_lsu_load_o,
153
    output reg                            execute_op_lsu_store_o,
154
    output reg                            execute_op_lsu_atomic_o,
155
    output reg [1:0]                       execute_lsu_length_o,
156
    output reg                            execute_lsu_zext_o,
157
 
158
    output reg                            execute_op_mfspr_o,
159
    output reg                            execute_op_mtspr_o,
160
 
161
    output reg                            execute_op_rfe_o,
162
    output reg                            execute_op_add_o,
163
    output reg                            execute_op_mul_o,
164
    output reg                            execute_op_mul_signed_o,
165
    output reg                            execute_op_mul_unsigned_o,
166
    output reg                            execute_op_div_o,
167
    output reg                            execute_op_div_signed_o,
168
    output reg                            execute_op_div_unsigned_o,
169
    output reg                            execute_op_shift_o,
170
    output reg                            execute_op_ffl1_o,
171
    output reg                            execute_op_movhi_o,
172
    output reg                            execute_op_ext_o,
173
    output reg                            execute_op_bf_o,
174
    output reg                            execute_op_bnf_o,
175
    output reg                            execute_op_msync_o,
176
    output [`OR1K_FPUOP_WIDTH-1:0]        execute_op_fpu_o,
177
 
178
    output reg [OPTION_OPERAND_WIDTH-1:0] execute_jal_result_o,
179
 
180
    output reg [`OR1K_OPCODE_WIDTH-1:0]   execute_opc_insn_o,
181
 
182
    // branch detection
183
    output                                decode_branch_o,
184
    output [OPTION_OPERAND_WIDTH-1:0]      decode_branch_target_o,
185
 
186
    // exceptions in
187
    input                                 decode_except_ibus_err_i,
188
    input                                 decode_except_itlb_miss_i,
189
    input                                 decode_except_ipagefault_i,
190
    input                                 decode_except_illegal_i,
191
    input                                 decode_except_syscall_i,
192
    input                                 decode_except_trap_i,
193
 
194
    // exception output -
195
    output reg                            execute_except_ibus_err_o,
196
    output reg                            execute_except_itlb_miss_o,
197
    output reg                            execute_except_ipagefault_o,
198
    output reg                            execute_except_illegal_o,
199
    output reg                            execute_except_ibus_align_o,
200
    output reg                            execute_except_syscall_o,
201
    output reg                            execute_except_trap_o,
202
 
203
    output reg [OPTION_OPERAND_WIDTH-1:0] pc_execute_o,
204
 
205
    // output is valid, signal
206
    output reg                            decode_valid_o,
207
 
208
    output                                decode_bubble_o,
209
    output reg                            execute_bubble_o
210
    );
211
 
212
   wire                            ctrl_to_decode_interlock;
213
   wire                            branch_to_imm;
214
   wire [OPTION_OPERAND_WIDTH-1:0] branch_to_imm_target;
215
   wire                            branch_to_reg;
216
 
217
   wire                            decode_except_ibus_align;
218
 
219
   wire [OPTION_OPERAND_WIDTH-1:0] next_pc_after_branch_insn;
220
   wire [OPTION_OPERAND_WIDTH-1:0] decode_mispredict_target;
221
 
222
   // Op control signals to execute stage
223
   always @(posedge clk `OR_ASYNC_RST)
224
     if (rst) begin
225
        execute_op_bf_o <= 1'b0;
226
        execute_op_bnf_o <= 1'b0;
227
        execute_op_alu_o <= 1'b0;
228
        execute_op_add_o <= 1'b0;
229
        execute_op_mul_o <= 1'b0;
230
        execute_op_mul_signed_o <= 1'b0;
231
        execute_op_mul_unsigned_o <= 1'b0;
232
        execute_op_div_o <= 1'b0;
233
        execute_op_div_signed_o <= 1'b0;
234
        execute_op_div_unsigned_o <= 1'b0;
235
        execute_op_shift_o <= 1'b0;
236
        execute_op_ffl1_o <= 1'b0;
237
        execute_op_movhi_o <= 1'b0;
238
        execute_op_ext_o <= 1'b0;
239
        execute_op_msync_o <= 1'b0;
240
        execute_op_mfspr_o <= 1'b0;
241
        execute_op_mtspr_o <= 1'b0;
242
        execute_op_lsu_load_o <= 1'b0;
243
        execute_op_lsu_store_o <= 1'b0;
244
        execute_op_lsu_atomic_o <= 1'b0;
245
        execute_op_setflag_o <= 1'b0;
246
        execute_op_jbr_o <= 1'b0;
247
        execute_op_jr_o <= 1'b0;
248
        execute_op_jal_o <= 1'b0;
249
        execute_op_brcond_o <= 1'b0;
250
        execute_op_branch_o <= 0;
251
     end else if (pipeline_flush_i) begin
252
        execute_op_bf_o <= 1'b0;
253
        execute_op_bnf_o <= 1'b0;
254
        execute_op_alu_o <= 1'b0;
255
        execute_op_add_o <= 1'b0;
256
        execute_op_mul_o <= 1'b0;
257
        execute_op_mul_signed_o <= 1'b0;
258
        execute_op_mul_unsigned_o <= 1'b0;
259
        execute_op_div_o <= 1'b0;
260
        execute_op_div_signed_o <= 1'b0;
261
        execute_op_div_unsigned_o <= 1'b0;
262
        execute_op_shift_o <= 1'b0;
263
        execute_op_ffl1_o <= 1'b0;
264
        execute_op_movhi_o <= 1'b0;
265
        execute_op_ext_o <= 1'b0;
266
        execute_op_msync_o <= 1'b0;
267
        execute_op_lsu_load_o <= 1'b0;
268
        execute_op_lsu_store_o <= 1'b0;
269
        execute_op_lsu_atomic_o <= 1'b0;
270
        execute_op_setflag_o <= 1'b0;
271
        execute_op_jbr_o <= 1'b0;
272
        execute_op_jr_o <= 1'b0;
273
        execute_op_jal_o <= 1'b0;
274
        execute_op_brcond_o <= 1'b0;
275
        execute_op_branch_o <= 1'b0;
276
     end else if (padv_i) begin
277
        execute_op_bf_o <= decode_op_bf_i;
278
        execute_op_bnf_o <= decode_op_bnf_i;
279
        execute_op_alu_o <= decode_op_alu_i;
280
        execute_op_add_o <= decode_op_add_i;
281
        execute_op_mul_o <= decode_op_mul_i;
282
        execute_op_mul_signed_o <= decode_op_mul_signed_i;
283
        execute_op_mul_unsigned_o <= decode_op_mul_unsigned_i;
284
        execute_op_div_o <= decode_op_div_i;
285
        execute_op_div_signed_o <= decode_op_div_signed_i;
286
        execute_op_div_unsigned_o <= decode_op_div_unsigned_i;
287
        execute_op_shift_o <= decode_op_shift_i;
288
        execute_op_ffl1_o <= decode_op_ffl1_i;
289
        execute_op_movhi_o <= decode_op_movhi_i;
290
        execute_op_ext_o <= decode_op_ext_i;
291
        execute_op_msync_o <= decode_op_msync_i;
292
        execute_op_mfspr_o <= decode_op_mfspr_i;
293
        execute_op_mtspr_o <= decode_op_mtspr_i;
294
        execute_op_lsu_load_o <= decode_op_lsu_load_i;
295
        execute_op_lsu_store_o <= decode_op_lsu_store_i;
296
        execute_op_lsu_atomic_o <= decode_op_lsu_atomic_i;
297
        execute_op_setflag_o <= decode_op_setflag_i;
298
        execute_op_jbr_o <= decode_op_jbr_i;
299
        execute_op_jr_o <= decode_op_jr_i;
300
        execute_op_jal_o <= decode_op_jal_i;
301
        execute_op_brcond_o <= decode_op_brcond_i;
302
        execute_op_branch_o <= decode_op_branch_i;
303
        if (decode_bubble_o) begin
304
           execute_op_bf_o <= 1'b0;
305
           execute_op_bnf_o <= 1'b0;
306
           execute_op_alu_o <= 1'b0;
307
           execute_op_add_o <= 1'b0;
308
           execute_op_mul_o <= 1'b0;
309
           execute_op_mul_signed_o <= 1'b0;
310
           execute_op_mul_unsigned_o <= 1'b0;
311
           execute_op_div_o <= 1'b0;
312
           execute_op_div_signed_o <= 1'b0;
313
           execute_op_div_unsigned_o <= 1'b0;
314
           execute_op_shift_o <= 1'b0;
315
           execute_op_ffl1_o <= 1'b0;
316
           execute_op_movhi_o <= 1'b0;
317
           execute_op_ext_o <= 1'b0;
318
           execute_op_msync_o <= 1'b0;
319
           execute_op_mtspr_o <= 1'b0;
320
           execute_op_mfspr_o <= 1'b0;
321
           execute_op_lsu_load_o <= 1'b0;
322
           execute_op_lsu_store_o <= 1'b0;
323
           execute_op_lsu_atomic_o <= 1'b0;
324
           execute_op_setflag_o <= 1'b0;
325
           execute_op_jbr_o <= 1'b0;
326
           execute_op_jr_o <= 1'b0;
327
           execute_op_jal_o <= 1'b0;
328
           execute_op_brcond_o <= 1'b0;
329
           execute_op_branch_o <= 1'b0;
330
        end
331
     end
332
 
333
   // FPU related
334
   generate
335
     /* verilator lint_off WIDTH */
336
     if (FEATURE_FPU!="NONE") begin : fpu_decode_execute_ena
337
     /* verilator lint_on WIDTH */
338
       reg [`OR1K_FPUOP_WIDTH-1:0] execute_op_fpu_r;
339
       assign execute_op_fpu_o = execute_op_fpu_r;
340
       always @(posedge clk `OR_ASYNC_RST) begin
341
         if (rst)
342
           execute_op_fpu_r <= {`OR1K_FPUOP_WIDTH{1'b0}};
343
         else if (pipeline_flush_i)
344
           execute_op_fpu_r <= {`OR1K_FPUOP_WIDTH{1'b0}};
345
         else if (padv_i)
346
           execute_op_fpu_r <= (decode_bubble_o ?
347
                               {`OR1K_FPUOP_WIDTH{1'b0}} : decode_op_fpu_i);
348
       end // @clk
349
     end
350
     else begin : fpu_decode_execute_none
351
       assign execute_op_fpu_o  = {`OR1K_FPUOP_WIDTH{1'b0}};
352
     end
353
   endgenerate // FPU related
354
 
355
   // rfe is a special case, instead of pushing the pipeline full
356
   // of nops on a decode_bubble_o, we push it full of rfes.
357
   // The reason for this is that we need the rfe to reach control
358
   // stage so it will cause the branch.
359
   // It will clear itself by the pipeline_flush_i that the rfe
360
   // will generate.
361
   always @(posedge clk `OR_ASYNC_RST)
362
     if (rst)
363
       execute_op_rfe_o <= 0;
364
     else if (pipeline_flush_i)
365
       execute_op_rfe_o <= 0;
366
     else if (padv_i)
367
       execute_op_rfe_o <= decode_op_rfe_i;
368
 
369
   always @(posedge clk `OR_ASYNC_RST)
370
     if (rst) begin
371
        execute_rf_wb_o <= 0;
372
     end else if (pipeline_flush_i) begin
373
        execute_rf_wb_o <= 0;
374
     end else if (padv_i) begin
375
        execute_rf_wb_o <= decode_rf_wb_i;
376
        if (decode_bubble_o)
377
          execute_rf_wb_o <= 0;
378
     end
379
 
380
   always @(posedge clk)
381
     if (padv_i)
382
       execute_rfd_adr_o <= decode_rfd_adr_i;
383
 
384
   always @(posedge clk)
385
     if (padv_i) begin
386
        execute_lsu_length_o <= decode_lsu_length_i;
387
        execute_lsu_zext_o <= decode_lsu_zext_i;
388
     end
389
 
390
   always @(posedge clk)
391
     if (padv_i) begin
392
        execute_imm16_o <= decode_imm16_i;
393
        execute_immediate_o <= decode_immediate_i;
394
        execute_immediate_sel_o <= decode_immediate_sel_i;
395
     end
396
 
397
   always @(posedge clk)
398
     if (padv_i )
399
       execute_immjbr_upper_o <= decode_immjbr_upper_i;
400
 
401
   always @(posedge clk)
402
     if (padv_i) begin
403
        execute_opc_alu_o <= decode_opc_alu_i;
404
        execute_opc_alu_secondary_o <= decode_opc_alu_secondary_i;
405
     end
406
 
407
   always @(posedge clk `OR_ASYNC_RST)
408
     if (rst) begin
409
        execute_opc_insn_o <= `OR1K_OPCODE_NOP;
410
     end else if (pipeline_flush_i) begin
411
        execute_opc_insn_o <= `OR1K_OPCODE_NOP;
412
     end else if (padv_i) begin
413
        execute_opc_insn_o <= decode_opc_insn_i;
414
        if (decode_bubble_o)
415
          execute_opc_insn_o <= `OR1K_OPCODE_NOP;
416
     end
417
 
418
   always @(posedge clk `OR_ASYNC_RST)
419
     if (rst) begin
420
        execute_adder_do_sub_o <= 1'b0;
421
        execute_adder_do_carry_o <= 1'b0;
422
     end else if (pipeline_flush_i) begin
423
        execute_adder_do_sub_o <= 1'b0;
424
        execute_adder_do_carry_o <= 1'b0;
425
     end else if (padv_i) begin
426
        execute_adder_do_sub_o <= decode_adder_do_sub_i;
427
        execute_adder_do_carry_o <= decode_adder_do_carry_i;
428
        if (decode_bubble_o) begin
429
           execute_adder_do_sub_o <= 1'b0;
430
           execute_adder_do_carry_o <= 1'b0;
431
        end
432
     end
433
 
434
   // Decode for system call exception
435
   always @(posedge clk `OR_ASYNC_RST)
436
     if (rst)
437
       execute_except_syscall_o <= 0;
438
     else if (padv_i && FEATURE_SYSCALL=="ENABLED")
439
       execute_except_syscall_o <= decode_except_syscall_i;
440
 
441
   // Decode for system call exception
442
   always @(posedge clk `OR_ASYNC_RST)
443
     if (rst)
444
       execute_except_trap_o <= 0;
445
     else if (padv_i && FEATURE_TRAP=="ENABLED")
446
       execute_except_trap_o <= decode_except_trap_i;
447
 
448
   // Decode Illegal instruction
449
   always @(posedge clk `OR_ASYNC_RST)
450
     if (rst)
451
       execute_except_illegal_o <= 0;
452
     else if (padv_i)
453
       execute_except_illegal_o <= decode_except_illegal_i;
454
 
455
   always @(posedge clk `OR_ASYNC_RST)
456
     if (rst)
457
       execute_except_ibus_err_o <= 1'b0;
458
     else if (padv_i)
459
       execute_except_ibus_err_o <= decode_except_ibus_err_i;
460
 
461
   always @(posedge clk `OR_ASYNC_RST)
462
     if (rst)
463
       execute_except_itlb_miss_o <= 1'b0;
464
     else if (padv_i)
465
       execute_except_itlb_miss_o <= decode_except_itlb_miss_i;
466
 
467
   always @(posedge clk `OR_ASYNC_RST)
468
     if (rst)
469
       execute_except_ipagefault_o <= 1'b0;
470
     else if (padv_i)
471
       execute_except_ipagefault_o <= decode_except_ipagefault_i;
472
 
473
   always @(posedge clk `OR_ASYNC_RST)
474
     if (rst)
475
       execute_except_ibus_align_o <= 1'b0;
476
     else if (padv_i)
477
       execute_except_ibus_align_o <= decode_except_ibus_align;
478
 
479
   always @(posedge clk `OR_ASYNC_RST)
480
     if (rst)
481
       decode_valid_o <= 0;
482
     else
483
       decode_valid_o <= padv_i;
484
 
485
   always @(posedge clk `OR_ASYNC_RST)
486
     if (padv_i)
487
       pc_execute_o <= pc_decode_i;
488
 
489
   // Branch detection
490
   assign ctrl_to_decode_interlock = (ctrl_op_lsu_load_i | ctrl_op_mfspr_i |
491
                                      ctrl_op_mul_i &
492
                                      FEATURE_MULTIPLIER=="PIPELINED") &
493
                                     ((decode_rfa_adr_i == ctrl_rfd_adr_i) ||
494
                                      (decode_rfb_adr_i == ctrl_rfd_adr_i));
495
 
496
   assign branch_to_imm = (decode_op_jbr_i &
497
                           // l.j/l.jal
498
                           (!(|decode_opc_insn_i[2:1]) |
499
                            // l.bf/bnf and flag is right
500
                            (decode_opc_insn_i[2] == predicted_flag_i)));
501
 
502
   assign branch_to_imm_target = pc_decode_i + {{4{decode_immjbr_upper_i[9]}},
503
                                                decode_immjbr_upper_i,
504
                                                decode_imm16_i,2'b00};
505
   assign branch_to_reg = decode_op_jr_i &
506
                          !(ctrl_to_decode_interlock |
507
                            execute_rf_wb_o &
508
                            (decode_rfb_adr_i == execute_rfd_adr_o));
509
 
510
   assign decode_branch_o = (branch_to_imm | branch_to_reg) &
511
                            !pipeline_flush_i;
512
 
513
   assign decode_branch_target_o = branch_to_imm ?
514
                                   branch_to_imm_target :
515
                                   // If a bubble have been pushed out to get
516
                                   // the instruction that will write the
517
                                   // branch target to control stage, then we
518
                                   // need to use the register result from
519
                                   // execute stage instead of decode stage.
520
                                   execute_bubble_o | execute_op_jr_o ?
521
                                   execute_rfb_i : decode_rfb_i;
522
 
523
   assign decode_except_ibus_align = decode_branch_o &
524
                                     (|decode_branch_target_o[1:0]);
525
 
526
   assign next_pc_after_branch_insn = FEATURE_DELAY_SLOT == "ENABLED" ?
527
                                      pc_decode_i + 8 : pc_decode_i + 4;
528
 
529
   assign decode_mispredict_target = decode_op_bf_i & !predicted_flag_i |
530
                                     decode_op_bnf_i & predicted_flag_i ?
531
                                     branch_to_imm_target :
532
                                     next_pc_after_branch_insn;
533
 
534
   // Forward branch prediction signals to execute stage
535
   always @(posedge clk)
536
     if (padv_i & decode_op_brcond_i)
537
       execute_mispredict_target_o <= decode_mispredict_target;
538
 
539
   always @(posedge clk)
540
     if (padv_i & decode_op_brcond_i)
541
       execute_predicted_flag_o <= predicted_flag_i;
542
 
543
   // Calculate the link register result
544
   // TODO: investigate if the ALU adder can be used for this without
545
   // introducing critical paths
546
   always @(posedge clk)
547
     if (padv_i)
548
       execute_jal_result_o <= next_pc_after_branch_insn;
549
 
550
   // Detect the situation where there is an instruction in execute stage
551
   // that will produce it's result in control stage (i.e. load and mfspr),
552
   // and an instruction currently in decode stage needing it's result as
553
   // input in execute stage.
554
   // Also detect the situation where there is a jump to register in decode
555
   // stage and an instruction in execute stage that will write to that
556
   // register.
557
   //
558
   // A bubble is also inserted when an rfe instruction is in decode stage,
559
   // the main purpose of this is to stall fetch while the rfe is propagating
560
   // up to ctrl stage.
561
 
562
   assign decode_bubble_o = (
563
                             // load/mfspr/mul
564
                             (execute_op_lsu_load_o | execute_op_mfspr_o |
565
                              execute_op_mul_o &
566
                              FEATURE_MULTIPLIER=="PIPELINED") &
567
                             (decode_rfa_adr_i == execute_rfd_adr_o ||
568
                              decode_rfb_adr_i == execute_rfd_adr_o) |
569
                             // mul
570
                             FEATURE_MULTIPLIER=="PIPELINED" &
571
                             (decode_op_mul_i &
572
                              (ctrl_to_decode_interlock |
573
                               execute_rf_wb_o &
574
                               (decode_rfa_adr_i == execute_rfd_adr_o ||
575
                                decode_rfb_adr_i == execute_rfd_adr_o))) |
576
                             // jr
577
                             decode_op_jr_i &
578
                             (ctrl_to_decode_interlock |
579
                              execute_rf_wb_o &
580
                              (decode_rfb_adr_i == execute_rfd_adr_o)) |
581
                             // atomic store
582
                             execute_op_lsu_store_o & execute_op_lsu_atomic_o |
583
                             // rfe
584
                             decode_op_rfe_i
585
                             ) & padv_i;
586
 
587
   always @(posedge clk `OR_ASYNC_RST)
588
     if (rst)
589
       execute_bubble_o <= 0;
590
     else if (pipeline_flush_i)
591
       execute_bubble_o <= 0;
592
     else if (padv_i)
593
       execute_bubble_o <= decode_bubble_o;
594
 
595
endmodule // mor1kx_decode_execute_cappuccino

powered by: WebSVN 2.1.0

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