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_ctrl_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: mor1kx 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 Julius Baxter <juliusbaxter@gmail.com>
23
  Copyright (C) 2012-2013 Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
24
 
25
***************************************************************************** */
26
 
27
`include "mor1kx-defines.v"
28
 
29
module mor1kx_ctrl_cappuccino
30
  #(
31
    parameter OPTION_OPERAND_WIDTH = 32,
32
    parameter OPTION_RESET_PC = {{(OPTION_OPERAND_WIDTH-13){1'b0}},
33
                                 `OR1K_RESET_VECTOR,8'd0},
34
 
35
    parameter FEATURE_SYSCALL = "ENABLED",
36
    parameter FEATURE_TRAP = "ENABLED",
37
    parameter FEATURE_RANGE = "ENABLED",
38
 
39
    parameter FEATURE_DATACACHE = "NONE",
40
    parameter OPTION_DCACHE_BLOCK_WIDTH = 5,
41
    parameter OPTION_DCACHE_SET_WIDTH = 9,
42
    parameter OPTION_DCACHE_WAYS = 2,
43
    parameter FEATURE_DMMU = "NONE",
44
    parameter OPTION_DMMU_SET_WIDTH = 6,
45
    parameter OPTION_DMMU_WAYS = 1,
46
    parameter FEATURE_INSTRUCTIONCACHE = "NONE",
47
    parameter OPTION_ICACHE_BLOCK_WIDTH = 5,
48
    parameter OPTION_ICACHE_SET_WIDTH = 9,
49
    parameter OPTION_ICACHE_WAYS = 2,
50
    parameter FEATURE_IMMU = "NONE",
51
    parameter OPTION_IMMU_SET_WIDTH = 6,
52
    parameter OPTION_IMMU_WAYS = 1,
53
    parameter FEATURE_TIMER = "ENABLED",
54
    parameter FEATURE_DEBUGUNIT = "NONE",
55
    parameter FEATURE_PERFCOUNTERS = "NONE",
56
    parameter OPTION_PERFCOUNTERS_NUM = 0,
57
    parameter FEATURE_PMU = "NONE",
58
    parameter FEATURE_MAC = "NONE",
59
    parameter FEATURE_FPU = "NONE",
60
    parameter FEATURE_MULTICORE = "NONE",
61
 
62
    parameter FEATURE_PIC = "ENABLED",
63
    parameter OPTION_PIC_TRIGGER = "LEVEL",
64
    parameter OPTION_PIC_NMI_WIDTH = 0,
65
 
66
    parameter FEATURE_DSX ="NONE",
67
    parameter FEATURE_FASTCONTEXTS = "NONE",
68
    parameter OPTION_RF_NUM_SHADOW_GPR = 0,
69
    parameter FEATURE_OVERFLOW = "NONE",
70
    parameter FEATURE_CARRY_FLAG = "ENABLED",
71
 
72
    parameter SPR_SR_WIDTH = 16,
73
    parameter SPR_SR_RESET_VALUE = 16'h8001
74
    )
75
   (
76
    input                             clk,
77
    input                             rst,
78
 
79
    // ALU result - either jump target, SPR address
80
    input [OPTION_OPERAND_WIDTH-1:0]  ctrl_alu_result_i,
81
 
82
    // LSU address, needed for effective address
83
    input [OPTION_OPERAND_WIDTH-1:0]  ctrl_lsu_adr_i,
84
 
85
    // Operand B from RF might be jump address, might be value for SPR
86
    input [OPTION_OPERAND_WIDTH-1:0]  ctrl_rfb_i,
87
 
88
    input                             ctrl_flag_set_i,
89
    input                             ctrl_flag_clear_i,
90
    input                             atomic_flag_set_i,
91
    input                             atomic_flag_clear_i,
92
 
93
    input [OPTION_OPERAND_WIDTH-1:0]  pc_ctrl_i,
94
 
95
    input                             ctrl_op_mfspr_i,
96
    input                             ctrl_op_mtspr_i,
97
    input                             ctrl_op_rfe_i,
98
 
99
    // Indicate if branch will be taken based on instruction currently in
100
    // decode stage.
101
    input                             decode_branch_i,
102
    input [OPTION_OPERAND_WIDTH-1:0]  decode_branch_target_i,
103
 
104
    input                             branch_mispredict_i,
105
    input [OPTION_OPERAND_WIDTH-1:0]  execute_mispredict_target_i,
106
 
107
    // PC of execute stage (NPC)
108
    input [OPTION_OPERAND_WIDTH-1:0]  pc_execute_i,
109
 
110
    input                             execute_op_branch_i,
111
 
112
    // Exception inputs, registered on output of execute stage
113
    input                             except_ibus_err_i,
114
    input                             except_itlb_miss_i,
115
    input                             except_ipagefault_i,
116
    input                             except_ibus_align_i,
117
    input                             except_illegal_i,
118
    input                             except_syscall_i,
119
    input                             except_dbus_i,
120
    input                             except_dtlb_miss_i,
121
    input                             except_dpagefault_i,
122
    input                             except_trap_i,
123
    input                             except_align_i,
124
 
125
    // Inputs from two units that can stall proceedings
126
    input                             fetch_valid_i,
127
    input                             decode_valid_i,
128
    input                             execute_valid_i,
129
    input                             ctrl_valid_i,
130
 
131
    input                             fetch_exception_taken_i,
132
 
133
    input                             decode_bubble_i,
134
    input                             execute_bubble_i,
135
 
136
    // Inputs from decode-exec stage to PCU
137
    input               execute_op_lsu_load_i,
138
    input               execute_op_lsu_store_i,
139
 
140
    // Inputs from icache and dcache
141
    input               icache_hit_i,
142
    input               dcache_hit_i,
143
 
144
    // External IRQ lines in
145
    input [31:0]                       irq_i,
146
 
147
    // Exception PC output, used in the lsu to properly signal dbus errors that
148
    // has went through the store buffer
149
    output [OPTION_OPERAND_WIDTH-1:0] ctrl_epcr_o,
150
    // Exception PC input coming from the store buffer
151
    input [OPTION_OPERAND_WIDTH-1:0]  store_buffer_epcr_i,
152
 
153
    input                             store_buffer_err_i,
154
 
155
    // SPR data out
156
    output [OPTION_OPERAND_WIDTH-1:0] mfspr_dat_o,
157
 
158
    // WE to RF for l.mfspr
159
    output                            ctrl_mfspr_ack_o,
160
    output                            ctrl_mtspr_ack_o,
161
 
162
    // Flag out to branch control, combinatorial
163
    output                            ctrl_flag_o,
164
 
165
    // Arithmetic flags to and from ALU
166
    output                            ctrl_carry_o,
167
    input                             ctrl_carry_set_i,
168
    input                             ctrl_carry_clear_i,
169
    input                             ctrl_overflow_set_i,
170
    input                             ctrl_overflow_clear_i,
171
 
172
    // FPU Status flags to and from ALU
173
    output [`OR1K_FPCSR_RM_SIZE-1:0]  ctrl_fpu_round_mode_o,
174
    input  [`OR1K_FPCSR_WIDTH-1:0]    ctrl_fpcsr_i,
175
    input                             ctrl_fpcsr_set_i,
176
 
177
    // Branch indicator from control unit (l.rfe/exception)
178
    output                            ctrl_branch_exception_o,
179
    // PC out to fetch stage for l.rfe, exceptions
180
    output [OPTION_OPERAND_WIDTH-1:0] ctrl_branch_except_pc_o,
181
 
182
    // Clear instructions from decode and fetch stage
183
    output                            pipeline_flush_o,
184
 
185
    // Indicate that a rfe is going on
186
    output                            doing_rfe_o,
187
 
188
    output                            padv_fetch_o,
189
    output                            padv_decode_o,
190
    output                            padv_execute_o,
191
    output                            padv_ctrl_o,
192
 
193
    // Debug bus
194
    input [15:0]                       du_addr_i,
195
    input                             du_stb_i,
196
    input [OPTION_OPERAND_WIDTH-1:0]  du_dat_i,
197
    input                             du_we_i,
198
    output [OPTION_OPERAND_WIDTH-1:0] du_dat_o,
199
    output                            du_ack_o,
200
    // Stall control from debug interface
201
    input                             du_stall_i,
202
    output                            du_stall_o,
203
    output [OPTION_OPERAND_WIDTH-1:0] du_restart_pc_o,
204
    output                            du_restart_o,
205
 
206
    // SPR accesses to external units (cache, mmu, etc.)
207
    output [15:0]                      spr_bus_addr_o,
208
    output                            spr_bus_we_o,
209
    output                            spr_bus_stb_o,
210
    output [OPTION_OPERAND_WIDTH-1:0] spr_bus_dat_o,
211
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_dc_i,
212
    input                             spr_bus_ack_dc_i,
213
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_ic_i,
214
    input                             spr_bus_ack_ic_i,
215
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_dmmu_i,
216
    input                             spr_bus_ack_dmmu_i,
217
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_immu_i,
218
    input                             spr_bus_ack_immu_i,
219
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_mac_i,
220
    input                             spr_bus_ack_mac_i,
221
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_pmu_i,
222
    input                             spr_bus_ack_pmu_i,
223
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_pcu_i,
224
    input                             spr_bus_ack_pcu_i,
225
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_fpu_i,
226
    input                             spr_bus_ack_fpu_i,
227
    input [OPTION_OPERAND_WIDTH-1:0]  spr_gpr_dat_i,
228
    input                             spr_gpr_ack_i,
229
    output [15:0]                      spr_sr_o,
230
 
231
    output reg                        ctrl_bubble_o,
232
 
233
    input [OPTION_OPERAND_WIDTH-1:0]  multicore_coreid_i,
234
    input [OPTION_OPERAND_WIDTH-1:0]  multicore_numcores_i
235
    );
236
 
237
   // Internal signals
238
   reg [SPR_SR_WIDTH-1:0]             spr_sr;
239
   reg [SPR_SR_WIDTH-1:0]             spr_esr;
240
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_epcr;
241
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_eear;
242
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_evbar;
243
 
244
   // Programmable Interrupt Control SPRs
245
   wire [31:0]                        spr_picmr;
246
   wire [31:0]                        spr_picsr;
247
 
248
   // Tick Timer SPRs
249
   wire [31:0]                        spr_ttmr;
