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-3.1/] [rtl/] [verilog/] [mor1kx_ctrl_espresso.v] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 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: mor1kx espresso pipeline control unit
8
 
9
  inputs from execute stage
10
 
11
  generate pipeline controls
12
 
13
  manage SPRs
14
 
15
  issue addresses for exceptions to fetch stage
16
  control branches going to fetch stage
17
 
18
  contains tick timer
19
 
20
  contains PIC logic
21
 
22
  Copyright (C) 2012 Authors
23
 
24
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
25
 
26
***************************************************************************** */
27
 
28
`include "mor1kx-defines.v"
29
 
30
module mor1kx_ctrl_espresso
31
  (/*AUTOARG*/
32
   // Outputs
33
   flag_o, spr_npc_o, spr_ppc_o, mfspr_dat_o, ctrl_mfspr_we_o,
34
   carry_o, pipeline_flush_o, padv_fetch_o, padv_decode_o,
35
   padv_execute_o, fetch_take_exception_branch_o, exception_taken_o,
36
   execute_waiting_o, stepping_o, du_dat_o, du_ack_o, du_stall_o,
37
   du_restart_pc_o, du_restart_o, spr_bus_addr_o, spr_bus_we_o,
38
   spr_bus_stb_o, spr_bus_dat_o, spr_sr_o, ctrl_branch_target_o,
39
   ctrl_branch_occur_o, rf_we_o,
40
   // Inputs
41
   clk, rst, ctrl_alu_result_i, ctrl_rfb_i, ctrl_flag_set_i,
42
   ctrl_flag_clear_i, ctrl_opc_insn_i, pc_fetch_i, fetch_advancing_i,
43
   except_ibus_err_i, except_illegal_i, except_syscall_i,
44
   except_dbus_i, except_trap_i, except_align_i, next_fetch_done_i,
45
   alu_valid_i, lsu_valid_i, op_lsu_load_i, op_lsu_store_i, op_jr_i,
46
   op_jbr_i, irq_i, carry_set_i, carry_clear_i, overflow_set_i,
47
   overflow_clear_i, du_addr_i, du_stb_i, du_dat_i, du_we_i,
48
   du_stall_i, spr_bus_dat_dc_i, spr_bus_ack_dc_i, spr_bus_dat_ic_i,
49
   spr_bus_ack_ic_i, spr_bus_dat_dmmu_i, spr_bus_ack_dmmu_i,
50
   spr_bus_dat_immu_i, spr_bus_ack_immu_i, spr_bus_dat_mac_i,
51
   spr_bus_ack_mac_i, spr_bus_dat_pmu_i, spr_bus_ack_pmu_i,
52
   spr_bus_dat_pcu_i, spr_bus_ack_pcu_i, spr_bus_dat_fpu_i,
53
   spr_bus_ack_fpu_i, multicore_coreid_i, rf_wb_i
54
   );
55
 
56
   parameter OPTION_OPERAND_WIDTH       = 32;
57
   parameter OPTION_RESET_PC            = {{(OPTION_OPERAND_WIDTH-13){1'b0}},
58
                                `OR1K_RESET_VECTOR,8'd0};
59
 
60
   parameter FEATURE_SYSCALL            = "ENABLED";
61
   parameter FEATURE_TRAP               = "ENABLED";
62
   parameter FEATURE_RANGE              = "ENABLED";
63
 
64
   parameter FEATURE_DATACACHE          = "NONE";
65
   parameter OPTION_DCACHE_BLOCK_WIDTH  = 5;
66
   parameter OPTION_DCACHE_SET_WIDTH    = 9;
67
   parameter OPTION_DCACHE_WAYS         = 2;
68
   parameter FEATURE_DMMU               = "NONE";
69
   parameter FEATURE_INSTRUCTIONCACHE   = "NONE";
70
   parameter OPTION_ICACHE_BLOCK_WIDTH  = 5;
71
   parameter OPTION_ICACHE_SET_WIDTH    = 9;
72
   parameter OPTION_ICACHE_WAYS         = 2;
73
   parameter FEATURE_IMMU               = "NONE";
74
   parameter FEATURE_TIMER              = "ENABLED";
75
   parameter FEATURE_DEBUGUNIT          = "NONE";
76
   parameter FEATURE_PERFCOUNTERS       = "NONE";
77
   parameter FEATURE_PMU                = "NONE";
78
   parameter FEATURE_MAC                = "NONE";
79
   parameter FEATURE_FPU                = "NONE";
80
 
81
   parameter FEATURE_MULTICORE          = "NONE";
82
 
83
   parameter FEATURE_PIC                = "ENABLED";
84
   parameter OPTION_PIC_TRIGGER         = "LEVEL";
85
   parameter OPTION_PIC_NMI_WIDTH       = 0;
86
 
87
   parameter FEATURE_DSX                = "NONE";
88
   parameter FEATURE_FASTCONTEXTS       = "NONE";
89
   parameter FEATURE_OVERFLOW           = "NONE";
90
 
91
   parameter SPR_SR_WIDTH               = 16;
92
   parameter SPR_SR_RESET_VALUE         = 16'h8001;
93
 
94
   input clk, rst;
95
 
96
   // ALU result - either jump target, SPR address
97
   input [OPTION_OPERAND_WIDTH-1:0] ctrl_alu_result_i;
98
 
99
   // Operand B from RF might be jump address, might be value for SPR
100
   input [OPTION_OPERAND_WIDTH-1:0] ctrl_rfb_i;
101
 
102
   input                            ctrl_flag_set_i, ctrl_flag_clear_i;
103
   output                           flag_o;
104
 
105
   output [OPTION_OPERAND_WIDTH-1:0] spr_npc_o;
106
   output [OPTION_OPERAND_WIDTH-1:0] spr_ppc_o;
107
 
