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

powered by: WebSVN 2.1.0

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