250
   wire [31:0]                        spr_ttcr;
251
 
252
   // FPU Control & Status Register
253
   // and related exeption signals
254
   reg [`OR1K_FPCSR_WIDTH-1:0]       spr_fpcsr;
255
   wire                              except_fpu;
256
 
257
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_ppc;
258
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_npc;
259
   reg                               execute_delay_slot;
260
   reg                               ctrl_delay_slot;
261
 
262
   wire                              execute_waiting;
263
   reg                               execute_waiting_r;
264
 
265
   reg                               decode_execute_halt;
266
 
267
   reg                               exception_taken;
268
 
269
   reg [OPTION_OPERAND_WIDTH-1:0]    last_branch_insn_pc;
270
   reg [OPTION_OPERAND_WIDTH-1:0]    last_branch_target_pc;
271
   reg                               padv_ctrl;
272
 
273
   reg                               exception_r;
274
 
275
   reg [OPTION_OPERAND_WIDTH-1:0]    exception_pc_addr;
276
 
277
   reg                               waiting_for_fetch;
278
 
279
   reg                               doing_rfe_r;
280
   wire                              doing_rfe;
281
   wire                              deassert_doing_rfe;
282
 
283
   wire                              exception, exception_pending;
284
 
285
   reg                               ctrl_stage_exceptions;
286
 
287
   wire                              exception_re;
288
 
289
   wire                              except_ticktimer;
290
   wire                              except_pic;
291
 
292
   wire                              except_range;
293
 
294
   wire [15:0]                        spr_addr;
295
 
296
   wire [OPTION_OPERAND_WIDTH-1:0]   b;
297
 
298
   wire                              deassert_decode_execute_halt;
299
 
300
   /* Debug SPRs */
301
   reg [31:0]                         spr_dmr1;
302
   reg [31:0]                         spr_dmr2;
303
   reg [31:0]                         spr_dsr;
304
   reg [31:0]                         spr_drr;
305
 
306
   /* DU internal control signals */
307
   wire                              du_access;
308
   reg                               cpu_stall;
309
   wire                              du_restart_from_stall;
310
   reg [5:0]                          pstep;
311
   wire                              stepping;
312
   wire                              stepped_into_delay_slot;
313
   reg                               stepped_into_exception;
314
   reg                               stepped_into_rfe;
315
   wire                              du_npc_write;
316
   reg                               du_npc_written;
317
   wire                              stall_on_trap;
318
 
319
   /* Wires for SPR management */
320
   wire                              spr_access_valid;
321
   wire                              spr_we;
322
   wire                              spr_read;
323
   wire                              spr_ack;
324
   wire [OPTION_OPERAND_WIDTH-1:0]   spr_write_dat;
325
   reg [11:0]                        spr_access;
326
   wire [11:0]                        spr_access_ack;
327
   wire [31:0]                        spr_internal_read_dat [0:11];
328
   wire                              spr_read_access;
329
   wire                              spr_write_access;
330
   wire                              spr_bus_access;
331
   reg [OPTION_OPERAND_WIDTH-1:0]    spr_sys_group_read;
332
   wire [3:0]                         spr_group;
333
 
334
   /* Wires from mor1kx_cfgrs module */
335
   wire [31:0]                        spr_vr;
336
   wire [31:0]                        spr_vr2;
337
   wire [31:0]                        spr_avr;
338
   wire [31:0]                        spr_upr;
339
   wire [31:0]                        spr_cpucfgr;
340
   wire [31:0]                        spr_dmmucfgr;
341
   wire [31:0]                        spr_immucfgr;
342
   wire [31:0]                        spr_dccfgr;
343
   wire [31:0]                        spr_iccfgr;
344
   wire [31:0]                        spr_dcfgr;
345
   wire [31:0]                        spr_pccfgr;
346
   wire [31:0]                        spr_isr [0:7];
347
 
348
   assign  b = ctrl_rfb_i;
349
 
350
   assign ctrl_branch_exception_o = (exception_r | ctrl_op_rfe_i | doing_rfe) &
351
                                    !exception_taken;
352
   assign exception_pending = (except_ibus_err_i | except_ibus_align_i |
353
                               except_illegal_i | except_syscall_i |
354
                               except_dbus_i | except_align_i |
355
                               except_ticktimer | except_range | except_fpu |
356
                               except_pic | except_trap_i |
357
                               except_itlb_miss_i | except_ipagefault_i |
358
                               except_dtlb_miss_i | except_dpagefault_i);
359
 
360
   assign exception = exception_pending &
361
                      (padv_ctrl & !ctrl_bubble_o | ctrl_stage_exceptions);
362
 
363
   assign exception_re = exception & !exception_r & !exception_taken;
364
 
365
   assign except_range = (FEATURE_RANGE!="NONE") ? spr_sr[`OR1K_SPR_SR_OVE] &&