108
   input [`OR1K_OPCODE_WIDTH-1:0]   ctrl_opc_insn_i;
109
 
110
   // PC of execute stage (NPC)
111
   input [OPTION_OPERAND_WIDTH-1:0] pc_fetch_i;
112
   input                            fetch_advancing_i;
113
 
114
 
115
   // Exception inputs, registered on output of execute stage
116
   input                            except_ibus_err_i,
117
                                    except_illegal_i,
118
                                    except_syscall_i, except_dbus_i,
119
                                    except_trap_i, except_align_i;
120
 
121
   // Inputs from two units that can stall proceedings
122
   input                            next_fetch_done_i;
123
 
124
   input                            alu_valid_i, lsu_valid_i;
125
 
126
   input                            op_lsu_load_i, op_lsu_store_i;
127
   input                            op_jr_i, op_jbr_i;
128
 
129
   // External IRQ lines in
130
   input [31:0]                     irq_i;
131
 
132
   // SPR data out
133
   output [OPTION_OPERAND_WIDTH-1:0] mfspr_dat_o;
134
 
135
   // WE to RF for l.mfspr
136
   output                            ctrl_mfspr_we_o;
137
 
138
   // Flag out to branch control, combinatorial
139
   reg                               flag;
140
 
141
   // Arithmetic flags to and from ALU
142
   output                            carry_o;
143
   input                             carry_set_i;
144
   input                             carry_clear_i;
145
   input                             overflow_set_i;
146
   input                             overflow_clear_i;
147
 
148
   // Branch indicator from control unit (l.rfe/exception)
149
   wire                              ctrl_branch_exception;
150
   // PC out to fetch stage for l.rfe, exceptions
151
   wire [OPTION_OPERAND_WIDTH-1:0] ctrl_branch_except_pc;
152
 
153
   // Clear instructions from decode and fetch stage
154
   output                            pipeline_flush_o;
155
 
156
   output                            padv_fetch_o;
157
   output                            padv_decode_o;
158
   output                            padv_execute_o;
159
 
160
   // This indicates to the fetch unit only that it should basically interrupt
161
   // whatever it's doing and start fetching the exception
162
   output                            fetch_take_exception_branch_o;
163
   // This indicates to other parts of the CPU that we've handled an excption
164
   // so can be used to clear exception indication registers
165
   output                            exception_taken_o;
166
 
167
   output                            execute_waiting_o;
168
   output                            stepping_o;
169
 
170
   // Debug bus
171
   input [15:0]                      du_addr_i;
172
   input                             du_stb_i;
173
   input [OPTION_OPERAND_WIDTH-1:0]  du_dat_i;
174
   input                             du_we_i;
175
   output [OPTION_OPERAND_WIDTH-1:0] du_dat_o;
176
   output                            du_ack_o;
177
   // Stall control from debug interface
178
   input                             du_stall_i;
179
   output                            du_stall_o;
180
   output [OPTION_OPERAND_WIDTH-1:0] du_restart_pc_o;
181
   output                            du_restart_o;
182
 
183
   // SPR accesses to external units (cache, mmu, etc.)
184
   output [15:0]                     spr_bus_addr_o;
185
   output                            spr_bus_we_o;
186
   output                            spr_bus_stb_o;
187
   output [OPTION_OPERAND_WIDTH-1:0] spr_bus_dat_o;
188
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_dc_i;
189
   input                             spr_bus_ack_dc_i;
190
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_ic_i;
191
   input                             spr_bus_ack_ic_i;
192
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_dmmu_i;
193
   input                             spr_bus_ack_dmmu_i;
194
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_immu_i;
195
   input                             spr_bus_ack_immu_i;
196
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_mac_i;
197
   input                             spr_bus_ack_mac_i;
198
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_pmu_i;
199
   input                             spr_bus_ack_pmu_i;
200
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_pcu_i;
201
   input                             spr_bus_ack_pcu_i;
202
   input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_fpu_i;
203
   input                             spr_bus_ack_fpu_i;
204
   output [15:0]             spr_sr_o;
205
 
206
   // The multicore core identifier
207
   input [OPTION_OPERAND_WIDTH-1:0] multicore_coreid_i;
208
 
209
   // Internal signals
210
   reg [SPR_SR_WIDTH-1:0]            spr_sr;
211
   reg [SPR_SR_WIDTH-1:0]            spr_esr;
212
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_epcr;
213
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_eear;
214
 
215
   // Programmable Interrupt Control SPRs
216
   wire [31:0]                        spr_picmr;
217
   wire [31:0]                        spr_picsr;
218
 
219
   // Tick Timer SPRs
220
   wire [31:0]                       spr_ttmr;
221
   wire [31:0]                       spr_ttcr;
222
 
223
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_ppc;
224
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_npc;
225
   reg                               execute_delay_slot;
226
   reg                               delay_slot_rf_we_done;
227
 
228
   output [OPTION_OPERAND_WIDTH-1:0] ctrl_branch_target_o;
229
 
230
   reg                               execute_go;
231
   wire                              execute_done;
232
 
233
   reg                               execute_waiting_r;
234
 
235
   reg                               decode_execute_halt;
236
 
237
   reg                               exception_taken;
238
 
239
   reg [OPTION_OPERAND_WIDTH-1:0]    last_branch_insn_pc;
240
   reg [OPTION_OPERAND_WIDTH-1:0]    last_branch_target_pc;
241
 
242
   reg                               take_exception;
243
   reg                               exception_r;
244
 
245
   reg [OPTION_OPERAND_WIDTH-1:0]    exception_pc_addr;
246
 
247
   reg                               waiting_for_fetch;
248
   reg                               branched_and_waiting_for_fetch;
249
 
250
   reg                               doing_rfe_r;
251
   wire                              doing_rfe;
252
   wire                              deassert_doing_rfe;
253
 
254
   wire                              exception, exception_pending;
255
 
256
   wire                              execute_stage_exceptions;
257
   wire                              decode_stage_exceptions;
258
 
259
   wire                              exception_re;
260
 
261
   wire                              except_ticktimer;
262
   wire                              except_pic;
263
 
264
   wire                              except_ticktimer_nonsrmasked;
265
   wire                              except_pic_nonsrmasked;
266
 
267
   wire                              except_range;
268
 
269
   wire [15:0]                       spr_addr;
270
 
271
   wire                              op_mtspr;
272
   wire                              op_mfspr;
273
   wire                              op_rfe;
274
 
275
   wire [OPTION_OPERAND_WIDTH-1:0]   b;
276
 
277
   wire                              execute_waiting;
278
 
279
   wire                              execute_valid;
280
 
281
   wire                              deassert_decode_execute_halt;
282
 
283
   wire                              ctrl_branch_occur;
284
   wire                              new_branch;
285
   output                            ctrl_branch_occur_o;
286
   output                            rf_we_o;
287
   input                             rf_wb_i;
288
   wire                              except_ibus_align;
289
   wire                              fetch_advance;
290
   wire                              rfete;
291
   wire                              stall_on_trap;
292
 
293
   /* Debug SPRs */
294
   reg [31:0]                        spr_dmr1;
295
   reg [31:0]                        spr_dmr2;
296
   reg [31:0]                        spr_dsr;
297
   reg [31:0]                        spr_drr;
298
 
299
   /* DU internal control signals */
300
   wire                              du_access;
301
   wire                              cpu_stall;
302
   wire                              du_restart_from_stall;
303
   wire [1:0]                        pstep;
304
   wire                              stepping;
305
   wire                              stepped_into_delay_slot;
306
   wire                              du_npc_write;
307
   reg                               du_npc_written;
308
   reg [OPTION_OPERAND_WIDTH-1:0]    du_spr_npc;
309
 
310
   /* Wires for SPR management */
311
   wire                              spr_group_present;
312
   wire [3:0]                        spr_group;
313
   wire                              spr_we;
314
   wire                              spr_read;
315
   wire [OPTION_OPERAND_WIDTH-1:0]   spr_write_dat;
316
   wire [11:0]                       spr_access_ack;
317
   wire [31:0]                       spr_internal_read_dat [0:12];
318
   wire                              spr_read_access;
319
   wire                              spr_write_access;
320
   wire                              spr_bus_access;
321
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_sys_group_read;
322
 
323
   /* Wires from mor1kx_cfgrs module */
324
   wire [31:0]                        spr_vr;
325
   wire [31:0]                        spr_vr2;
326
   wire [31:0]                        spr_avr;
327
   wire [31:0]                        spr_upr;
328
   wire [31:0]                        spr_cpucfgr;
329
   wire [31:0]                        spr_dmmucfgr;
330
   wire [31:0]                        spr_immucfgr;
331
   wire [31:0]                        spr_dccfgr;
332
   wire [31:0]                        spr_iccfgr;
333
   wire [31:0]                        spr_dcfgr;
334
   wire [31:0]                        spr_pccfgr;
335
   wire [31:0]                        spr_fpcsr;
336
   wire [31:0]                        spr_isr [0:7];
337
 
338
   assign b = ctrl_rfb_i;
339
 
340
   assign ctrl_branch_exception = (exception_r | (op_rfe | doing_rfe)) &
341
                                  !exception_taken;
342
   assign exception_pending = (except_ibus_err_i | except_ibus_align |
343
                               except_illegal_i | except_syscall_i |
344
                               except_dbus_i | except_align_i |
345
                               except_ticktimer | except_range |
346
                               except_pic | except_trap_i );
347
 
348
   assign exception = exception_pending;
349
 
350
   assign fetch_take_exception_branch_o =  (take_exception | op_rfe) &
351
                                           !stepping;
352
 
353
   assign execute_stage_exceptions = except_dbus_i | except_align_i |
354
                                     except_range;
355
   assign decode_stage_exceptions = except_trap_i | except_illegal_i;
356
 
357
   assign exception_re = exception & !exception_r & !exception_taken;
358
 
359
   assign deassert_decode_execute_halt = ctrl_branch_occur &
360
                                         decode_execute_halt;
361
 
362
   assign ctrl_branch_except_pc = (op_rfe | doing_rfe) & !rfete ? spr_epcr :
363
                                  exception_pc_addr;
364
 
365
   // Exceptions take precedence
366
   assign ctrl_branch_occur = // instruction is branch, and flag is right
367
                              (op_jbr_i &
368
                               // is l.j or l.jal
369
                               (!(|ctrl_opc_insn_i[2:1]) |
370
                                // is l.bf/bnf and flag is right
371
                                (ctrl_opc_insn_i[2]==flag))) |
372
                              (op_jr_i & !(except_ibus_align));
373
 
374
   assign ctrl_branch_occur_o = // Usual branch signaling
375
                                ((ctrl_branch_occur | ctrl_branch_exception) &
376
                                fetch_advance) |
377
                                // Need to tell the fetch stage to branch
378
                                // when it gets the next instruction because
379
                                // there was fetch stalls between the branch
380
                                // and the delay slot insn
381
                                (execute_delay_slot);
382
 
383
   assign ctrl_branch_target_o = ctrl_branch_exception ?
384
                                 ctrl_branch_except_pc :
385
                                 // jump or branch?
386
                                 op_jbr_i ? ctrl_alu_result_i :
387
                                 ctrl_rfb_i;
388
 
389
   // Do writeback when we register our output to the next stage, or if
390
   // we're doing mfspr
391
   assign rf_we_o = (execute_done & !delay_slot_rf_we_done) &
392
                    ((rf_wb_i & !op_mfspr
393
                      & !((op_lsu_load_i | op_lsu_store_i) &
394
                          except_dbus_i | except_align_i)) |
395
                     (op_mfspr));
396
 
397
   assign except_range = (FEATURE_RANGE!="NONE") ? spr_sr[`OR1K_SPR_SR_OVE] &&