366
                         (spr_sr[`OR1K_SPR_SR_OV] | ctrl_overflow_set_i) &
367
                         !doing_rfe : 0;
368
 
369
   assign deassert_decode_execute_halt = fetch_exception_taken_i &
370
                                         decode_execute_halt;
371
 
372
   assign ctrl_branch_except_pc_o = (ctrl_op_rfe_i | doing_rfe) ? spr_epcr :
373
                                    exception_pc_addr;
374
 
375
   assign ctrl_epcr_o = ctrl_delay_slot ? pc_ctrl_i - 4 : pc_ctrl_i;
376
 
377
   always @(posedge clk)
378
     ctrl_stage_exceptions <= except_align_i | except_dbus_i | except_range |
379
                              except_fpu |
380
                              except_dtlb_miss_i | except_dpagefault_i;
381
 
382
   always @(posedge clk)
383
     if (exception & !exception_r)
384
       casez(
385
             {
386
              except_itlb_miss_i,
387
              except_ipagefault_i,
388
              except_ibus_err_i,
389
              except_illegal_i,
390
              except_align_i,
391
              except_ibus_align_i,
392
              except_syscall_i,
393
              except_dtlb_miss_i,
394
              except_dpagefault_i,
395
              except_trap_i,
396
              except_dbus_i,
397
              except_range,
398
              except_fpu,
399
              except_pic,
400
              except_ticktimer
401
              }
402
             )
403
         15'b1??????????????:
404
           exception_pc_addr <= spr_evbar |
405
                                {19'd0,`OR1K_ITLB_VECTOR,8'd0};
406
         15'b01?????????????:
407
           exception_pc_addr <= spr_evbar |
408
                                {19'd0,`OR1K_IPF_VECTOR,8'd0};
409
         15'b001????????????:
410
           exception_pc_addr <= spr_evbar |
411
                                {19'd0,`OR1K_BERR_VECTOR,8'd0};
412
         15'b0001???????????:
413
           exception_pc_addr <= spr_evbar |
414
                                {19'd0,`OR1K_ILLEGAL_VECTOR,8'd0};
415
         15'b00001??????????,
416
         15'b000001?????????:
417
             exception_pc_addr <= spr_evbar |
418
                                  {19'd0,`OR1K_ALIGN_VECTOR,8'd0};
419
         15'b0000001????????:
420
           exception_pc_addr <= spr_evbar |
421
                                {19'd0,`OR1K_SYSCALL_VECTOR,8'd0};
422
         15'b00000001???????:
423
           exception_pc_addr <= spr_evbar |
424
                                {19'd0,`OR1K_DTLB_VECTOR,8'd0};
425
         15'b000000001??????:
426
           exception_pc_addr <= spr_evbar |
427
                                {19'd0,`OR1K_DPF_VECTOR,8'd0};
428
         15'b0000000001?????:
429
           exception_pc_addr <= spr_evbar |
430
                                {19'd0,`OR1K_TRAP_VECTOR,8'd0};
431
         15'b00000000001????:
432
           exception_pc_addr <= spr_evbar |
433
                                {19'd0,`OR1K_BERR_VECTOR,8'd0};
434
         15'b000000000001???:
435
           exception_pc_addr <= spr_evbar |
436
                                {19'd0,`OR1K_RANGE_VECTOR,8'd0};
437
         15'b0000000000001??:
438
           exception_pc_addr <= spr_evbar |
439
                                {19'd0,`OR1K_FP_VECTOR,8'd0};
440
         15'b00000000000001?:
441
           exception_pc_addr <= spr_evbar |
442
                                {19'd0,`OR1K_INT_VECTOR,8'd0};
443
         //15'b00000000000001:
444
         default:
445
           exception_pc_addr <= spr_evbar |
446
                                {19'd0,`OR1K_TT_VECTOR,8'd0};
447
       endcase // casex (...
448
 
449
   assign execute_waiting = !execute_valid_i;
450
 
451
   assign padv_fetch_o = !execute_waiting & !cpu_stall & !decode_bubble_i
452
                         & (!stepping | (stepping & pstep[0] & !fetch_valid_i));
453
 
454
   assign padv_decode_o = fetch_valid_i & !execute_waiting &
455
                          !decode_execute_halt & !cpu_stall
456
                          & (!stepping | (stepping & pstep[1]));
457
 
458
   assign padv_execute_o = ((decode_valid_i & !execute_waiting &
459
                             /* Stop fetch before exception branch continuing */
460
                             !(exception_r & fetch_exception_taken_i)) |
461
                            (!execute_waiting & execute_waiting_r &
462
                             fetch_valid_i) |
463
                            // Case where execute became ready before fetch
464
                            // after delay in execute stage
465
                            (waiting_for_fetch & fetch_valid_i)) &
466
                           // Not exceptions occurring
467
                           !decode_execute_halt & !exception_re & !ctrl_op_rfe_i
468
                           & !cpu_stall & (!stepping | (stepping & pstep[2]));
469
 
470
   assign padv_ctrl_o = padv_ctrl;
471
 
472
   assign spr_addr = du_access ? du_addr_i : ctrl_alu_result_i[15:0];
473
   assign ctrl_mfspr_ack_o = spr_ack;
474
   assign ctrl_mtspr_ack_o = spr_ack;
475
 
476
   // Pipeline flush
477
   assign pipeline_flush_o = (padv_ctrl & ctrl_op_rfe_i) |
478
                             (exception_re) |
479
                             cpu_stall;
480
 
481
   // Flag output
482
   wire ctrl_flag_clear = ctrl_flag_clear_i | atomic_flag_clear_i;
483
   wire ctrl_flag_set = ctrl_flag_set_i | atomic_flag_set_i;
484
 
485
   assign ctrl_flag_o = (!ctrl_flag_clear & spr_sr[`OR1K_SPR_SR_F]) |
486
                        ctrl_flag_set;
487
 
488
   // Carry output
489
   assign ctrl_carry_o = FEATURE_CARRY_FLAG!="NONE" &
490
                         (!ctrl_carry_clear_i & spr_sr[`OR1K_SPR_SR_CY] |
491
                         ctrl_carry_set_i);
492
 
493
   // Ctrl stage pipeline advance signal is one cycle behind execute stage's
494
   always @(posedge clk `OR_ASYNC_RST)
495
     if (rst)
496
       padv_ctrl <= 0;
497
     else
498
       padv_ctrl <= padv_execute_o;
499
 
500
   always @(posedge clk `OR_ASYNC_RST)
501
     if (rst)
502
       execute_waiting_r <= 0;
503
     else if (!execute_waiting)
504
       execute_waiting_r <= 0;
505
     else if (decode_valid_i & execute_waiting)
506
       execute_waiting_r <= 1;
507
 
508
   always @(posedge clk `OR_ASYNC_RST)
509
     if (rst)
510
       decode_execute_halt <= 0;
511
     else if (du_restart_from_stall)
512
       decode_execute_halt <= 0;
513
     else if (decode_execute_halt & deassert_decode_execute_halt)
514
       decode_execute_halt <= 0;
515
     else if ((ctrl_op_rfe_i | exception) & !decode_execute_halt &
516
              !exception_taken)
517
       decode_execute_halt <= 1;
518
 
519
   always @(posedge clk `OR_ASYNC_RST)
520
     if (rst)
521
       exception_r <= 0;
522
     else if (exception_taken | du_restart_from_stall)
523
       exception_r <= 0;
524
     else if (exception & !exception_r)
525
       exception_r <= 1;
526
 
527
   // Signal to indicate that the incoming exception or l.rfe has been taken
528
   // and we're waiting for it to propagate through the pipeline.
529
   always @(posedge clk `OR_ASYNC_RST)
530
     if (rst)
531
       exception_taken <= 0;
532
     else if (exception_taken)
533
       exception_taken <= 0;
534
     else if (exception_r & fetch_exception_taken_i)
535
       exception_taken <= 1;
536
 
537
   always @(posedge clk `OR_ASYNC_RST)
538
     if (rst)
539
       last_branch_insn_pc <= 0;
540
     else if (padv_execute_o & execute_op_branch_i)
541
       last_branch_insn_pc <= pc_execute_i;
542
 
543
   always @(posedge clk `OR_ASYNC_RST)
544
     if (rst)
545
       last_branch_target_pc <= 0;
546
     else if (padv_execute_o & branch_mispredict_i)
547
       last_branch_target_pc <= execute_mispredict_target_i;
548
     else if (padv_decode_o & decode_branch_i)
549
       last_branch_target_pc <= decode_branch_target_i;
550
 
551
   // Used to gate execute stage's advance signal in the case where a LSU op has
552
   // finished before the next instruction has been fetched. Typically this
553
   // occurs when not using icache and doing lots of memory accesses.
554
   always @(posedge clk `OR_ASYNC_RST)
555
     if (rst)
556
       waiting_for_fetch <= 0;
557
     else if (fetch_valid_i)
558
       waiting_for_fetch <= 0;
559
     else if (!execute_waiting & execute_waiting_r & !fetch_valid_i)
560
       waiting_for_fetch <= 1;
561
 
562
 
563
   assign doing_rfe = ((padv_ctrl & ctrl_op_rfe_i) | doing_rfe_r) &
564
                      !deassert_doing_rfe;
565
 
566
   assign doing_rfe_o = doing_rfe;
567
 
568
   assign deassert_doing_rfe = fetch_exception_taken_i & doing_rfe_r;
569
 
570
   always @(posedge clk `OR_ASYNC_RST)
571
     if (rst)
572
       doing_rfe_r <= 0;
573
     else if (deassert_doing_rfe)
574
       doing_rfe_r <= 0;
575
     else if (padv_ctrl)
576
       doing_rfe_r <= ctrl_op_rfe_i;
577
 
578
   assign spr_sr_o = spr_sr;
579
 
580
 
581
   // FPU related: FPCSR and exception
582
   generate
583
    `ifdef OR1K_FPCSR_MASK_FLAGS
584
     reg [`OR1K_FPCSR_ALLF_SIZE-1:0] spr_fpcsr_mf; // mask for FPU flags 
585
    `endif
586
 
587
     /* verilator lint_off WIDTH */
588
     if (FEATURE_FPU != "NONE") begin : fpu_csr_ena
589
     /* verilator lint_on WIDTH */
590
       assign ctrl_fpu_round_mode_o = spr_fpcsr[`OR1K_FPCSR_RM];
591
 
592
       // select all flags
593
      `ifdef OR1K_FPCSR_MASK_FLAGS
594
       wire [`OR1K_FPCSR_ALLF_SIZE-1:0] masked_fpres_flags =
595
         ctrl_fpcsr_i[`OR1K_FPCSR_ALLF] & spr_fpcsr_mf;
596
 
597
       wire [`OR1K_FPCSR_ALLF_SIZE-1:0] masked_fpcsr_flags =
598
         spr_fpcsr[`OR1K_FPCSR_ALLF] & spr_fpcsr_mf;
599
 
600
 
601
       wire [`OR1K_FPCSR_ALLF_SIZE-1:0] fpu_allf =
602
         ctrl_fpcsr_set_i ? masked_fpres_flags :
603
                            masked_fpcsr_flags;
604
      `else
605
       wire [`OR1K_FPCSR_ALLF_SIZE-1:0] fpu_allf =
606
         ctrl_fpcsr_set_i ? ctrl_fpcsr_i[`OR1K_FPCSR_ALLF] :
607
                            spr_fpcsr[`OR1K_FPCSR_ALLF];
608
      `endif
609
 
610
       assign except_fpu = (~doing_rfe) &
611
                           spr_fpcsr[`OR1K_FPCSR_FPEE] &
612
                           (|fpu_allf);
613
 
614
       // FPU Control & status register
615
       always @(posedge clk `OR_ASYNC_RST) begin
616
         if (rst) begin
617
           spr_fpcsr <= `OR1K_FPCSR_RESET_VALUE;
618
          `ifdef OR1K_FPCSR_MASK_FLAGS
619
           spr_fpcsr_mf <= `OR1K_FPCSR_MASK_RESET_VALUE;
620
          `endif
621
         end
622
         else if (exception_re) begin
623
           spr_fpcsr[`OR1K_FPCSR_ALLF] <= fpu_allf;
624
           spr_fpcsr[`OR1K_FPCSR_RM]   <= spr_fpcsr[`OR1K_FPCSR_RM];
625
           spr_fpcsr[`OR1K_FPCSR_FPEE] <= 1'b0;
626
         end
627
         else if ((spr_we & spr_access[`OR1K_SPR_SYS_BASE] &
628
                  (spr_sr[`OR1K_SPR_SR_SM] & padv_ctrl | du_access)) &&
629
                  `SPR_OFFSET(spr_addr)==`SPR_OFFSET(`OR1K_SPR_FPCSR_ADDR)) begin
630
           spr_fpcsr <= spr_write_dat[`OR1K_FPCSR_WIDTH-1:0]; // update all fields
631
          `ifdef OR1K_FPCSR_MASK_FLAGS
632
           spr_fpcsr_mf <= spr_write_dat[`OR1K_FPCSR_MASK_ALL];
633
          `endif
634
         end
635
         else if (padv_ctrl & ctrl_fpcsr_set_i) begin
636
           spr_fpcsr[`OR1K_FPCSR_ALLF] <= fpu_allf;
637
           spr_fpcsr[`OR1K_FPCSR_RM]   <= spr_fpcsr[`OR1K_FPCSR_RM];
638
           spr_fpcsr[`OR1K_FPCSR_FPEE] <= spr_fpcsr[`OR1K_FPCSR_FPEE];
639
         end
640
       end // FPCSR reg's always(@posedge clk)
641
     end
642
     else begin : fpu_csr_none
643
       assign ctrl_fpu_round_mode_o = {`OR1K_FPCSR_RM_SIZE{1'b0}};
644
       assign except_fpu = 0;
645
       // FPU Control & status register
646
       always @(posedge clk `OR_ASYNC_RST) begin
647
         if (rst) begin
648
           spr_fpcsr <= {`OR1K_FPCSR_WIDTH{1'b0}};
649
          `ifdef OR1K_FPCSR_MASK_FLAGS
650
           spr_fpcsr_mf <= {`OR1K_FPCSR_ALLF_SIZE{1'b0}};
651
          `endif
652
         end
653
       end // FPCSR reg's always(@posedge clk)
654
     end
655
   endgenerate // FPU related: FPCSR and exception
656
 
657
 
658
   // Supervision register
659
   always @(posedge clk `OR_ASYNC_RST)
660
     if (rst)
661
       spr_sr <= SPR_SR_RESET_VALUE;
662
     else if (exception_re)
663
       begin
664
          // Go into supervisor mode, disable interrupts, MMUs
665
          spr_sr[`OR1K_SPR_SR_SM  ] <= 1'b1;
666
          if (FEATURE_TIMER!="NONE")
667
            spr_sr[`OR1K_SPR_SR_TEE ] <= 1'b0;
668
          if (FEATURE_PIC!="NONE")
669
            spr_sr[`OR1K_SPR_SR_IEE ] <= 1'b0;
670
          if (FEATURE_DMMU!="NONE")
671
            spr_sr[`OR1K_SPR_SR_DME ] <= 1'b0;
672
          if (FEATURE_IMMU!="NONE")
673
            spr_sr[`OR1K_SPR_SR_IME ] <= 1'b0;
674
          if (FEATURE_DSX!="NONE")
675
            spr_sr[`OR1K_SPR_SR_DSX ] <= ctrl_delay_slot;
676
          if (FEATURE_OVERFLOW!="NONE")
677
            spr_sr[`OR1K_SPR_SR_OVE ] <= 1'b0;
678
       end
679
     else if ((spr_we & spr_access[`OR1K_SPR_SYS_BASE] &
680
               (spr_sr[`OR1K_SPR_SR_SM] & padv_ctrl | du_access)) &&
681
              `SPR_OFFSET(spr_addr)==`SPR_OFFSET(`OR1K_SPR_SR_ADDR))
682
       begin
683
          spr_sr[`OR1K_SPR_SR_SM  ] <= spr_write_dat[`OR1K_SPR_SR_SM  ];
684
 
685
          spr_sr[`OR1K_SPR_SR_F  ] <= spr_write_dat[`OR1K_SPR_SR_F  ];
686
 
687
          if (FEATURE_TIMER!="NONE")
688
            spr_sr[`OR1K_SPR_SR_TEE ] <= spr_write_dat[`OR1K_SPR_SR_TEE ];
689
 
690
          if (FEATURE_PIC!="NONE")
691
            spr_sr[`OR1K_SPR_SR_IEE ] <= spr_write_dat[`OR1K_SPR_SR_IEE ];
692
 
693
          if (FEATURE_DATACACHE!="NONE")
694
            spr_sr[`OR1K_SPR_SR_DCE ] <= spr_write_dat[`OR1K_SPR_SR_DCE ];
695
 
696
          if (FEATURE_INSTRUCTIONCACHE!="NONE")
697
            spr_sr[`OR1K_SPR_SR_ICE ] <= spr_write_dat[`OR1K_SPR_SR_ICE ];
698
 
699
          if (FEATURE_DMMU!="NONE")
700
            spr_sr[`OR1K_SPR_SR_DME ] <= spr_write_dat[`OR1K_SPR_SR_DME ];
701
 
702
          if (FEATURE_IMMU!="NONE")
703
            spr_sr[`OR1K_SPR_SR_IME ] <= spr_write_dat[`OR1K_SPR_SR_IME ];
704
 
705
          if (FEATURE_FASTCONTEXTS!="NONE")
706
            spr_sr[`OR1K_SPR_SR_CE  ] <= spr_write_dat[`OR1K_SPR_SR_CE  ];
707
 
708
          if (FEATURE_CARRY_FLAG!="NONE")
709
            spr_sr[`OR1K_SPR_SR_CY] <= spr_write_dat[`OR1K_SPR_SR_CY];
710
 
711
          if (FEATURE_OVERFLOW!="NONE") begin
712
             spr_sr[`OR1K_SPR_SR_OV  ] <= spr_write_dat[`OR1K_SPR_SR_OV  ];
713
             spr_sr[`OR1K_SPR_SR_OVE ] <= spr_write_dat[`OR1K_SPR_SR_OVE ];
714
          end
715
 
716
          if (FEATURE_DSX!="NONE")
717
            spr_sr[`OR1K_SPR_SR_DSX ] <= spr_write_dat[`OR1K_SPR_SR_DSX ];
718
 
719
          spr_sr[`OR1K_SPR_SR_EPH ] <= spr_write_dat[`OR1K_SPR_SR_EPH ];
720
       end
721
     else if (padv_ctrl)
722
       begin
723
          spr_sr[`OR1K_SPR_SR_F   ] <= ctrl_flag_set ? 1 :
724
                                       ctrl_flag_clear ? 0 :
725
                                       spr_sr[`OR1K_SPR_SR_F   ];
726
 
727
          if (FEATURE_CARRY_FLAG!="NONE")
728
            spr_sr[`OR1K_SPR_SR_CY] <= ctrl_carry_set_i ? 1 :
729
                                       ctrl_carry_clear_i ? 0 :
730
                                       spr_sr[`OR1K_SPR_SR_CY];
731
          if (FEATURE_OVERFLOW!="NONE")
732
            spr_sr[`OR1K_SPR_SR_OV   ] <= ctrl_overflow_set_i ? 1 :
733
                                ctrl_overflow_clear_i ? 0 :
734
                                spr_sr[`OR1K_SPR_SR_OV   ];
735
          // Skip FO. TODO: make this even more selective.
736
          if (ctrl_op_rfe_i)
737
            spr_sr[14:0] <= spr_esr[14:0];
738
       end
739
 
740
 
741
   // Exception SR
742
   always @(posedge clk `OR_ASYNC_RST)
743
     if (rst)
744
       spr_esr <= SPR_SR_RESET_VALUE;
745
     else if (exception_re)
746
       begin
747
          spr_esr <= spr_sr;
748
          if (FEATURE_OVERFLOW!="NONE")
749
            begin
750
               if (ctrl_overflow_set_i)
751
                 spr_esr[`OR1K_SPR_SR_OV] <= 1'b1;
752
               else if (ctrl_overflow_clear_i)
753
                 spr_esr[`OR1K_SPR_SR_OV] <= 1'b0;
754
            end
755
          if (FEATURE_CARRY_FLAG!="NONE") begin
756
             if (ctrl_carry_set_i)
757
               spr_esr[`OR1K_SPR_SR_CY] <= 1'b1;
758
             else if (ctrl_carry_clear_i)
759
               spr_esr[`OR1K_SPR_SR_CY] <= 1'b0;
760
          end
761
       end
762
     else if (spr_we && spr_access[`OR1K_SPR_SYS_BASE] &&
763
              `SPR_OFFSET(spr_addr)==`SPR_OFFSET(`OR1K_SPR_ESR0_ADDR))
764
       begin
765
          spr_esr[`OR1K_SPR_SR_SM  ] <= spr_write_dat[`OR1K_SPR_SR_SM  ];
766
 
767
          spr_esr[`OR1K_SPR_SR_F  ] <= spr_write_dat[`OR1K_SPR_SR_F  ];
768
 
769
          if (FEATURE_TIMER!="NONE")
770
            spr_esr[`OR1K_SPR_SR_TEE ] <= spr_write_dat[`OR1K_SPR_SR_TEE ];
771
 
772
          if (FEATURE_PIC!="NONE")
773
            spr_esr[`OR1K_SPR_SR_IEE ] <= spr_write_dat[`OR1K_SPR_SR_IEE ];
774
 
775
          if (FEATURE_DATACACHE!="NONE")
776
            spr_esr[`OR1K_SPR_SR_DCE ] <= spr_write_dat[`OR1K_SPR_SR_DCE ];
777
 
778
          if (FEATURE_INSTRUCTIONCACHE!="NONE")
779
            spr_esr[`OR1K_SPR_SR_ICE ] <= spr_write_dat[`OR1K_SPR_SR_ICE ];
780
 
781
          if (FEATURE_DMMU!="NONE")
782
            spr_esr[`OR1K_SPR_SR_DME ] <= spr_write_dat[`OR1K_SPR_SR_DME ];
783
 
784
          if (FEATURE_IMMU!="NONE")
785
            spr_esr[`OR1K_SPR_SR_IME ] <= spr_write_dat[`OR1K_SPR_SR_IME ];
786
 
787
          if (FEATURE_FASTCONTEXTS!="NONE")
788
            spr_esr[`OR1K_SPR_SR_CE  ] <= spr_write_dat[`OR1K_SPR_SR_CE  ];
789
 
790
          if (FEATURE_CARRY_FLAG!="NONE")
791
            spr_esr[`OR1K_SPR_SR_CY] <= spr_write_dat[`OR1K_SPR_SR_CY];
792
 
793
          if (FEATURE_OVERFLOW!="NONE") begin
794
             spr_esr[`OR1K_SPR_SR_OV  ] <= spr_write_dat[`OR1K_SPR_SR_OV  ];
795
             spr_esr[`OR1K_SPR_SR_OVE ] <= spr_write_dat[`OR1K_SPR_SR_OVE ];
796
          end
797
 
798
          if (FEATURE_DSX!="NONE")
799
            spr_esr[`OR1K_SPR_SR_DSX ] <= spr_write_dat[`OR1K_SPR_SR_DSX ];
800
 
801
          spr_esr[`OR1K_SPR_SR_EPH ] <= spr_write_dat[`OR1K_SPR_SR_EPH ];
802
       end
803
 
804
   always @(posedge clk `OR_ASYNC_RST)
805
     if (rst)
806
       ctrl_bubble_o <= 0;
807
     else if (padv_execute_o)
808
       ctrl_bubble_o <= execute_bubble_i;
809
 
810
   // Exception PC
811
   always @(posedge clk)
812
     if (exception_re) begin
813
        if (except_ibus_err_i)
814
          spr_epcr <= last_branch_insn_pc;
815
        // Syscall is a special case, we return back to the instruction _after_
816
        // the syscall instruction, unless the syscall was in a delay slot
817
        else if (except_syscall_i)
818
          spr_epcr <= ctrl_delay_slot ? ctrl_epcr_o : pc_ctrl_i + 4;
819
        else if (store_buffer_err_i)
820
          spr_epcr <= store_buffer_epcr_i;
821
        // Update EPCR unless we are handing over to the debug unit hardware
822
        // i.e. single stepping.
823
        else if (!(except_trap_i & stall_on_trap))
824
          spr_epcr <= ctrl_epcr_o;
825
     end else if (spr_we && spr_access[`OR1K_SPR_SYS_BASE] &&
826
                  `SPR_OFFSET(spr_addr)==`SPR_OFFSET(`OR1K_SPR_EPCR0_ADDR)) begin
827
        spr_epcr <= spr_write_dat;
828
     end
829
 
830
   // Exception Effective Address
831
   always @(posedge clk `OR_ASYNC_RST)
832
     if (rst)
833
       spr_eear <= {OPTION_OPERAND_WIDTH{1'b0}};
834
     else if (/*padv_ctrl & exception*/ exception_re)
835
       begin
836
          if (except_ibus_err_i | except_itlb_miss_i | except_ipagefault_i)
837
            spr_eear <= pc_ctrl_i;
838
          else
839
            spr_eear <= ctrl_lsu_adr_i;
840
       end
841
 
842
   // Track the PC
843
   always @(posedge clk `OR_ASYNC_RST)
844
     if (rst)
845
       spr_ppc <= OPTION_RESET_PC;
846
     else if (padv_ctrl)
847
       spr_ppc <= pc_ctrl_i;
848
 
849
   // Generate the NPC for SPR accesses
850
   always @(posedge clk `OR_ASYNC_RST)
851
     if (rst)
852
       spr_npc <= OPTION_RESET_PC;
853
     else if (du_npc_write)
854
       spr_npc <= du_dat_i;
855
     else if (du_npc_written)
856
       spr_npc <= spr_npc;
857
     else if (stepping) begin
858
        if (stepped_into_rfe)
859
          spr_npc <= spr_epcr;
860
        else if (stepped_into_delay_slot)
861
          spr_npc <= last_branch_target_pc;
862
        else if (stepped_into_exception)
863
          spr_npc <= exception_pc_addr;
864
        else
865
          spr_npc <= pc_ctrl_i + 4;
866
     end else if (stall_on_trap & padv_ctrl & except_trap_i)
867
       spr_npc <= pc_ctrl_i;
868
     else if (cpu_stall & padv_ctrl)
869
       spr_npc <= ctrl_delay_slot ? pc_ctrl_i - 4 : pc_ctrl_i;
870
     else if (!cpu_stall)
871
       spr_npc <= pc_execute_i;
872
 
873
   // Exception Vector Address
874
   always @(posedge clk `OR_ASYNC_RST)
875
     if (rst)
876
       spr_evbar <= {OPTION_OPERAND_WIDTH{1'b0}};
877
     else if (spr_we && spr_access[`OR1K_SPR_SYS_BASE] &&
878
              `SPR_OFFSET(spr_addr)==`SPR_OFFSET(`OR1K_SPR_EVBAR_ADDR))
879
       spr_evbar <= {spr_write_dat[OPTION_OPERAND_WIDTH-1:13], 13'd0};
880
 
881
   // Remember when we're in a delay slot in execute stage.
882
   always @(posedge clk `OR_ASYNC_RST)
883
     if (rst)
884
       execute_delay_slot <= 0;
885
     else if (padv_execute_o)
886
       execute_delay_slot <= execute_op_branch_i;
887
 
888
   always @(posedge clk `OR_ASYNC_RST)
889
     if (rst)
890
       ctrl_delay_slot <= 0;
891
     else if (padv_execute_o)
892
       ctrl_delay_slot <= execute_delay_slot;
893
 
894
   mor1kx_cfgrs
895
     #(.FEATURE_PIC                     (FEATURE_PIC),
896
       .FEATURE_TIMER                   (FEATURE_TIMER),
897
       .OPTION_PIC_TRIGGER              (OPTION_PIC_TRIGGER),
898
       .FEATURE_DSX                     (FEATURE_DSX),
899
       .FEATURE_FASTCONTEXTS            (FEATURE_FASTCONTEXTS),
900
       .OPTION_RF_NUM_SHADOW_GPR        (OPTION_RF_NUM_SHADOW_GPR),
901
       .FEATURE_OVERFLOW                (FEATURE_OVERFLOW),
902
       .FEATURE_DATACACHE               (FEATURE_DATACACHE),
903
       .OPTION_DCACHE_BLOCK_WIDTH       (OPTION_DCACHE_BLOCK_WIDTH),
904
       .OPTION_DCACHE_SET_WIDTH         (OPTION_DCACHE_SET_WIDTH),
905
       .OPTION_DCACHE_WAYS              (OPTION_DCACHE_WAYS),
906
       .FEATURE_DMMU                    (FEATURE_DMMU),
907
       .OPTION_DMMU_SET_WIDTH           (OPTION_DMMU_SET_WIDTH),
908
       .OPTION_DMMU_WAYS                (OPTION_DMMU_WAYS),
909
       .FEATURE_INSTRUCTIONCACHE        (FEATURE_INSTRUCTIONCACHE),
910
       .OPTION_ICACHE_BLOCK_WIDTH       (OPTION_ICACHE_BLOCK_WIDTH),
911
       .OPTION_ICACHE_SET_WIDTH         (OPTION_ICACHE_SET_WIDTH),
912
       .OPTION_ICACHE_WAYS              (OPTION_ICACHE_WAYS),
913
       .FEATURE_IMMU                    (FEATURE_IMMU),
914
       .OPTION_IMMU_SET_WIDTH           (OPTION_IMMU_SET_WIDTH),
915
       .OPTION_IMMU_WAYS                (OPTION_IMMU_WAYS),
916
       .FEATURE_DEBUGUNIT               (FEATURE_DEBUGUNIT),
917
       .FEATURE_PERFCOUNTERS            (FEATURE_PERFCOUNTERS),
918
       .OPTION_PERFCOUNTERS_NUM  (OPTION_PERFCOUNTERS_NUM),
919
       .FEATURE_MAC                     (FEATURE_MAC),
920
       .FEATURE_FPU                     (FEATURE_FPU), // mor1kx_cfgrs instance
921
       .FEATURE_SYSCALL                 (FEATURE_SYSCALL),
922
       .FEATURE_TRAP                    (FEATURE_TRAP),
923
       .FEATURE_RANGE                   (FEATURE_RANGE),
924
       .FEATURE_DELAYSLOT               ("ENABLED"),
925
       .FEATURE_EVBAR                   ("ENABLED")
926
       )
927
   mor1kx_cfgrs
928
     (/*AUTOINST*/
929
      // Outputs
930
      .spr_vr                           (spr_vr[31:0]),
931
      .spr_vr2                          (spr_vr2[31:0]),
932
      .spr_upr                          (spr_upr[31:0]),
933
      .spr_cpucfgr                      (spr_cpucfgr[31:0]),
934
      .spr_dmmucfgr                     (spr_dmmucfgr[31:0]),
935
      .spr_immucfgr                     (spr_immucfgr[31:0]),
936
      .spr_dccfgr                       (spr_dccfgr[31:0]),
937
      .spr_iccfgr                       (spr_iccfgr[31:0]),
938
      .spr_dcfgr                        (spr_dcfgr[31:0]),
939
      .spr_pccfgr                       (spr_pccfgr[31:0]),
940
      .spr_avr                          (spr_avr[31:0]));
941
 
942
   /* Implementation-specific registers */
943
   assign spr_isr[0] = 0;
944
   assign spr_isr[1] = 0;
945
   assign spr_isr[2] = 0;
946
   assign spr_isr[3] = 0;
947
   assign spr_isr[4] = 0;
948
   assign spr_isr[5] = 0;
949
   assign spr_isr[6] = 0;
950
   assign spr_isr[7] = 0;
951
 
952
   // System group (0) SPR data out
953
   always @* begin
954
     spr_sys_group_read = 0;
955
     if (spr_access[`OR1K_SPR_SYS_BASE])
956
       case(`SPR_OFFSET(spr_addr))
957
         `SPR_OFFSET(`OR1K_SPR_VR_ADDR):
958
           spr_sys_group_read = spr_vr;
959
         `SPR_OFFSET(`OR1K_SPR_VR2_ADDR):
960
           spr_sys_group_read = {spr_vr2[31:8], `MOR1KX_PIPEID_CAPPUCCINO};
961
         `SPR_OFFSET(`OR1K_SPR_AVR_ADDR):
962
           spr_sys_group_read = spr_avr;
963
         `SPR_OFFSET(`OR1K_SPR_UPR_ADDR):
964
           spr_sys_group_read = spr_upr;
965
         `SPR_OFFSET(`OR1K_SPR_CPUCFGR_ADDR):
966
           spr_sys_group_read = spr_cpucfgr;
967
         `SPR_OFFSET(`OR1K_SPR_DMMUCFGR_ADDR):
968
           spr_sys_group_read = spr_dmmucfgr;
969
         `SPR_OFFSET(`OR1K_SPR_IMMUCFGR_ADDR):
970
           spr_sys_group_read = spr_immucfgr;
971
         `SPR_OFFSET(`OR1K_SPR_DCCFGR_ADDR):
972
           spr_sys_group_read = spr_dccfgr;
973
         `SPR_OFFSET(`OR1K_SPR_ICCFGR_ADDR):
974
           spr_sys_group_read = spr_iccfgr;
975
         `SPR_OFFSET(`OR1K_SPR_DCFGR_ADDR):
976
           spr_sys_group_read = spr_dcfgr;
977
         `SPR_OFFSET(`OR1K_SPR_PCCFGR_ADDR):
978
           spr_sys_group_read = spr_pccfgr;
979
         `SPR_OFFSET(`OR1K_SPR_NPC_ADDR):
980
           spr_sys_group_read = spr_npc;
981
         `SPR_OFFSET(`OR1K_SPR_SR_ADDR):
982
           spr_sys_group_read = {{(OPTION_OPERAND_WIDTH-SPR_SR_WIDTH){1'b0}},
983
                                 spr_sr};
984
 
985
         `SPR_OFFSET(`OR1K_SPR_PPC_ADDR):
986
           spr_sys_group_read = spr_ppc;
987
        `ifdef OR1K_FPCSR_MASK_FLAGS
988
         `SPR_OFFSET(`OR1K_SPR_FPCSR_ADDR):
989
           spr_sys_group_read =
990
             {{(OPTION_OPERAND_WIDTH-`OR1K_FPCSR_WIDTH-`OR1K_FPCSR_ALLF_SIZE){1'b0}},
991
              spr_fpcsr_mf,spr_fpcsr};
992
        `else
993
         `SPR_OFFSET(`OR1K_SPR_FPCSR_ADDR):
994
           spr_sys_group_read = {{(OPTION_OPERAND_WIDTH-`OR1K_FPCSR_WIDTH){1'b0}},
995
                                 spr_fpcsr};
996
        `endif
997
         `SPR_OFFSET(`OR1K_SPR_EPCR0_ADDR):
998
           spr_sys_group_read = spr_epcr;
999
         `SPR_OFFSET(`OR1K_SPR_EEAR0_ADDR):
1000
           spr_sys_group_read = spr_eear;
1001
         `SPR_OFFSET(`OR1K_SPR_ESR0_ADDR):
1002
           spr_sys_group_read = {{(OPTION_OPERAND_WIDTH-SPR_SR_WIDTH){1'b0}},
1003
                                 spr_esr};
1004
         `SPR_OFFSET(`OR1K_SPR_EVBAR_ADDR):
1005
           spr_sys_group_read = spr_evbar;
1006
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR):
1007
           spr_sys_group_read = spr_isr[0];
1008
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +1:
1009
           spr_sys_group_read = spr_isr[1];
1010
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +2:
1011
           spr_sys_group_read = spr_isr[2];
1012
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +3:
1013
           spr_sys_group_read = spr_isr[3];
1014
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +4:
1015
           spr_sys_group_read = spr_isr[4];
1016
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +5:
1017
           spr_sys_group_read = spr_isr[5];
1018
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +6:
1019
           spr_sys_group_read = spr_isr[6];
1020
         `SPR_OFFSET(`OR1K_SPR_ISR0_ADDR) +7:
1021
           spr_sys_group_read = spr_isr[7];
1022
 
1023
         `SPR_OFFSET(`OR1K_SPR_COREID_ADDR):
1024
           // If the multicore feature is activated this address returns the
1025
           // core identifier, 0 otherwise
1026
           spr_sys_group_read = (FEATURE_MULTICORE!="NONE") ?
1027
                                multicore_coreid_i : 0;
1028
         `SPR_OFFSET(`OR1K_SPR_NUMCORES_ADDR):
1029
           // If the multicore feature is activated this address returns the
1030
           // core identifier, 0 otherwise
1031
           spr_sys_group_read = (FEATURE_MULTICORE!="NONE") ?
1032
                                multicore_numcores_i : 0;
1033
 
1034
         default:
1035
            // GPR read
1036
            if (spr_addr[10:9] == 2'h2)
1037
              spr_sys_group_read = spr_gpr_dat_i; // Register file
1038
       endcase
1039
    end
1040
 
1041
   /* System group read data MUX in */
1042
   assign spr_internal_read_dat[`OR1K_SPR_SYS_BASE] = spr_sys_group_read;
1043
   /* System group ack generation */
1044
 
1045
   assign spr_access_ack[`OR1K_SPR_SYS_BASE] = spr_access[`OR1K_SPR_SYS_BASE] &
1046
                                               ((spr_addr[10:9] == 2'h2) ?
1047
                                                 spr_gpr_ack_i : 1);
1048
 
1049
   //
1050
   // Generate data to the register file for mfspr operations
1051
   // Read datas are simply ORed since set to 0 when not
1052
   // concerned by spr access.
1053
   //
1054
   assign mfspr_dat_o = spr_internal_read_dat[`OR1K_SPR_SYS_BASE]  |
1055
                        spr_internal_read_dat[`OR1K_SPR_DMMU_BASE] |
1056
                        spr_internal_read_dat[`OR1K_SPR_IMMU_BASE] |
1057
                        spr_internal_read_dat[`OR1K_SPR_DC_BASE]   |
1058
                        spr_internal_read_dat[`OR1K_SPR_IC_BASE]   |
1059
                        spr_internal_read_dat[`OR1K_SPR_MAC_BASE]  |
1060
                        spr_internal_read_dat[`OR1K_SPR_DU_BASE]   |
1061
                        spr_internal_read_dat[`OR1K_SPR_PC_BASE]   |
1062
                        spr_internal_read_dat[`OR1K_SPR_PM_BASE]   |
1063
                        spr_internal_read_dat[`OR1K_SPR_PIC_BASE]  |
1064
                        spr_internal_read_dat[`OR1K_SPR_TT_BASE]   |
1065
                        spr_internal_read_dat[`OR1K_SPR_FPU_BASE];
1066
 
1067
   // PIC SPR control
1068
   generate
1069
 
1070
      if (FEATURE_PIC !="NONE") begin : pic
1071
 
1072
         /* mor1kx_pic AUTO_TEMPLATE (
1073
          .spr_picsr_o          (spr_picsr),
1074
          .spr_picmr_o          (spr_picmr),
1075
          .spr_bus_ack          (spr_access_ack[`OR1K_SPR_PIC_BASE]),