398
                         (spr_sr[`OR1K_SPR_SR_OV] | overflow_set_i &
399
                          execute_done)  & !doing_rfe : 0;
400
 
401
   // Check for unaligned jump address from register
402
   assign except_ibus_align = op_jr_i & (|ctrl_rfb_i[1:0]);
403
 
404
   // Return from exception to exception (if pending tick or PIC ints)
405
   assign rfete = (spr_esr[`OR1K_SPR_SR_IEE] & except_pic_nonsrmasked) |
406
                  (spr_esr[`OR1K_SPR_SR_TEE] & except_ticktimer_nonsrmasked);
407
 
408
   always @(posedge clk)
409
     if (rst)
410
       exception_pc_addr <= OPTION_RESET_PC;
411
     else if (exception_re | (rfete & execute_done))
412
       casez(
413
             {except_ibus_err_i,
414
              except_illegal_i,
415
              except_align_i,
416
              except_ibus_align,
417
              except_syscall_i,
418
              except_trap_i,
419
              except_dbus_i,
420
              except_range,
421
              except_pic_nonsrmasked,
422
              except_ticktimer_nonsrmasked
423
              }
424
             )
425
         10'b1?????????:
426
           exception_pc_addr <= {19'd0,`OR1K_BERR_VECTOR,8'd0};
427
         10'b01????????:
428
           exception_pc_addr <= {19'd0,`OR1K_ILLEGAL_VECTOR,8'd0};
429
         10'b001???????,
430
           10'b0001??????:
431
             exception_pc_addr <= {19'd0,`OR1K_ALIGN_VECTOR,8'd0};
432
         10'b00001?????:
433
           exception_pc_addr <= {19'd0,`OR1K_SYSCALL_VECTOR,8'd0};
434
         10'b000001????:
435
           exception_pc_addr <= {19'd0,`OR1K_TRAP_VECTOR,8'd0};
436
         10'b0000001???:
437
           exception_pc_addr <= {19'd0,`OR1K_BERR_VECTOR,8'd0};
438
         10'b00000001??:
439
           exception_pc_addr <= {19'd0,`OR1K_RANGE_VECTOR,8'd0};
440
         10'b000000001?:
441
           exception_pc_addr <= {19'd0,`OR1K_INT_VECTOR,8'd0};
442
         //10'b0000000001:
443
         default:
444
           exception_pc_addr <= {19'd0,`OR1K_TT_VECTOR,8'd0};
445
       endcase // casex (...
446
 
447
   assign op_mtspr = ctrl_opc_insn_i==`OR1K_OPCODE_MTSPR;
448
   assign op_mfspr = ctrl_opc_insn_i==`OR1K_OPCODE_MFSPR;
449
   assign op_rfe = ctrl_opc_insn_i==`OR1K_OPCODE_RFE;
450
 
451
   reg                               waiting_for_except_fetch;
452
   always @(posedge clk `OR_ASYNC_RST)
453
     if (rst)
454
       waiting_for_except_fetch <= 0;
455
     else if (waiting_for_except_fetch & next_fetch_done_i)
456
       waiting_for_except_fetch <= 0;
457
     else if (fetch_take_exception_branch_o)
458
       waiting_for_except_fetch <= 1;
459
 
460
   assign fetch_advance = (next_fetch_done_i | except_ibus_err_i) &
461
                          !execute_waiting & !cpu_stall &
462
                          (!stepping |
463
                           (stepping & pstep[0] & !next_fetch_done_i));
464
 
465
   assign padv_fetch_o = fetch_advance & !exception_pending & !doing_rfe_r &
466
                         !cpu_stall;
467
 
468
   always @(posedge clk `OR_ASYNC_RST)
469
     if (rst)
470
       take_exception <= 0;
471
     else
472
       take_exception <= (exception_pending | exception_r | doing_rfe_r) &
473
                         (fetch_advance |
474
                          // Cause exception to always be 'taken' if stepping
475
                          (stepping & execute_done)
476
                          ) &
477
                         // Would like this as only a single pulse
478
                         !take_exception;
479
 
480
   reg                               padv_decode_r;
481
   // Some bits of the pipeline (execute_alu for instance) require a falling
482
   // edge of the decode signal to start work on multi-cycle ops.
483
   always @(posedge clk `OR_ASYNC_RST)
484
     if (rst)
485
       padv_decode_r <= 0;
486
     else
487
       padv_decode_r <= padv_fetch_o;
488
 
489
   assign padv_decode_o = padv_decode_r;
490
 
491
   always @(posedge clk `OR_ASYNC_RST)
492
     if (rst)
493
       execute_go <= 0;
494
     else
495
       execute_go <= padv_fetch_o | execute_waiting |
496
                     (stepping & next_fetch_done_i);
497
 
498
   assign execute_done = execute_go & !execute_waiting;
499
 
500
   // ALU or LSU stall execution, nothing else can
501
   assign execute_valid = !((op_lsu_load_i | op_lsu_store_i) & !lsu_valid_i |
502
                            !alu_valid_i);
503
 
504
   assign execute_waiting = !execute_valid & !waiting_for_fetch;
505
   assign execute_waiting_o = execute_waiting;
506
 
507
 
508
   assign padv_execute_o = execute_done;
509
 
510
   assign spr_addr = du_access ? du_addr_i : ctrl_alu_result_i[15:0];
511
   assign ctrl_mfspr_we_o = op_mfspr & execute_go;
512
 
513
   // Pipeline flush
514
   assign pipeline_flush_o = (execute_done & op_rfe) |
515
                             (exception_re) |
516
                             cpu_stall;
517
 
518
   // Flag
519
   always @(posedge clk `OR_ASYNC_RST)
520
     if (rst)
521
       flag <= 0;
522
     else if (execute_done)
523
       flag <= ctrl_flag_clear_i ? 0 :
524
               ctrl_flag_set_i ? 1 : flag;
525
 
526
   assign flag_o = flag;
527
 
528
   always @(posedge clk `OR_ASYNC_RST)
529
     if (rst)
530
       execute_waiting_r <= 0;
531
     else if (!execute_waiting)
532
       execute_waiting_r <= 0;
533
     else if (execute_waiting)
534
       execute_waiting_r <= 1;
535
 
536
   always @(posedge clk `OR_ASYNC_RST)
537
     if (rst)
538
       decode_execute_halt <= 0;
539
     else if (du_restart_from_stall)
540
       decode_execute_halt <= 0;
541
     else if (decode_execute_halt & deassert_decode_execute_halt)
542
       decode_execute_halt <= 0;
543
     else if ((op_rfe | exception) & !decode_execute_halt & !exception_taken)
544
       decode_execute_halt <= 1;
545
 
546
   always @(posedge clk `OR_ASYNC_RST)
547
     if (rst)
548
       exception_r <= 0;
549
     else if (exception_taken | du_restart_from_stall)
550
       exception_r <= 0;
551
     else if (exception & !exception_r)
552
       exception_r <= 1;
553
 
554
   // Signal to indicate that the incoming exception or l.rfe has been taken
555
   // and we're waiting for it to propagate through the pipeline.
556
   always @(posedge clk `OR_ASYNC_RST)
557
     if (rst)
558
       exception_taken <= 0;
559
     else if (exception_taken)
560
       exception_taken <= 0;
561
     else if (exception_r & take_exception)
562
       exception_taken <= 1;
563
 
564
   assign exception_taken_o = exception_taken;
565
 
566
   always @(posedge clk `OR_ASYNC_RST)
567
     if (rst)
568
       last_branch_insn_pc <= 0;
569
     else if (fetch_advance & ctrl_branch_occur)
570
       last_branch_insn_pc <= spr_ppc;
571
 
572
   always @(posedge clk `OR_ASYNC_RST)
573
     if (rst)
574
       last_branch_target_pc <= 0;
575
     else if (execute_done & ctrl_branch_occur & stepping)
576
       last_branch_target_pc <= ctrl_branch_target_o;
577
 
578
   // Used to gate execute stage's advance signal in the case where a LSU op has
579
   // finished before the next instruction has been fetched. Typically this
580
   // occurs when not using icache and doing lots of memory accesses.
581
   always @(posedge clk `OR_ASYNC_RST)
582
     if (rst)
583
       waiting_for_fetch <= 0;
584
     else if (next_fetch_done_i)
585
       waiting_for_fetch <= 0;
586
     else if (!execute_waiting & execute_waiting_r & !next_fetch_done_i)
587
       waiting_for_fetch <= 1;
588
 
589
   always @(posedge clk `OR_ASYNC_RST)
590
     if (rst)
591
       branched_and_waiting_for_fetch <= 0;
592
     else if (exception_re)
593
       branched_and_waiting_for_fetch <= 0;
594
     else if (padv_fetch_o & ctrl_branch_occur_o)
595
       branched_and_waiting_for_fetch <= 1;
596
     else if (branched_and_waiting_for_fetch)
597
       branched_and_waiting_for_fetch <= !next_fetch_done_i;
598
 
599
 
600
 
601
   assign doing_rfe = ((execute_done & op_rfe) | doing_rfe_r) &
602
                      !deassert_doing_rfe;
603
 
604
   // Basically, the fetch stage should always take the rfe immediately
605
   assign deassert_doing_rfe =  doing_rfe_r;
606
 
607
   always @(posedge clk `OR_ASYNC_RST)
608
     if (rst)
609
       doing_rfe_r <= 0;
610
     else if (deassert_doing_rfe)
611
       doing_rfe_r <= 0;
612
     else if (execute_done)
613
       doing_rfe_r <= op_rfe;
614
 
615
   assign spr_sr_o = spr_sr;
616
 
617
   // Supervision register
618
   always @(posedge clk `OR_ASYNC_RST)
619
     if (rst)
620
       spr_sr <= SPR_SR_RESET_VALUE;
621
     else if (fetch_take_exception_branch_o)
622
       begin
623
          if (op_rfe & !rfete)
624
            begin
625
               spr_sr <= spr_esr;
626
            end
627
          else
628
            begin
629
               // Go into supervisor mode, disable interrupts, MMUs
630
               spr_sr[`OR1K_SPR_SR_SM  ] <= 1'b1;
631
               if (FEATURE_TIMER!="NONE")
632
                 spr_sr[`OR1K_SPR_SR_TEE ] <= 1'b0;
633
               if (FEATURE_PIC!="NONE")
634
                 spr_sr[`OR1K_SPR_SR_IEE ] <= 1'b0;
635
               if (FEATURE_DMMU!="NONE")
636
                 spr_sr[`OR1K_SPR_SR_DME ] <= 1'b0;
637
               if (FEATURE_IMMU!="NONE")
638
                 spr_sr[`OR1K_SPR_SR_IME ] <= 1'b0;
639
               if (FEATURE_OVERFLOW!="NONE")
640
                 spr_sr[`OR1K_SPR_SR_OVE ] <= 1'b0;
641
            end
642
       end
643
     else if (execute_done)
644
       begin
645
          spr_sr[`OR1K_SPR_SR_F   ] <= ctrl_flag_set_i ? 1 :
646
                                       ctrl_flag_clear_i ? 0 :
647
                                       spr_sr[`OR1K_SPR_SR_F   ];
648
          spr_sr[`OR1K_SPR_SR_CY   ] <= carry_set_i ? 1 :
649
                                        carry_clear_i ? 0 :
650
                                        spr_sr[`OR1K_SPR_SR_CY   ];
651
 
652
          if (FEATURE_OVERFLOW!="NONE")
653
            spr_sr[`OR1K_SPR_SR_OV   ] <= overflow_set_i ? 1 :
654
                                overflow_clear_i ? 0 :
655
                                spr_sr[`OR1K_SPR_SR_OV   ];
656
 
657
          if ((spr_we & (spr_sr[`OR1K_SPR_SR_SM] | du_access)) &&
658
              spr_addr==`OR1K_SPR_SR_ADDR)
659
            begin
660
               spr_sr[`OR1K_SPR_SR_SM  ] <= spr_write_dat[`OR1K_SPR_SR_SM  ];
661
 
662
               spr_sr[`OR1K_SPR_SR_F  ] <= spr_write_dat[`OR1K_SPR_SR_F  ];
663
 
664
               if (FEATURE_TIMER!="NONE")
665
                 spr_sr[`OR1K_SPR_SR_TEE ] <= spr_write_dat[`OR1K_SPR_SR_TEE ];
666
 
667
               if (FEATURE_PIC!="NONE")
668
                 spr_sr[`OR1K_SPR_SR_IEE ] <= spr_write_dat[`OR1K_SPR_SR_IEE ];
669
 
670
               if (FEATURE_DATACACHE!="NONE")
671
                 spr_sr[`OR1K_SPR_SR_DCE ] <= spr_write_dat[`OR1K_SPR_SR_DCE ];
672
 
673
               if (FEATURE_INSTRUCTIONCACHE!="NONE")
674
                 spr_sr[`OR1K_SPR_SR_ICE ] <= spr_write_dat[`OR1K_SPR_SR_ICE ];
675
 
676
               if (FEATURE_DMMU!="NONE")
677
                 spr_sr[`OR1K_SPR_SR_DME ] <= spr_write_dat[`OR1K_SPR_SR_DME ];
678
 
679
               if (FEATURE_IMMU!="NONE")
680
                 spr_sr[`OR1K_SPR_SR_IME ] <= spr_write_dat[`OR1K_SPR_SR_IME ];
681
 
682
               if (FEATURE_FASTCONTEXTS!="NONE")
683
                 spr_sr[`OR1K_SPR_SR_CE  ] <= spr_write_dat[`OR1K_SPR_SR_CE  ];
684
 
685
               spr_sr[`OR1K_SPR_SR_CY  ] <= spr_write_dat[`OR1K_SPR_SR_CY  ];
686
 
687
               if (FEATURE_OVERFLOW!="NONE") begin
688
                  spr_sr[`OR1K_SPR_SR_OV  ] <= spr_write_dat[`OR1K_SPR_SR_OV  ];
689
                  spr_sr[`OR1K_SPR_SR_OVE ] <= spr_write_dat[`OR1K_SPR_SR_OVE ];
690
               end
691
 
692
               if (FEATURE_DSX!="NONE")
693
                 spr_sr[`OR1K_SPR_SR_DSX ] <= spr_write_dat[`OR1K_SPR_SR_DSX ];
694
 
695
               spr_sr[`OR1K_SPR_SR_EPH ] <= spr_write_dat[`OR1K_SPR_SR_EPH ];
696
 
697
            end // if ((spr_we & (spr_sr[`OR1K_SPR_SR_SM] | du_access)) &&...
698
 
699
          /* Need to check for DSX being set on exception entry on execute_done
700
           as the delay slot information is gone after it goes high */
701
          if (FEATURE_DSX!="NONE")
702
            if (exception_r || exception_re)
703
              spr_sr[`OR1K_SPR_SR_DSX ] <= execute_delay_slot;
704
 
705
       end // if (execute_done)
706
 
707
   assign carry_o = spr_sr[`OR1K_SPR_SR_CY];
708
 
709
   // Exception SR
710
   always @(posedge clk `OR_ASYNC_RST)
711
     if (rst)
712
       spr_esr <= SPR_SR_RESET_VALUE;
713
     else if (exception_re)
714
       begin
715
          spr_esr <= spr_sr;
716
          /*
717
           A bit odd, but if we had a l.sf instruction on an exception rising
718
           edge, EPCR will point to the insn past the l.sf but the flag will
719
           not have been saved to the SR properly. So we must put it in here
720
           so it can be restored correctly.
721
           Ditto for the other flags which may have been changed in a similar
722
           fashion.
723
           */
724
          if (execute_done)
725
            begin
726
               if (ctrl_flag_set_i)
727
                 spr_esr[`OR1K_SPR_SR_F   ] <= 1'b1;
728
               else if (ctrl_flag_clear_i)
729
                 spr_esr[`OR1K_SPR_SR_F   ] <= 1'b0;
730
               if (FEATURE_OVERFLOW!="NONE")
731
                 begin
732
                    if (overflow_set_i)
733
                      spr_esr[`OR1K_SPR_SR_OV   ] <= 1'b1;
734
                    else if (overflow_clear_i)
735
                      spr_esr[`OR1K_SPR_SR_OV   ] <= 1'b0;
736
                 end
737
               if (carry_set_i)
738
                 spr_esr[`OR1K_SPR_SR_CY   ] <= 1'b1;
739
               else if (carry_clear_i)
740
                 spr_esr[`OR1K_SPR_SR_CY   ] <= 1'b0;
741
            end
742
       end
743
     else if (spr_we & spr_addr==`OR1K_SPR_ESR0_ADDR)
744
       spr_esr <= spr_write_dat[SPR_SR_WIDTH-1:0];
745
 
746
   // Exception PC
747
   always @(posedge clk `OR_ASYNC_RST)
748
     if (rst)
749
       spr_epcr <= OPTION_RESET_PC;
750
     else if (exception_re & !(rfete & (op_rfe | deassert_doing_rfe)))
751
       begin
752
          if (except_ibus_err_i)
753
            spr_epcr <= spr_ppc-4;
754
          else if (except_syscall_i)
755
            // EPCR after syscall is address of next not executed insn.
756
            spr_epcr <= spr_npc;
757
          else if (except_ticktimer | except_pic)
758
            spr_epcr <= branched_and_waiting_for_fetch ? spr_npc :
759
                        execute_delay_slot ? spr_ppc-4 : spr_ppc+4;
760
          else if (execute_stage_exceptions |
761
                   // Don't update EPCR on software breakpoint
762
                   (decode_stage_exceptions & !(stall_on_trap & except_trap_i)))
763
            spr_epcr <= execute_delay_slot ? spr_ppc-4 : spr_ppc;
764
          else if (!(stall_on_trap & except_trap_i))
765
            spr_epcr <= execute_delay_slot ? spr_ppc-4 : spr_ppc;
766
       end
767
     else if (spr_we && spr_addr==`OR1K_SPR_EPCR0_ADDR)
768
       spr_epcr <= spr_write_dat;
769
 
770
   // Exception Effective Address
771
   always @(posedge clk `OR_ASYNC_RST)
772
     if (rst)
773
       spr_eear <= {OPTION_OPERAND_WIDTH{1'b0}};
774
     else if (exception_re)
775
       begin
776
          if (except_ibus_err_i)
777
            spr_eear <= pc_fetch_i;
778
          else
779
            spr_eear <= ctrl_alu_result_i;
780
       end
781
 
782
   // Next PC (NPC)
783
   always @(posedge clk `OR_ASYNC_RST)
784
     if (rst)
785
       spr_npc <= OPTION_RESET_PC;
786
     else if (deassert_doing_rfe)
787
       spr_npc <= rfete ? exception_pc_addr : spr_epcr;
788
     else if (du_restart_o)
789
       spr_npc <= du_restart_pc_o;
790
     else if (stepping & next_fetch_done_i)
791
       spr_npc <= execute_delay_slot ? last_branch_target_pc : pc_fetch_i;
792
     else if (stepping & exception_r)
793
       spr_npc <= exception_pc_addr;
794
     else if (fetch_advance)
795
       // PC we're now executing
796
       spr_npc <= fetch_take_exception_branch_o ? exception_pc_addr :
797
                  ctrl_branch_occur ? ctrl_branch_target_o : pc_fetch_i;
798
 
799
   // Previous PC (PPC)
800
   always @(posedge clk `OR_ASYNC_RST)
801
     if (rst)
802
       spr_ppc <= OPTION_RESET_PC;
803
     else if (padv_fetch_o | (stepping & next_fetch_done_i))
804
       spr_ppc <= spr_npc; // PC we've got in execute stage (about to finish)
805
 
806
   assign spr_npc_o = spr_npc;
807
   assign spr_ppc_o = spr_ppc;
808
 
809
   // Remember when we're in a delay slot in execute stage.
810
   always @(posedge clk `OR_ASYNC_RST)
811
     if (rst)
812
        execute_delay_slot <= 0;
813
     else if (execute_done)
814
       execute_delay_slot <= execute_delay_slot ? 0 :
815
                             ctrl_branch_occur;
816
 
817
   always @(posedge clk `OR_ASYNC_RST)
818
     if (rst)
819
       delay_slot_rf_we_done <= 0;
820
     else
821
       delay_slot_rf_we_done <= rf_we_o & execute_delay_slot;
822
 
823
   mor1kx_cfgrs
824
     #(.FEATURE_PIC                     (FEATURE_PIC),
825
       .FEATURE_TIMER                   (FEATURE_TIMER),
826
       .OPTION_PIC_TRIGGER              (OPTION_PIC_TRIGGER),
827
       .FEATURE_DSX                     (FEATURE_DSX),
828
       .FEATURE_FASTCONTEXTS            (FEATURE_FASTCONTEXTS),
829
       .FEATURE_OVERFLOW                (FEATURE_OVERFLOW),
830
       .FEATURE_DATACACHE               (FEATURE_DATACACHE),
831
       .OPTION_DCACHE_BLOCK_WIDTH       (OPTION_DCACHE_BLOCK_WIDTH),
832
       .OPTION_DCACHE_SET_WIDTH         (OPTION_DCACHE_SET_WIDTH),
833
       .OPTION_DCACHE_WAYS              (OPTION_DCACHE_WAYS),
834
       .FEATURE_DMMU                    (FEATURE_DMMU),
835
       .FEATURE_INSTRUCTIONCACHE        (FEATURE_INSTRUCTIONCACHE),
836
       .OPTION_ICACHE_BLOCK_WIDTH       (OPTION_ICACHE_BLOCK_WIDTH),
837
       .OPTION_ICACHE_SET_WIDTH         (OPTION_ICACHE_SET_WIDTH),
838
       .OPTION_ICACHE_WAYS              (OPTION_ICACHE_WAYS),
839
       .FEATURE_IMMU                    (FEATURE_IMMU),
840
       .FEATURE_DEBUGUNIT               (FEATURE_DEBUGUNIT),
841
       .FEATURE_PERFCOUNTERS            (FEATURE_PERFCOUNTERS),
842
       .FEATURE_MAC                     (FEATURE_MAC),
843
       .FEATURE_SYSCALL                 (FEATURE_SYSCALL),
844
       .FEATURE_TRAP                    (FEATURE_TRAP),
845
       .FEATURE_RANGE                   (FEATURE_RANGE),
846
       .FEATURE_DELAYSLOT               ("ENABLED")
847
       )
848
   mor1kx_cfgrs
849
     (/*AUTOINST*/
850
      // Outputs
851
      .spr_vr                           (spr_vr[31:0]),
852
      .spr_vr2                          (spr_vr2[31:0]),
853
      .spr_upr                          (spr_upr[31:0]),
854
      .spr_cpucfgr                      (spr_cpucfgr[31:0]),
855
      .spr_dmmucfgr                     (spr_dmmucfgr[31:0]),
856
      .spr_immucfgr                     (spr_immucfgr[31:0]),
857
      .spr_dccfgr                       (spr_dccfgr[31:0]),
858
      .spr_iccfgr                       (spr_iccfgr[31:0]),
859
      .spr_dcfgr                        (spr_dcfgr[31:0]),
860
      .spr_pccfgr                       (spr_pccfgr[31:0]),
861
      .spr_fpcsr                        (spr_fpcsr[31:0]),
862
      .spr_avr                          (spr_avr[31:0]));
863
 
864
   /* Implementation-specific registers */
865
   assign spr_isr[0] = 0;
866
   assign spr_isr[1] = 0;
867
   assign spr_isr[2] = 0;
868
   assign spr_isr[3] = 0;
869
   assign spr_isr[4] = 0;
870
   assign spr_isr[5] = 0;
871
   assign spr_isr[6] = 0;
872
   assign spr_isr[7] = 0;
873
 
874
   // System group (0) SPR data out
875
   always @*
876
     case(spr_addr)
877
       `OR1K_SPR_VR_ADDR:
878
         spr_sys_group_read = spr_vr;
879
       `OR1K_SPR_VR2_ADDR:
880
         spr_sys_group_read = {spr_vr2[31:8], `MOR1KX_PIPEID_ESPRESSO};
881
       `OR1K_SPR_AVR_ADDR:
882
         spr_sys_group_read = spr_avr;
883
       `OR1K_SPR_UPR_ADDR:
884
         spr_sys_group_read = spr_upr;
885
       `OR1K_SPR_CPUCFGR_ADDR:
886
         spr_sys_group_read = spr_cpucfgr;
887
       `OR1K_SPR_DMMUCFGR_ADDR:
888
         spr_sys_group_read = spr_dmmucfgr;
889
       `OR1K_SPR_IMMUCFGR_ADDR:
890
         spr_sys_group_read = spr_immucfgr;
891
       `OR1K_SPR_DCCFGR_ADDR:
892
         spr_sys_group_read = spr_dccfgr;
893
       `OR1K_SPR_ICCFGR_ADDR:
894
         spr_sys_group_read = spr_iccfgr;
895
       `OR1K_SPR_DCFGR_ADDR:
896
         spr_sys_group_read = spr_dcfgr;
897
       `OR1K_SPR_PCCFGR_ADDR:
898
         spr_sys_group_read = spr_pccfgr;
899
       `OR1K_SPR_NPC_ADDR:
900
         spr_sys_group_read = spr_npc;
901
       `OR1K_SPR_SR_ADDR:
902
         spr_sys_group_read = {{(OPTION_OPERAND_WIDTH-SPR_SR_WIDTH){1'b0}},
903
                               spr_sr};
904
 
905
       `OR1K_SPR_PPC_ADDR:
906
         spr_sys_group_read = spr_ppc;
907
       `OR1K_SPR_FPCSR_ADDR:
908
         spr_sys_group_read = spr_fpcsr;
909
       `OR1K_SPR_EPCR0_ADDR:
910
         spr_sys_group_read = spr_epcr;
911
       `OR1K_SPR_EEAR0_ADDR:
912
         spr_sys_group_read = spr_eear;
913
       `OR1K_SPR_ESR0_ADDR:
914
         spr_sys_group_read = {{(OPTION_OPERAND_WIDTH-SPR_SR_WIDTH){1'b0}},
915
                               spr_esr};
916
       `OR1K_SPR_ISR0_ADDR:
917
         spr_sys_group_read = spr_isr[0];
918
       `OR1K_SPR_ISR0_ADDR +1:
919
         spr_sys_group_read = spr_isr[1];
920
       `OR1K_SPR_ISR0_ADDR +2:
921
         spr_sys_group_read = spr_isr[2];
922
       `OR1K_SPR_ISR0_ADDR +3:
923
         spr_sys_group_read = spr_isr[3];
924
       `OR1K_SPR_ISR0_ADDR +4:
925
         spr_sys_group_read = spr_isr[4];
926
       `OR1K_SPR_ISR0_ADDR +5:
927
         spr_sys_group_read = spr_isr[5];
928
       `OR1K_SPR_ISR0_ADDR +6:
929
         spr_sys_group_read = spr_isr[6];
930
       `OR1K_SPR_ISR0_ADDR +7:
931
         spr_sys_group_read = spr_isr[7];
932
 
933
       `OR1K_SPR_COREID_ADDR:
934
         // If the multicore feature is activated this address returns the
935
         // core identifier, 0 otherwise
936
         spr_sys_group_read = (FEATURE_MULTICORE != "NONE") ?
937
                              multicore_coreid_i : 0;
938
 
939
       default: begin
940
          /* GPR read */
941
          if (spr_addr >= `OR1K_SPR_GPR0_ADDR &&
942
              spr_addr <= (`OR1K_SPR_GPR0_ADDR + 32))
943
            spr_sys_group_read = b; /* Register file */
944
          else
945
            /* Invalid address - read as zero*/
946
            spr_sys_group_read = 0;
947
       end
948
     endcase // case (spr_addr)
949
 
950
   /* System group read data MUX in */
951
   assign spr_internal_read_dat[0] = spr_sys_group_read;
952
   /* System group ack generation */
953
   /* TODO - might be delay for register file reads! */
954
   assign spr_access_ack[0] = 1;
955
 
956
 
957
 
958
   /* Generate data to the register file for mfspr operations */
959
   assign mfspr_dat_o = spr_internal_read_dat[spr_addr[14:11]];
960
 
961
   // PIC SPR control
962
   generate
963
      if (FEATURE_PIC !="NONE") begin : pic
964
 
965
         /* mor1kx_pic AUTO_TEMPLATE (
966
          .spr_picsr_o          (spr_picsr),
967
          .spr_picmr_o          (spr_picmr),
968
          .spr_bus_ack          (spr_access_ack[9]),
969
          .spr_dat_o            (spr_internal_read_dat[9]),
970
          // Inputs
971
          .spr_we_i             (spr_we),
972
          .spr_addr_i           (spr_addr),
973
          .spr_dat_i            (spr_write_dat),
974
          );*/
975
         mor1kx_pic
976
          #(
977
            .OPTION_PIC_TRIGGER(OPTION_PIC_TRIGGER),
978
            .OPTION_PIC_NMI_WIDTH(OPTION_PIC_NMI_WIDTH)
979
            )
980
         mor1kx_pic
981
           (/*AUTOINST*/
982
            // Outputs
983
            .spr_picmr_o                (spr_picmr),             // Templated
984
            .spr_picsr_o                (spr_picsr),             // Templated
985
            .spr_bus_ack                (spr_access_ack[9]),     // Templated
986
            .spr_dat_o                  (spr_internal_read_dat[9]), // Templated
987
            // Inputs
988
            .clk                        (clk),
989
            .rst                        (rst),
990
            .irq_i                      (irq_i[31:0]),
991
            .spr_we_i                   (spr_we),                // Templated
992
            .spr_addr_i                 (spr_addr),              // Templated
993
            .spr_dat_i                  (spr_write_dat));        // Templated
994
 
995
         assign except_pic_nonsrmasked = (|spr_picsr) &
996
                             !op_mtspr &
997
                             // Stops back-to-back branch addresses going to
998
                             // fetch stage
999
                             !ctrl_branch_occur &
1000
                             // Stops issues with PC when branching
1001
                             !execute_delay_slot;
1002
 
1003
         assign except_pic = spr_sr[`OR1K_SPR_SR_IEE] & except_pic_nonsrmasked &
1004
                             !doing_rfe;
1005
      end
1006
      else begin
1007
         assign except_pic_nonsrmasked = 0;
1008
         assign except_pic = 0;
1009
         assign spr_picsr = 0;
1010
         assign spr_picmr = 0;
1011
         assign spr_access_ack[9] = 0;
1012
         assign spr_internal_read_dat[9] = 0;
1013
      end // else: !if(FEATURE_PIC !="NONE")
1014
   endgenerate
1015
 
1016
 
1017
   generate
1018
      if (FEATURE_TIMER!="NONE") begin : tt
1019
 
1020
         /* mor1kx_ticktimer AUTO_TEMPLATE (
1021
          .spr_ttmr_o           (spr_ttmr),
1022
          .spr_ttcr_o           (spr_ttcr),
1023
          .spr_bus_ack          (spr_access_ack[10]),
1024
          .spr_dat_o            (spr_internal_read_dat[10]),
1025
          // Inputs
1026
          .spr_we_i             (spr_we),
1027
          .spr_addr_i           (spr_addr),
1028
          .spr_dat_i            (spr_write_dat),
1029
          );*/
1030
         mor1kx_ticktimer mor1kx_ticktimer
1031
                         (/*AUTOINST*/
1032
                          // Outputs
1033
                          .spr_ttmr_o           (spr_ttmr),      // Templated
1034
                          .spr_ttcr_o           (spr_ttcr),      // Templated
1035
                          .spr_bus_ack          (spr_access_ack[10]), // Templated
1036
                          .spr_dat_o            (spr_internal_read_dat[10]), // Templated
1037
                          // Inputs
1038
                          .clk                  (clk),
1039
                          .rst                  (rst),
1040
                          .spr_we_i             (spr_we),        // Templated
1041
                          .spr_addr_i           (spr_addr),      // Templated
1042
                          .spr_dat_i            (spr_write_dat)); // Templated
1043
 
1044
         assign except_ticktimer_nonsrmasked = spr_ttmr[28] &
1045
                                   (!op_mtspr & !(spr_esr[`OR1K_SPR_SR_TEE] & execute_done)) &
1046
                                   // Stops back-to-back branch addresses to
1047
                                   // fetch stage.
1048
                                   !ctrl_branch_occur &
1049
                                   // Stops issues with PC when branching
1050
                                   !execute_delay_slot;
1051
 
1052
         assign except_ticktimer = except_ticktimer_nonsrmasked &
1053
                                   spr_sr[`OR1K_SPR_SR_TEE] & !doing_rfe;
1054
      end // if (FEATURE_TIMER!="NONE")
1055
      else begin
1056
         assign except_ticktimer_nonsrmasked = 0;
1057
         assign except_ticktimer = 0;
1058
         assign spr_ttmr = 0;
1059
         assign spr_ttcr = 0;
1060
         assign spr_access_ack[10] = 0;
1061
         assign spr_internal_read_dat[10] = 0;
1062
      end // else: !if(FEATURE_TIMER!="NONE")
1063
   endgenerate
1064
 
1065
   /* SPR access control - allow accesses from either the instructions or from
1066
    the debug interface */
1067
   assign spr_read_access = (op_mfspr | (du_access & !du_we_i));
1068
   assign spr_write_access = ((execute_done & op_mtspr) | (du_access & du_we_i));
1069
 
1070
   assign spr_write_dat = du_access ? du_dat_i : b;
1071
   assign spr_we = spr_write_access & spr_group_present;
1072
   assign spr_read = spr_read_access & spr_group_present;
1073
 
1074
   /* A bus out to other units that live outside of the control unit */
1075
   assign spr_bus_addr_o = spr_addr;
1076
   assign spr_bus_we_o = spr_write_access & spr_group_present & spr_bus_access;
1077
   assign spr_bus_stb_o = (spr_read_access | spr_write_access) &
1078
                          spr_group_present & spr_bus_access;
1079
   assign spr_bus_dat_o = spr_write_dat;
1080
 
1081
   /* Is the SPR in the design? */
1082
   assign spr_group_present = (// System group
1083
                               (spr_addr[15:11]==5'h00) ||
1084
                               // DMMU
1085
                               (spr_addr[15:11]==5'h01 &&
1086
                                FEATURE_DMMU!="NONE") ||
1087
                               // IMMU
1088
                               (spr_addr[15:11]==5'h02 &&
1089
                                FEATURE_IMMU!="NONE") ||
1090
                               // Data cache
1091
                               (spr_addr[15:11]==5'h03 &&
1092
                                FEATURE_DATACACHE!="NONE") ||
1093
                               // Instruction cache
1094
                               (spr_addr[15:11]==5'h04 &&
1095
                                FEATURE_INSTRUCTIONCACHE!= "NONE") ||
1096
                               // MAC unit
1097
                               (spr_addr[15:11]==5'h05 &&
1098
                                FEATURE_MAC!="NONE") ||
1099
                               // Debug unit
1100
                               (spr_addr[15:11]==5'h06 &&
1101
                                FEATURE_DEBUGUNIT!="NONE") ||
1102
                               // Performance counters
1103
                               (spr_addr[15:11]==5'h07 &&
1104
                                FEATURE_PERFCOUNTERS!="NONE") ||
1105
                               // Power Management
1106
                               (spr_addr[15:11]==5'h08 &&
1107
                                FEATURE_PMU!="NONE") ||
1108
                               // PIC
1109
                               (spr_addr[15:11]==5'h09 &&
1110
                                FEATURE_PIC!="NONE") ||
1111
                               // Tick timer
1112
                               (spr_addr[15:11]==5'h0a &&
1113
                                FEATURE_TIMER!="NONE") ||
1114
                               // FPU
1115
                               (spr_addr[15:11]==5'h0b &&
1116
                                FEATURE_FPU!="NONE")
1117
                               );
1118
 
1119
   /* Generate a SPR group signal - generate invalid if the group is not
1120
    present in the design */
1121
   assign spr_group = (spr_group_present) ? spr_addr[14:11] : 4'd12;
1122
 
1123
   /* Default group when a selected one is not present - it reads as zero */
1124
   assign spr_internal_read_dat[12] = 0;
1125
 
1126
   /* Is a SPR bus access needed, or is the requested SPR in this file? */
1127
   assign spr_bus_access = /* Any of the units we don't have in this file */
1128
                           /* System group */
1129
                           !(spr_addr[15:11]==5'h00 ||
1130
                             /* Debug Group */
1131
                             spr_addr[15:11]==5'h06 ||
1132
                             /* PIC Group */
1133
                             spr_addr[15:11]==5'h09 ||
1134
                             /* Tick Group */
1135
                             spr_addr[15:11]==5'h0a);
1136
 
1137
   assign stepping_o = stepping;
1138
 
1139
   generate
1140
      if (FEATURE_DEBUGUNIT!="NONE") begin : du
1141
 
1142
         reg [OPTION_OPERAND_WIDTH-1:0] du_read_dat;
1143
 
1144
         reg                            du_ack;
1145
         reg                            du_stall_r;
1146
         reg [1:0]                      pstep_r;
1147
         reg [1:0]                      branch_step;
1148
         reg                            stepped_into_exception;
1149
         reg                            stepped_into_rfe;
1150
 
1151
         assign du_access = du_stb_i;
1152
 
1153
         // Generate ack back to the debug interface bus
1154
         always @(posedge clk `OR_ASYNC_RST)
1155
           if (rst)
1156
             du_ack <= 0;
1157
           else if (du_ack)
1158
             du_ack <= 0;
1159
           else if (du_stb_i) begin
1160
              if (!spr_group_present)
1161
                /* Unit doesn't exist, ACK to clear the access, nothing done */
1162
                du_ack <= 1;
1163
              else if (spr_access_ack[spr_group])
1164
                /* actual access occurred */
1165
                du_ack <= 1;
1166
           end
1167
 
1168
         assign du_ack_o = du_ack;
1169
 
1170
         /* Data back to the debug bus */
1171
         always @(posedge clk `OR_ASYNC_RST)
1172
           if (rst)
1173
             du_read_dat <= 0;
1174
           else if (spr_access_ack[spr_group]) begin
1175
              du_read_dat <= spr_internal_read_dat[spr_group];
1176
           end
1177
 
1178
         assign du_dat_o = du_read_dat;
1179
         /* TODO: check into only letting stall go high when we've gracefully
1180
          completed the instruction currently in the ctrl stage.
1181
          Why? Potentially an instruction like l.mfspr from an external unit
1182
          hasn't completed fully, gets interrupted, and it's assumed it's
1183
          completed, but actually hasn't. */
1184
         assign cpu_stall = du_stall_i | du_restart_from_stall;
1185
 
1186
         /* goes out to the debug interface and comes back 1 cycle later
1187
          via du_stall_i */
1188
         assign du_stall_o = (stepping & execute_done)|
1189
                             (stall_on_trap & execute_done & except_trap_i);
1190
 
1191
         /* Pulse to indicate we're restarting after a stall */
1192
         assign du_restart_from_stall = du_stall_r & !du_stall_i;
1193
 
1194
         /* NPC debug control logic */
1195
         assign du_npc_write = (du_we_i && du_addr_i==`OR1K_SPR_NPC_ADDR &&
1196
                                du_ack_o);
1197
 
1198
         /* Pick the traps-cause-stall bit out of the DSR */
1199
         assign stall_on_trap = spr_dsr[`OR1K_SPR_DSR_TE];
1200
 
1201
         /* record if NPC was written while we were stalled.
1202
          If so, we will use this value for restarting */
1203
         always @(posedge clk `OR_ASYNC_RST)
1204
           if (rst)
1205
             du_npc_written <= 0;
1206
           else if (du_restart_from_stall)
1207
             du_npc_written <= 0;
1208
           else if (du_npc_write)
1209
             du_npc_written <= 1;
1210
 
1211
         always @(posedge clk `OR_ASYNC_RST)
1212
           if (rst)
1213
             du_spr_npc <= 0;
1214
           else if (du_npc_write)
1215
             du_spr_npc <= du_dat_i;
1216
 
1217
         always @(posedge clk `OR_ASYNC_RST)
1218
           if (rst)
1219
             stepped_into_exception <= 0;
1220
           else if (du_restart_from_stall)
1221
             stepped_into_exception <= 0;
1222
           else if (stepping & execute_done)
1223
             stepped_into_exception <= exception;
1224
 
1225
         always @(posedge clk `OR_ASYNC_RST)
1226
           if (rst)
1227
             stepped_into_rfe <= 0;
1228
           else if (du_restart_from_stall)
1229
             stepped_into_rfe <= 0;
1230
           else if (stepping & execute_done)
1231
             stepped_into_rfe <= op_rfe;
1232
 
1233
         assign du_restart_pc_o = du_npc_written ? du_spr_npc :
1234
                                  stepped_into_rfe ? spr_epcr :
1235
                                  stepped_into_delay_slot ?
1236
                                  last_branch_target_pc : spr_npc;
1237
 
1238
         assign du_restart_o = du_restart_from_stall;
1239
 
1240
         /* Indicate when we're stepping */
1241
         assign stepping = spr_dmr1[`OR1K_SPR_DMR1_ST] &
1242
                           spr_dsr[`OR1K_SPR_DSR_TE];
1243
 
1244
         always @(posedge clk `OR_ASYNC_RST)
1245
           if (rst)
1246
             pstep_r <= 0;
1247
           else if (du_restart_from_stall & stepping)
1248
             pstep_r <= 2'd1;
1249
           else if ((pstep[0] & next_fetch_done_i) |
1250
                    /* decode is always single cycle */
1251
                    (pstep[1] & execute_done))
1252
             pstep_r <= {pstep_r[0],1'b0};
1253
 
1254
         assign pstep = pstep_r;
1255
 
1256
         always @(posedge clk `OR_ASYNC_RST)
1257
           if (rst)
1258
             branch_step <= 0;
1259
           else if (stepping & pstep[1])
1260
             branch_step <= {branch_step[0], ctrl_branch_occur};
1261
           else if (!stepping & execute_done)
1262
             branch_step <= {branch_step[0], execute_delay_slot};
1263
 
1264
         assign stepped_into_delay_slot = branch_step[1];
1265
 
1266
         /* Signals for waveform debuging */
1267
         wire [31:0] spr_read_data_group_0;
1268
         assign spr_read_data_group_0 = spr_internal_read_dat[0];
1269
         wire [31:0] spr_read_data_group_1;
1270
         assign spr_read_data_group_1 = spr_internal_read_dat[1];
1271
         wire [31:0] spr_read_data_group_2;
1272
         assign spr_read_data_group_2 = spr_internal_read_dat[2];
1273
         wire [31:0] spr_read_data_group_3;
1274
         assign spr_read_data_group_3 = spr_internal_read_dat[3];
1275
         wire [31:0] spr_read_data_group_4;
1276
         assign spr_read_data_group_4 = spr_internal_read_dat[4];
1277
         wire [31:0] spr_read_data_group_5;
1278
         assign spr_read_data_group_5 = spr_internal_read_dat[5];
1279
         wire [31:0] spr_read_data_group_6;
1280
         assign spr_read_data_group_6 = spr_internal_read_dat[6];
1281
         wire [31:0] spr_read_data_group_7;
1282
         assign spr_read_data_group_7 = spr_internal_read_dat[7];
1283
         wire [31:0] spr_read_data_group_8;
1284
         assign spr_read_data_group_8 = spr_internal_read_dat[8];
1285
         wire [31:0] spr_read_data_group_9;
1286
         assign spr_read_data_group_9 = spr_internal_read_dat[9];
1287
 
1288
 
1289
         /* always single cycle access */
1290
         assign spr_access_ack[6] = 1;
1291
         assign spr_internal_read_dat[6] = (spr_addr==`OR1K_SPR_DMR1_ADDR) ?
1292
                                           spr_dmr1 :
1293
                                           (spr_addr==`OR1K_SPR_DMR2_ADDR) ?
1294
                                           spr_dmr2 :
1295
                                           (spr_addr==`OR1K_SPR_DSR_ADDR) ?
1296
                                           spr_dsr :
1297
                                           (spr_addr==`OR1K_SPR_DRR_ADDR) ?
1298
                                           spr_drr : 0;
1299
 
1300
         /* Put the incoming stall signal through a register to detect FE */
1301
         always @(posedge clk `OR_ASYNC_RST)
1302
           if (rst)
1303
             du_stall_r <= 0;
1304
           else
1305
             du_stall_r <= du_stall_i;
1306
 
1307
         /* DMR1 */
1308
         always @(posedge clk `OR_ASYNC_RST)
1309
           if (rst)
1310
             spr_dmr1 <= 0;
1311
           else if (spr_we && spr_addr==`OR1K_SPR_DMR1_ADDR)
1312
             spr_dmr1[23:0] <= spr_write_dat[23:0];
1313
 
1314
         /* DMR2 */
1315
         always @(posedge clk)
1316
           spr_dmr2 <= 0;
1317
 
1318
         /* DSR */
1319
         always @(posedge clk `OR_ASYNC_RST)
1320
           if (rst)
1321
             spr_dsr <= 0;
1322
           else if (spr_we && spr_addr==`OR1K_SPR_DSR_ADDR)
1323
             spr_dsr[13:0] <= spr_write_dat[13:0];
1324
 
1325
         /* DRR */
1326
         always @(posedge clk `OR_ASYNC_RST)
1327
           if (rst)
1328
             spr_drr <= 0;
1329
           else if (spr_we && spr_addr==`OR1K_SPR_DRR_ADDR)
1330
             spr_drr[13:0] <= spr_write_dat[13:0];
1331
           else if (stall_on_trap & execute_done & except_trap_i)
1332
             spr_drr[`OR1K_SPR_DRR_TE] <= 1;
1333
 
1334
      end // block: du
1335
      else
1336
        begin : no_du
1337
           assign du_access = 0;
1338
           assign cpu_stall = 0;
1339
           assign du_stall_o = 0;
1340
           assign du_ack_o = 0;
1341
           assign du_restart_o = 0;
1342
           assign du_restart_pc_o = 0;
1343
           assign stepping = 0;
1344
           assign du_npc_write = 0;
1345
           assign stepped_into_delay_slot = 0;
1346
           assign du_dat_o = 0;
1347
           assign du_restart_from_stall = 0;
1348
           assign spr_access_ack[6] = 0;
1349
 
1350
           always @(posedge clk)
1351
             begin
1352
                spr_dmr1 <= 0;
1353
                spr_dmr2 <= 0;
1354
                spr_dsr <= 0;
1355
                spr_drr <= 0;
1356
                du_npc_written <= 0;
1357
             end
1358
        end
1359
   endgenerate
1360
 
1361
   /* Controls to generate ACKs from units that are external to this module */
1362
   generate
1363
      if (FEATURE_DMMU!="NONE") begin : dmmu_ctrl
1364
         assign spr_access_ack[1] = spr_bus_ack_dmmu_i;
1365
         assign spr_internal_read_dat[1] = spr_bus_dat_dmmu_i;
1366
      end
1367
      else begin
1368
         assign spr_access_ack[1] = 0;
1369
         assign spr_internal_read_dat[1] = 0;
1370
      end
1371
   endgenerate
1372
 
1373
   generate
1374
      if (FEATURE_IMMU!="NONE") begin : immu_ctrl
1375
         assign spr_access_ack[2] = spr_bus_ack_immu_i;
1376
         assign spr_internal_read_dat[2] = spr_bus_dat_immu_i;
1377
      end
1378
      else begin
1379
         assign spr_access_ack[2] = 0;
1380
         assign spr_internal_read_dat[2] = 0;
1381
      end
1382
   endgenerate
1383
 
1384
   generate
1385
      if (FEATURE_DATACACHE!="NONE") begin : datacache_ctrl
1386
         assign spr_access_ack[3] = spr_bus_ack_dc_i;
1387
         assign spr_internal_read_dat[3] = spr_bus_dat_dc_i;
1388
      end
1389
      else begin
1390
         assign spr_access_ack[3] = 0;
1391
         assign spr_internal_read_dat[3] = 0;
1392
      end
1393
   endgenerate
1394
 
1395
   generate
1396
      if (FEATURE_INSTRUCTIONCACHE!="NONE") begin : instructioncache_ctrl
1397
         assign spr_access_ack[4] = spr_bus_ack_ic_i;
1398
         assign spr_internal_read_dat[4] = spr_bus_dat_ic_i;
1399
      end
1400
      else begin
1401
         assign spr_access_ack[4] = 0;
1402
         assign spr_internal_read_dat[4] = 0;
1403
      end
1404
   endgenerate
1405
 
1406
   generate
1407
      if (FEATURE_MAC!="NONE") begin : mac_ctrl
1408
         assign spr_access_ack[5] = spr_bus_ack_mac_i;
1409
         assign spr_internal_read_dat[5] = spr_bus_dat_mac_i;
1410
      end
1411
      else begin
1412
         assign spr_access_ack[5] = 0;
1413
         assign spr_internal_read_dat[5] = 0;
1414
      end
1415
   endgenerate
1416
 
1417
   generate
1418
      if (FEATURE_PERFCOUNTERS!="NONE") begin : perfcounters_ctrl
1419
         assign spr_access_ack[7] = spr_bus_ack_pcu_i;
1420
         assign spr_internal_read_dat[7] = spr_bus_dat_pcu_i;
1421
      end
1422
      else begin
1423
         assign spr_access_ack[7] = 0;
1424
         assign spr_internal_read_dat[7] = 0;
1425
      end
1426
   endgenerate
1427
 
1428
   generate
1429
      if (FEATURE_PMU!="NONE") begin : pmu_ctrl
1430
         assign spr_access_ack[8] = spr_bus_ack_pmu_i;
1431
         assign spr_internal_read_dat[8] = spr_bus_dat_pcu_i;
1432
      end
1433
      else begin
1434
         assign spr_access_ack[8] = 0;
1435
         assign spr_internal_read_dat[8] = 0;
1436
      end
1437
   endgenerate
1438
 
1439
   generate
1440
      if (FEATURE_FPU!="NONE") begin : fpu_ctrl
1441
         assign spr_access_ack[11] = spr_bus_ack_fpu_i;
1442
         assign spr_internal_read_dat[11] = spr_bus_dat_fpu_i;
1443
      end
1444
      else begin
1445
         assign spr_access_ack[11] = 0;
1446
         assign spr_internal_read_dat[11] = 0;
1447
      end
1448
   endgenerate
1449
 
1450
endmodule // mor1kx_ctrl_espresso

powered by: WebSVN 2.1.0

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