1076
          .spr_dat_o            (spr_internal_read_dat[`OR1K_SPR_PIC_BASE]),
1077
          // Inputs
1078
          .spr_we_i             (spr_we),
1079
          .spr_access_i         (spr_access[`OR1K_SPR_PIC_BASE])
1080
          .spr_addr_i           (spr_addr),
1081
          .spr_dat_i            (spr_write_dat),
1082
          );*/
1083
         mor1kx_pic
1084
          #(
1085
            .OPTION_PIC_TRIGGER(OPTION_PIC_TRIGGER),
1086
            .OPTION_PIC_NMI_WIDTH(OPTION_PIC_NMI_WIDTH)
1087
            )
1088
         mor1kx_pic
1089
           (/*AUTOINST*/
1090
            // Outputs
1091
            .spr_picmr_o        (spr_picmr),                // Templated
1092
            .spr_picsr_o        (spr_picsr),                // Templated
1093
            .spr_bus_ack        (spr_access_ack[`OR1K_SPR_PIC_BASE]), // Templated
1094
            .spr_dat_o          (spr_internal_read_dat[`OR1K_SPR_PIC_BASE]), // Templated
1095
            // Inputs
1096
            .clk                (clk),
1097
            .rst                (rst),
1098
            .irq_i              (irq_i[31:0]),
1099
            .spr_access_i       (spr_access[`OR1K_SPR_PIC_BASE]), // Templated
1100
            .spr_we_i           (spr_we),                 // Templated
1101
            .spr_addr_i         (spr_addr),               // Templated
1102
            .spr_dat_i          (spr_write_dat));         // Templated
1103
 
1104
 
1105
         assign except_pic = (|spr_picsr) & spr_sr[`OR1K_SPR_SR_IEE] &
1106
                             !ctrl_op_mtspr_i & !doing_rfe;
1107
      end
1108
      else begin
1109
         assign except_pic = 0;
1110
         assign spr_picsr = 0;
1111
         assign spr_picmr = 0;
1112
         assign spr_access_ack[`OR1K_SPR_PIC_BASE] = 0;
1113
         assign spr_internal_read_dat[`OR1K_SPR_PIC_BASE] = 0;
1114
      end // else: !if(FEATURE_PIC !="NONE")
1115
   endgenerate
1116
 
1117
   // PCU SPR control
1118
   wire dchache_miss = !dcache_hit_i & ((execute_op_lsu_load_i | execute_op_lsu_store_i) & padv_execute_o);
1119
   generate
1120
      if (FEATURE_PERFCOUNTERS !="NONE") begin : pcu
1121
 
1122
         /* mor1kx_pcu AUTO_TEMPLATE (
1123
          .spr_bus_ack          (spr_access_ack[`OR1K_SPR_PC_BASE]),
1124
          .spr_dat_o            (spr_internal_read_dat[`OR1K_SPR_PC_BASE]),
1125
          // Inputs
1126
          .spr_we_i             (spr_we),
1127
          .spr_re_i             (spr_read),
1128
          .spr_access_i         (spr_access[`OR1K_SPR_PC_BASE])
1129
          .spr_addr_i           (spr_addr),
1130
          .spr_dat_i            (spr_write_dat),
1131
          );*/
1132
         mor1kx_pcu
1133
          #(
1134
            .OPTION_PERFCOUNTERS_NUM(OPTION_PERFCOUNTERS_NUM)
1135
            )
1136
         mor1kx_pcu
1137
           (/*AUTOINST*/
1138
            // Outputs
1139
            .spr_bus_ack        (spr_access_ack[`OR1K_SPR_PC_BASE]), // Templated
1140
            .spr_dat_o          (spr_internal_read_dat[`OR1K_SPR_PC_BASE]), // Templated
1141
            // Inputs
1142
            .clk                (clk),
1143
            .rst                (rst),
1144
            .spr_access_i       (spr_access[`OR1K_SPR_PC_BASE]), // Templated
1145
            .spr_we_i           (spr_we),                 // Templated
1146
            .spr_re_i           (spr_read),               // Templated
1147
            .spr_addr_i         (spr_addr),               // Templated
1148
            .spr_dat_i          (spr_write_dat),          // Templated
1149
            .spr_sys_mode_i     (spr_sr[`OR1K_SPR_SR_SM]),
1150
            .pcu_event_load_i   (execute_op_lsu_load_i & padv_execute_o),
1151
            .pcu_event_store_i  (execute_op_lsu_store_i & padv_execute_o),
1152
            .pcu_event_ifetch_i (fetch_valid_i),
1153
            .pcu_event_dcache_miss_i(dchache_miss),
1154
            .pcu_event_icache_miss_i(!icache_hit_i & !waiting_for_fetch),
1155
            .pcu_event_ifetch_stall_i(!padv_fetch_o),
1156
            .pcu_event_lsu_stall_i(!ctrl_valid_i),
1157
            .pcu_event_brn_stall_i(branch_mispredict_i & padv_decode_o),
1158
            .pcu_event_dtlb_miss_i(except_dtlb_miss_i),
1159
            .pcu_event_itlb_miss_i(except_itlb_miss_i),
1160
            .pcu_event_datadep_stall_i(execute_waiting)
1161
            );
1162
      end
1163
      else begin
1164
         assign spr_access_ack[`OR1K_SPR_PC_BASE] = 0;
1165
         assign spr_internal_read_dat[`OR1K_SPR_PC_BASE] = 0;
1166
      end // else: !if(FEATURE_PERFCOUNTERS !="NONE")
1167
   endgenerate
1168
 
1169
   generate
1170
      if (FEATURE_TIMER!="NONE") begin : tt
1171
 
1172
         /* mor1kx_ticktimer AUTO_TEMPLATE (
1173
          .spr_ttmr_o           (spr_ttmr),
1174
          .spr_ttcr_o           (spr_ttcr),
1175
          .spr_bus_ack          (spr_access_ack[`OR1K_SPR_TT_BASE]),
1176
          .spr_dat_o            (spr_internal_read_dat[`OR1K_SPR_TT_BASE]),
1177
          // Inputs
1178
          .spr_access_i         (spr_access[`OR1K_SPR_TT_BASE]),
1179
          .spr_we_i             (spr_we),
1180
          .spr_addr_i           (spr_addr),
1181
          .spr_dat_i            (spr_write_dat),
1182
          );*/
1183
         mor1kx_ticktimer mor1kx_ticktimer
1184
                         (/*AUTOINST*/
1185
                          // Outputs
1186
                          .spr_ttmr_o           (spr_ttmr),                  // Templated
1187
                          .spr_ttcr_o           (spr_ttcr),                  // Templated
1188
                          .spr_bus_ack          (spr_access_ack[`OR1K_SPR_TT_BASE]), // Templated
1189
                          .spr_dat_o            (spr_internal_read_dat[`OR1K_SPR_TT_BASE]), // Templated
1190
                          // Inputs
1191
                          .clk                  (clk),
1192
                          .rst                  (rst),
1193
                          .spr_access_i         (spr_access[`OR1K_SPR_TT_BASE]), // Templated
1194
                          .spr_we_i             (spr_we),         // Templated
1195
                          .spr_addr_i           (spr_addr),       // Templated
1196
                          .spr_dat_i            (spr_write_dat)); // Templated
1197
 
1198
         assign except_ticktimer = spr_ttmr[28] & spr_sr[`OR1K_SPR_SR_TEE] &
1199
                                   !ctrl_op_mtspr_i & !doing_rfe;
1200
 
1201
      end // if (FEATURE_TIMER!="NONE")
1202
      else begin
1203
         assign except_ticktimer = 0;
1204
         assign spr_ttmr = 0;
1205
         assign spr_ttcr = 0;
1206
         assign spr_access_ack[`OR1K_SPR_TT_BASE] = 0;
1207
         assign spr_internal_read_dat[`OR1K_SPR_TT_BASE] = 0;
1208
      end // else: !if(FEATURE_TIMER!="NONE")
1209
   endgenerate
1210
 
1211
   /* SPR access control - allow accesses from either the instructions or from
1212
    the debug interface */
1213
   assign spr_read_access = (ctrl_op_mfspr_i | (du_access & !du_we_i));
1214
   assign spr_write_access = (ctrl_op_mtspr_i | (du_access & du_we_i));
1215
 
1216
   assign spr_write_dat = du_access ? du_dat_i : b;
1217
   assign spr_we = spr_write_access & spr_access_valid;
1218
   assign spr_read = spr_read_access & spr_access_valid;
1219
 
1220
   /* A bus out to other units that live outside of the control unit */
1221
   assign spr_bus_addr_o = spr_addr;
1222
   assign spr_bus_we_o = spr_write_access & spr_access_valid & spr_bus_access;
1223
   assign spr_bus_stb_o = (spr_read_access | spr_write_access) &
1224
                          spr_access_valid & spr_bus_access;
1225
   assign spr_bus_dat_o = spr_write_dat;
1226
 
1227
   assign spr_group = spr_addr[14:11];
1228
 
1229
   /* Select spr */
1230
   always @(*) begin
1231
     spr_access = 0;
1232
      case(spr_group)
1233
         // System group
1234
         `OR1K_SPR_SYS_BASE:
1235
           spr_access[`OR1K_SPR_SYS_BASE] = 1'b1;
1236
         // DMMU
1237
         `OR1K_SPR_DMMU_BASE:
1238
           spr_access[`OR1K_SPR_DMMU_BASE] = (FEATURE_DMMU!="NONE");
1239
         // IMMU
1240
         `OR1K_SPR_IMMU_BASE:
1241
           spr_access[`OR1K_SPR_IMMU_BASE] = (FEATURE_IMMU!="NONE");
1242
         // Data cache
1243
         `OR1K_SPR_DC_BASE:
1244
           spr_access[`OR1K_SPR_DC_BASE] = (FEATURE_DATACACHE!="NONE");
1245
         // Instruction cache
1246
         `OR1K_SPR_IC_BASE:
1247
           spr_access[`OR1K_SPR_IC_BASE] = (FEATURE_INSTRUCTIONCACHE!= "NONE");
1248
         // MAC unit
1249
         `OR1K_SPR_MAC_BASE:
1250
           spr_access[`OR1K_SPR_MAC_BASE] = (FEATURE_MAC!="NONE");
1251
         // Debug unit
1252
         `OR1K_SPR_DU_BASE:
1253
           spr_access[`OR1K_SPR_DU_BASE] = (FEATURE_DEBUGUNIT!="NONE");
1254
         // Performance counters
1255
         `OR1K_SPR_PC_BASE:
1256
           spr_access[`OR1K_SPR_PC_BASE] = (FEATURE_PERFCOUNTERS!="NONE");
1257
         // Power Management
1258
         `OR1K_SPR_PM_BASE:
1259
           spr_access[`OR1K_SPR_PM_BASE] = (FEATURE_PMU!="NONE");
1260
         // PIC
1261
         `OR1K_SPR_PIC_BASE:
1262
           spr_access[`OR1K_SPR_PIC_BASE] = (FEATURE_PIC!="NONE");
1263
         // Tick timer
1264
         `OR1K_SPR_TT_BASE:
1265
           spr_access[`OR1K_SPR_TT_BASE] = (FEATURE_TIMER!="NONE");
1266
         // FPU
1267
         `OR1K_SPR_FPU_BASE:
1268
           spr_access[`OR1K_SPR_FPU_BASE] = (FEATURE_FPU!="NONE");
1269
         /* generate invalid if the group is not present in the design  */
1270
         default:
1271
           spr_access = 0;
1272
       endcase
1273
    end
1274
 
1275
    // Is the SPR in the design?
1276
    assign spr_access_valid = |spr_access;
1277
 
1278
    assign spr_ack = (|spr_access_ack) | !spr_access_valid;
1279
 
1280
   /* Is a SPR bus access needed, or is the requested SPR in this file? */
1281
   assign spr_bus_access = /* Any of the units we don't have in this file */
1282
                           /* System group */
1283
                           !(spr_access[`OR1K_SPR_SYS_BASE] ||
1284
                             /* Debug Group */
1285
                             spr_access[`OR1K_SPR_DU_BASE] ||
1286
                             /* PIC Group */
1287
                             spr_access[`OR1K_SPR_PIC_BASE] ||
1288
                             /* Tick Group */
1289
                             spr_access[`OR1K_SPR_TT_BASE]) ||
1290
                             // GPR
1291
                             (spr_access[`OR1K_SPR_SYS_BASE] &&
1292
                              spr_addr[10:9]==2'h2);
1293
 
1294
   generate
1295
      if (FEATURE_DEBUGUNIT!="NONE") begin : du
1296
 
1297
         reg [OPTION_OPERAND_WIDTH-1:0] du_read_dat;
1298
 
1299
         reg                            du_ack;
1300
         reg                            du_stall_r;
1301
         reg [1:0]                       branch_step;
1302
 
1303
         assign du_access = du_stb_i;
1304
 
1305
         // Generate ack back to the debug interface bus
1306
         always @(posedge clk `OR_ASYNC_RST)
1307
           if (rst)
1308
             du_ack <= 0;
1309
           else if (du_ack)
1310
             du_ack <= 0;
1311
           else if (du_stb_i) begin
1312
                  du_ack <= spr_ack;
1313
           end
1314
 
1315
         assign du_ack_o = du_ack;
1316
 
1317
         /* Data back to the debug bus */
1318
         always @(posedge clk)
1319
           du_read_dat <= mfspr_dat_o;
1320
 
1321
         assign du_dat_o = du_read_dat;
1322
 
1323
         always @(posedge clk)
1324
           if (rst)
1325
             cpu_stall <= 0;
1326
           else if (!du_stall_i)
1327
             cpu_stall <= 0;
1328
           else if (padv_execute_o & !execute_bubble_i & du_stall_i |
1329
                    du_stall_o)
1330
             cpu_stall <= 1;
1331
 
1332
         /* goes out to the debug interface and comes back 1 cycle later
1333
          via du_stall_i */
1334
         assign du_stall_o = stepping & pstep[4] |
1335
                             (stall_on_trap & padv_ctrl & except_trap_i);
1336
 
1337
         /* Pulse to indicate we're restarting after a stall */
1338
         assign du_restart_from_stall = du_stall_r & !du_stall_i;
1339
 
1340
         /* NPC debug control logic */
1341
         assign du_npc_write = (du_we_i && du_addr_i==`OR1K_SPR_NPC_ADDR &&
1342
                                du_ack_o);
1343
 
1344
         /* Pick the traps-cause-stall bit out of the DSR */
1345
         assign stall_on_trap = spr_dsr[`OR1K_SPR_DSR_TE];
1346
 
1347
         /* record if NPC was written while we were stalled.
1348
          If so, we will use this value for restarting */
1349
         always @(posedge clk `OR_ASYNC_RST)
1350
           if (rst)
1351
             du_npc_written <= 0;
1352
           else if (du_restart_from_stall)
1353
             du_npc_written <= 0;
1354
           else if (du_npc_write)
1355
             du_npc_written <= 1;
1356
 
1357
         always @(posedge clk `OR_ASYNC_RST)
1358
           if (rst)
1359
             stepped_into_exception <= 0;
1360
           else if (du_restart_from_stall)
1361
             stepped_into_exception <= 0;
1362
           else if (exception & stepping & (padv_ctrl | ctrl_stage_exceptions))
1363
             stepped_into_exception <= 1;
1364
 
1365
         always @(posedge clk `OR_ASYNC_RST)
1366
           if (rst)
1367
             stepped_into_rfe <= 0;
1368
           else if (du_restart_from_stall)
1369
             stepped_into_rfe <= 0;
1370
           else if (stepping & padv_ctrl)
1371
             stepped_into_rfe <= ctrl_op_rfe_i;
1372
 
1373
         assign du_restart_pc_o = spr_npc;
1374
 
1375
         assign du_restart_o = du_restart_from_stall;
1376
 
1377
         /* Indicate when we're stepping */
1378
         assign stepping = spr_dmr1[`OR1K_SPR_DMR1_ST] &
1379
                           spr_dsr[`OR1K_SPR_DSR_TE];
1380
 
1381
         always @(posedge clk `OR_ASYNC_RST)
1382
           if (rst)
1383
             pstep <= 0;
1384
           else if (du_restart_from_stall & stepping)
1385
             pstep <= 6'h1;
1386
           else if ((pstep[0] & fetch_valid_i) |
1387
                    /* decode is always single cycle */
1388
                    (pstep[1] & padv_decode_o) |
1389
                    /* execute stage */
1390
                    (pstep[2] & (execute_valid_i | ctrl_stage_exceptions)) |
1391
                    /* ctrl stage */
1392
                    (pstep[3] & (ctrl_valid_i | ctrl_stage_exceptions)) |
1393
                    pstep[4])
1394
             pstep <= {pstep[4:0],1'b0};
1395
 
1396
         always @(posedge clk `OR_ASYNC_RST)
1397
           if (rst)
1398
             branch_step <= 0;
1399
           else if (du_npc_written)
1400
             branch_step <= 0;
1401
           else if (stepping & pstep[2])
1402
             branch_step <= {branch_step[0], decode_branch_i};
1403
           else if (!stepping & padv_ctrl)
1404
             branch_step <= {branch_step[0], ctrl_delay_slot};
1405
 
1406
         assign stepped_into_delay_slot = branch_step[1] & stepping;
1407
 
1408
         /* Signals for waveform debuging */
1409
         wire [31:0] spr_read_data_group_0;
1410
         assign spr_read_data_group_0 = spr_internal_read_dat[0];
1411
         wire [31:0] spr_read_data_group_1;
1412
         assign spr_read_data_group_1 = spr_internal_read_dat[1];
1413
         wire [31:0] spr_read_data_group_2;
1414
         assign spr_read_data_group_2 = spr_internal_read_dat[2];
1415
         wire [31:0] spr_read_data_group_3;
1416
         assign spr_read_data_group_3 = spr_internal_read_dat[3];
1417
         wire [31:0] spr_read_data_group_4;
1418
         assign spr_read_data_group_4 = spr_internal_read_dat[4];
1419
         wire [31:0] spr_read_data_group_5;
1420
         assign spr_read_data_group_5 = spr_internal_read_dat[5];
1421
         wire [31:0] spr_read_data_group_6;
1422
         assign spr_read_data_group_6 = spr_internal_read_dat[6];
1423
         wire [31:0] spr_read_data_group_7;
1424
         assign spr_read_data_group_7 = spr_internal_read_dat[7];
1425
         wire [31:0] spr_read_data_group_8;
1426
         assign spr_read_data_group_8 = spr_internal_read_dat[8];
1427
         wire [31:0] spr_read_data_group_9;
1428
         assign spr_read_data_group_9 = spr_internal_read_dat[9];
1429
 
1430
 
1431
         /* always single cycle access */
1432
         assign spr_access_ack[`OR1K_SPR_DU_BASE] = spr_access[`OR1K_SPR_DU_BASE];
1433
         assign spr_internal_read_dat[`OR1K_SPR_DU_BASE] =
1434
                                           (spr_addr==`OR1K_SPR_DMR1_ADDR) ?
1435
                                           spr_dmr1 :
1436
                                           (spr_addr==`OR1K_SPR_DMR2_ADDR) ?
1437
                                           spr_dmr2 :
1438
                                           (spr_addr==`OR1K_SPR_DSR_ADDR) ?
1439
                                           spr_dsr :
1440
                                           (spr_addr==`OR1K_SPR_DRR_ADDR) ?
1441
                                           spr_drr : 0;
1442
 
1443
         /* Put the incoming stall signal through a register to detect FE */
1444
         always @(posedge clk `OR_ASYNC_RST)
1445
           if (rst)
1446
             du_stall_r <= 0;
1447
           else
1448
             du_stall_r <= du_stall_i;
1449
 
1450
         /* DMR1 */
1451
         always @(posedge clk `OR_ASYNC_RST)
1452
           if (rst)
1453
             spr_dmr1 <= 0;
1454
           else if (spr_we && spr_addr==`OR1K_SPR_DMR1_ADDR)
1455
             spr_dmr1[23:0] <= spr_write_dat[23:0];
1456
 
1457
         /* DMR2 */
1458
         always @(posedge clk)
1459
           spr_dmr2 <= 0;
1460
 
1461
         /* DSR */
1462
         always @(posedge clk `OR_ASYNC_RST)
1463
           if (rst)
1464
             spr_dsr <= 0;
1465
           else if (spr_we && spr_addr==`OR1K_SPR_DSR_ADDR)
1466
             spr_dsr[13:0] <= spr_write_dat[13:0];
1467
 
1468
         /* DRR */
1469
         always @(posedge clk `OR_ASYNC_RST)
1470
           if (rst)
1471
             spr_drr <= 0;
1472
           else if (spr_we && spr_addr==`OR1K_SPR_DRR_ADDR)
1473
             spr_drr[13:0] <= spr_write_dat[13:0];
1474
           else if (stall_on_trap & padv_ctrl & except_trap_i)
1475
             spr_drr[`OR1K_SPR_DRR_TE] <= 1;
1476
 
1477
      end // block: du
1478
      else
1479
        begin : no_du
1480
           assign du_access = 0;
1481
           assign du_stall_o = 0;
1482
           assign du_ack_o = 0;
1483
           assign du_restart_o = 0;
1484
           assign du_restart_pc_o = 0;
1485
           assign stepping = 0;
1486
           assign du_npc_write = 0;
1487
           assign stepped_into_delay_slot = 0;
1488
           assign du_dat_o = 0;
1489
           assign du_restart_from_stall = 0;
1490
           assign spr_access_ack[`OR1K_SPR_DU_BASE] = 0;
1491
           assign spr_internal_read_dat[`OR1K_SPR_DU_BASE] = 0;
1492
           assign stall_on_trap = 0;
1493
           always @(posedge clk)
1494
             begin
1495
                spr_dmr1 <= 0;
1496
                spr_dmr2 <= 0;
1497
                spr_dsr <= 0;
1498
                spr_drr <= 0;
1499
                du_npc_written <= 0;
1500
                cpu_stall <= 0;
1501
             end
1502
        end
1503
   endgenerate
1504
 
1505
// Controls to generate ACKs from units that are external to this module
1506
generate
1507
if (FEATURE_DMMU!="NONE") begin : dmmu_ctrl
1508
   assign spr_access_ack[`OR1K_SPR_DMMU_BASE] = spr_bus_ack_dmmu_i &
1509
                                                spr_access[`OR1K_SPR_DMMU_BASE];
1510
   assign spr_internal_read_dat[`OR1K_SPR_DMMU_BASE] =
1511
     spr_bus_dat_dmmu_i &
1512
     {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_DMMU_BASE]}};
1513
end else begin
1514
   assign spr_access_ack[`OR1K_SPR_DMMU_BASE] = 0;
1515
   assign spr_internal_read_dat[`OR1K_SPR_DMMU_BASE] = 0;
1516
end
1517
endgenerate
1518
 
1519
generate
1520
if (FEATURE_IMMU!="NONE") begin : immu_ctrl
1521
   assign spr_access_ack[`OR1K_SPR_IMMU_BASE] = spr_bus_ack_immu_i &
1522
                                                spr_access[`OR1K_SPR_IMMU_BASE];
1523
   assign spr_internal_read_dat[`OR1K_SPR_IMMU_BASE] =
1524
     spr_bus_dat_immu_i &
1525
     {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_IMMU_BASE]}};
1526
end else begin
1527
   assign spr_access_ack[`OR1K_SPR_IMMU_BASE] = 0;
1528
   assign spr_internal_read_dat[`OR1K_SPR_IMMU_BASE] = 0;
1529
end
1530
endgenerate
1531
 
1532
generate
1533
if (FEATURE_DATACACHE!="NONE") begin : datacache_ctrl
1534
   assign spr_access_ack[`OR1K_SPR_DC_BASE] = spr_bus_ack_dc_i &
1535
                                              spr_access[`OR1K_SPR_DC_BASE];
1536
   assign spr_internal_read_dat[`OR1K_SPR_DC_BASE] =
1537
     spr_bus_dat_dc_i & {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_DC_BASE]}};
1538
end else begin
1539
   assign spr_access_ack[`OR1K_SPR_DC_BASE] = 0;
1540
   assign spr_internal_read_dat[`OR1K_SPR_DC_BASE] = 0;
1541
end
1542
endgenerate
1543
 
1544
generate
1545
if (FEATURE_INSTRUCTIONCACHE!="NONE") begin : instructioncache_ctrl
1546
   assign spr_access_ack[`OR1K_SPR_IC_BASE] = spr_bus_ack_ic_i &
1547
                                              spr_access[`OR1K_SPR_IC_BASE];
1548
   assign spr_internal_read_dat[`OR1K_SPR_IC_BASE] =
1549
     spr_bus_dat_ic_i & {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_IC_BASE]}};
1550
end else begin
1551
   assign spr_access_ack[`OR1K_SPR_IC_BASE] = 0;
1552
   assign spr_internal_read_dat[`OR1K_SPR_IC_BASE] = 0;
1553
end
1554
endgenerate
1555
 
1556
generate
1557
if (FEATURE_MAC!="NONE") begin : mac_ctrl
1558
   assign spr_access_ack[`OR1K_SPR_MAC_BASE] = spr_bus_ack_mac_i &
1559
                                               spr_access[`OR1K_SPR_MAC_BASE];
1560
   assign spr_internal_read_dat[`OR1K_SPR_MAC_BASE] =
1561
      spr_bus_dat_mac_i &
1562
      {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_MAC_BASE]}};
1563
end else begin
1564
   assign spr_access_ack[`OR1K_SPR_MAC_BASE] = 0;
1565
   assign spr_internal_read_dat[`OR1K_SPR_MAC_BASE] = 0;
1566
end
1567
endgenerate
1568
 
1569
generate
1570
if (FEATURE_PMU!="NONE") begin : pmu_ctrl
1571
   assign spr_access_ack[`OR1K_SPR_PM_BASE] = spr_bus_ack_pmu_i &
1572
                                              spr_access[`OR1K_SPR_PM_BASE];
1573
   assign spr_internal_read_dat[`OR1K_SPR_PM_BASE] =
1574
     spr_bus_dat_pmu_i & {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_PM_BASE]}};
1575
end else begin
1576
   assign spr_access_ack[`OR1K_SPR_PM_BASE] = 0;
1577
   assign spr_internal_read_dat[`OR1K_SPR_PM_BASE] = 0;
1578
end
1579
endgenerate
1580
 
1581
generate
1582
if (FEATURE_FPU!="NONE") begin : fpu_ctrl
1583
   assign spr_access_ack[`OR1K_SPR_FPU_BASE] = spr_bus_ack_fpu_i;
1584
   assign spr_internal_read_dat[`OR1K_SPR_FPU_BASE] =
1585
     spr_bus_dat_fpu_i &
1586
     {OPTION_OPERAND_WIDTH{spr_access[`OR1K_SPR_FPU_BASE]}};
1587
end else begin
1588
   assign spr_access_ack[`OR1K_SPR_FPU_BASE] = 0;
1589
   assign spr_internal_read_dat[`OR1K_SPR_FPU_BASE] = 0;
1590
end
1591
endgenerate
1592
 
1593
endmodule // mor1kx_ctrl_cappuccino

powered by: WebSVN 2.1.0

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