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

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

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 alirezamon
 /* ****************************************************************************
2
  This Source Code Form is subject to the terms of the
3
  Open Hardware Description License, v. 1.0. If a copy
4
  of the OHDL was not distributed with this file, You
5
  can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
  Description: mor1kx pronto espresso fetch unit
8
 
9
  Fetch insn, advance PC (or take new branch address) on padv_i.
10
 
11
  What we might want to do is have a 1-insn buffer here, so when the current
12
  insn is fetched, but the main pipeline doesn't want it yet
13
 
14
  indicate ibus errors
15
 
16
  Copyright (C) 2012 Authors
17
 
18
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
19
 
20
***************************************************************************** */
21
 
22
`include "mor1kx-defines.v"
23
 
24
module mor1kx_fetch_prontoespresso
25
  (/*AUTOARG*/
26
   // Outputs
27
   ibus_adr_o, ibus_req_o, ibus_burst_o, decode_insn_o, fetched_pc_o,
28
   fetch_ready_o, fetch_rfa_adr_o, fetch_rfb_adr_o, fetch_rf_re_o,
29
   pc_fetch_next_o, decode_except_ibus_err_o, fetch_sleep_o,
30
   fetch_quick_branch_o, spr_bus_dat_ic_o, spr_bus_ack_ic_o,
31
   // Inputs
32
   clk, rst, ibus_err_i, ibus_ack_i, ibus_dat_i, ic_enable, padv_i,
33
   branch_occur_i, branch_dest_i, ctrl_insn_done_i, du_restart_i,
34
   du_restart_pc_i, fetch_take_exception_branch_i, execute_waiting_i,
35
   du_stall_i, stepping_i, flag_i, flag_clear_i, flag_set_i,
36
   spr_bus_addr_i, spr_bus_we_i, spr_bus_stb_i, spr_bus_dat_i
37
   );
38
 
39
   parameter OPTION_OPERAND_WIDTH = 32;
40
   parameter OPTION_RF_ADDR_WIDTH = 5;
41
   parameter OPTION_RESET_PC = {{(OPTION_OPERAND_WIDTH-13){1'b0}},
42
                                `OR1K_RESET_VECTOR,8'd0};
43
   // Mini cache registers, signals
44
   parameter FEATURE_INSTRUCTIONCACHE = "NONE";
45
   parameter OPTION_ICACHE_BLOCK_WIDTH = 3; // 3 for 8 words
46
   parameter FEATURE_QUICK_BRANCH_DETECTION = "NONE";
47
 
48
   input clk, rst;
49
 
50
   // interface to ibus
51
   output [OPTION_OPERAND_WIDTH-1:0] ibus_adr_o;
52
   output                            ibus_req_o;
53
   output                            ibus_burst_o;
54
   input                             ibus_err_i;
55
   input                             ibus_ack_i;
56
   input [`OR1K_INSN_WIDTH-1:0]      ibus_dat_i;
57
   input                             ic_enable;
58
 
59
   // pipeline control input
60
   input                              padv_i;
61
 
62
   // interface to decode unit
63
   output reg [`OR1K_INSN_WIDTH-1:0]  decode_insn_o;
64
 
65
   // PC of the current instruction, SPR_PPC basically
66
   output     [OPTION_OPERAND_WIDTH-1:0] fetched_pc_o;
67
 
68
   // Indication to pipeline control that the fetch stage is ready
69
   output                                fetch_ready_o;
70
 
71
   // Signals going to register file to do the read access as we
72
   // register the instruction out to the decode stage
73
   output [OPTION_RF_ADDR_WIDTH-1:0]      fetch_rfa_adr_o;
74
   output [OPTION_RF_ADDR_WIDTH-1:0]      fetch_rfb_adr_o;
75
   output                                fetch_rf_re_o;
76
 
77
   // Signal back to the control
78
   output [OPTION_OPERAND_WIDTH-1:0]      pc_fetch_next_o;
79
 
80
 
81
   // branch/jump indication
82
   input                                  branch_occur_i;
83
   input [OPTION_OPERAND_WIDTH-1:0]        branch_dest_i;
84
 
85
   // Instruction "retire" indication from control stage
86
   input                                  ctrl_insn_done_i;
87
 
88
   // restart signals from debug unit
89
   input                                  du_restart_i;
90
   input [OPTION_OPERAND_WIDTH-1:0]        du_restart_pc_i;
91
 
92
   input                                  fetch_take_exception_branch_i;
93
 
94
   input                                  execute_waiting_i;
95
 
96
   // CPU is stalled
97
   input                                  du_stall_i;
98
 
99
   // We're single stepping - this should cause us to fetch only a single insn
100
   input                                  stepping_i;
101
 
102
   // Flag status information
103
   input                                  flag_i, flag_clear_i, flag_set_i;
104
 
105
   // instruction ibus error indication out
106
   output reg                             decode_except_ibus_err_o;
107
 
108
   // fetch sleep mode enabled (due to jump-to-self instruction
109
   output                                 fetch_sleep_o;
110
 
111
   // Indicate to the control stage that we had zero delay fetching
112
   // the branch target address
113
   output                                 fetch_quick_branch_o;
114
 
115
   // SPR interface
116
   input [15:0]                    spr_bus_addr_i;
117
   input                                  spr_bus_we_i;
118
   input                                  spr_bus_stb_i;
119
   input [OPTION_OPERAND_WIDTH-1:0]        spr_bus_dat_i;
120
   output [OPTION_OPERAND_WIDTH-1:0]       spr_bus_dat_ic_o;
121
   output                                 spr_bus_ack_ic_o;
122
 
123
 
124
   // Registers
125
   reg [OPTION_OPERAND_WIDTH-1:0]          pc;
126
   reg [OPTION_OPERAND_WIDTH-1:0]         fetched_pc;
127
   reg                                    fetch_req;
128
   reg                                    next_insn_will_branch;
129
   reg                                    have_early_pc_next;
130
   reg                                    jump_insn_in_decode;
131
   reg                                    took_early_calc_pc;
132
   reg [1:0]                               took_early_calc_pc_r;
133
   reg                                    padv_r;
134
   reg                                    took_branch;
135
   reg                                    took_branch_r;
136
   reg                                    execute_waiting_r;
137
   reg                                    sleep;
138
   reg                                    complete_current_req;
139
   reg                                    no_rf_read;
140
   reg                                    new_insn_wasnt_ready;
141
   reg                                    took_early_pc_onto_cache_hit;
142
   reg                                    waited_with_early_pc_onto_cache_hit;
143
 
144
   // Wires
145
   wire [`OR1K_INSN_WIDTH-1:0]             new_insn;
146
   wire                                   new_insn_ready;
147
   wire [OPTION_OPERAND_WIDTH-1:0]         pc_fetch_next;
148
   wire [OPTION_OPERAND_WIDTH-1:0]         pc_plus_four;
149
   wire [OPTION_OPERAND_WIDTH-1:0]         early_pc_next;
150
   wire                                   padv_deasserted;
151
   wire                                   padv_asserted;
152
   wire [`OR1K_OPCODE_WIDTH-1:0]           next_insn_opcode;
153
   wire                                   will_go_to_sleep;
154
   wire                                   mini_cache_hit;
155
   wire                                   mini_cache_hit_ungated;
156
   wire [`OR1K_INSN_WIDTH-1:0]             mini_cache_insn;
157
   wire                                   hold_decode_output;
158
   wire                                   next_instruction_to_decode_condition;
159
 
160
   assign pc_plus_four          = pc + 4;
161
 
162
   assign pc_fetch_next         = have_early_pc_next ?
163
                                  early_pc_next : pc_plus_four;
164
 
165
   assign ibus_adr_o            = pc;
166
   assign ibus_req_o            = (fetch_req & !(fetch_take_exception_branch_i/* | branch_occur_i*/)
167
                                  // This is needed in the case that:
168
                                  // 1. a burst just finished and ack in went low because of this
169
                                  // 2. the instruction we just ACKed is a multicycle insn so the
170
                                  //    execute_waiting_i goes high, but the bus interface will have
171
                                  //    already put out the request onto the bus. It causes a bug
172
                                  //    if we deassert the req from here 1 cycle later, so put this
173
                                  //    signal into the assign logic so that the first cycle of it
174
                                  //    causes req to go low, after which fetch_req is deasserted
175
                                  //    and should handle it
176
                                  & !(execute_waiting_i & fetch_req)
177
                                  & !mini_cache_hit_ungated) |
178
                                  complete_current_req;
179
   assign ibus_burst_o          = 0;
180
 
181
   assign fetch_ready_o         = new_insn_ready | jump_insn_in_decode | ibus_err_i;
182
 
183
   assign pc_fetch_next_o       = pc_fetch_next;
184
 
185
   assign new_insn              = mini_cache_hit ? mini_cache_insn : ibus_dat_i;
186
 
187
   assign new_insn_ready        = mini_cache_hit | ibus_ack_i;
188
 
189
   // Register file control
190
   assign fetch_rfa_adr_o       = new_insn_ready ? new_insn[`OR1K_RA_SELECT] : 0;
191
   assign fetch_rfb_adr_o       = new_insn_ready ? new_insn[`OR1K_RB_SELECT] : 0;
192
   assign fetch_rf_re_o         = new_insn_ready & (padv_i | stepping_i) &
193
                                  !(no_rf_read | hold_decode_output);
194
 
195
   // Pick out opcode of next instruction to go to decode stage
196
   assign next_insn_opcode      = new_insn[`OR1K_OPCODE_SELECT];
197
 
198
   // Can calculate next PC based on instruction coming in
199
   assign early_pc_next = {OPTION_OPERAND_WIDTH{have_early_pc_next}} &
200
                          ({{4{new_insn[25]}},
201
                            new_insn[`OR1K_JUMPBRANCH_IMMEDIATE_SELECT],
202
                            2'b00} + pc);
203
 
204
   assign will_go_to_sleep = have_early_pc_next &
205
                             (early_pc_next == pc);
206
 
207
   assign fetch_sleep_o = sleep;
208
 
209
   // The pipeline advance signal deasserted for the instruction
210
   // we just put out, and we're still attempting to fetch. This should
211
   // result in a deassert cycle on the request signal out to the bus.
212
   // But, we don't want this to indicate when padv_i was deasserted for
213
   // a branch, because we will know about that, we just want this to
214
   // indicate it was deasserted for other reasons.
215
   assign padv_deasserted = padv_r & !padv_i & fetch_req & !took_branch;
216
 
217
   assign padv_asserted = !padv_r & padv_i;
218
 
219
   // This makes us hold the decode stage output for an additional
220
   // cycle when we've already got the next instruction in the
221
   // register output to the decode stage, but the pipeline has
222
   // stalled.
223
   assign hold_decode_output = (padv_asserted &
224
                                mini_cache_hit & took_branch_r &
225
                                !new_insn_wasnt_ready &
226
                                took_early_calc_pc_r[1]) ||
227
                               waited_with_early_pc_onto_cache_hit;
228
   always @*
229
     if (new_insn_ready)
230
       case (next_insn_opcode)
231
         `OR1K_OPCODE_J,
232
         `OR1K_OPCODE_JAL: begin
233
            have_early_pc_next          = 1;
234
            next_insn_will_branch       = 1;
235
            no_rf_read                  = 1;
236
         end
237
         `OR1K_OPCODE_JR,
238
         `OR1K_OPCODE_JALR: begin
239
            have_early_pc_next          = 0;
240
            next_insn_will_branch       = 1;
241
            no_rf_read                  = 0;
242
         end
243
         `OR1K_OPCODE_BNF: begin
244
            have_early_pc_next          = !(flag_i | flag_set_i) | flag_clear_i;
245
            next_insn_will_branch       = !(flag_i | flag_set_i) | flag_clear_i;
246
            no_rf_read                  = 1;
247
         end
248
         `OR1K_OPCODE_BF: begin
249
            have_early_pc_next          = !(!flag_i | flag_clear_i) |flag_set_i;
250
            next_insn_will_branch       = !(!flag_i | flag_clear_i) |flag_set_i;
251
            no_rf_read                  = 1;
252
         end
253
         `OR1K_OPCODE_SYSTRAPSYNC,
254
         `OR1K_OPCODE_RFE: begin
255
            have_early_pc_next          = 0;
256
            next_insn_will_branch       = 1;
257
            no_rf_read                  = 1;
258
         end
259
         default: begin
260
           have_early_pc_next           = 0;
261
           next_insn_will_branch        = 0;
262
           no_rf_read                   = 0;
263
         end
264
       endcase // case (next_insn_opcode)
265
     else
266
       begin
267
          have_early_pc_next            = 0;
268
          next_insn_will_branch         = 0;
269
          no_rf_read                    = 0;
270
       end
271
 
272
   always @(posedge clk `OR_ASYNC_RST)
273
     if (rst)
274
       begin
275
          pc            <= OPTION_RESET_PC;
276
          fetched_pc    <= OPTION_RESET_PC;
277
       end
278
     else if (branch_occur_i & !took_early_calc_pc)
279
       begin
280
          pc            <= branch_dest_i;
281
       end
282
     else if (fetch_take_exception_branch_i & !du_stall_i)
283
       begin
284
          pc            <= branch_dest_i;
285
       end
286
     else if (new_insn_ready & (padv_i | stepping_i) &
287
              !hold_decode_output)
288
       begin
289
          pc            <= pc_fetch_next_o;
290
          fetched_pc    <= pc;
291
       end
292
     else if (du_restart_i)
293
       begin
294
          pc            <= du_restart_pc_i;
295
       end
296
     else if (fetch_take_exception_branch_i & du_stall_i)
297
       begin
298
          pc            <= du_restart_pc_i;
299
       end
300
 
301
   always @(posedge clk `OR_ASYNC_RST)
302
     if (rst)
303
       new_insn_wasnt_ready <= 0;
304
     else if (branch_occur_i & !took_early_calc_pc)
305
       new_insn_wasnt_ready <= !new_insn_ready;
306
     else if (new_insn_ready & (padv_i | stepping_i) & !padv_deasserted)
307
       new_insn_wasnt_ready <= 0;
308
 
309
   assign fetched_pc_o = fetched_pc;
310
 
311
   assign next_instruction_to_decode_condition = new_insn_ready &
312
                                                 (padv_i | stepping_i) &
313
                                                 !padv_deasserted &
314
                                                 !hold_decode_output &
315
                                                 !((branch_occur_i & padv_i &
316
                                                    !took_early_calc_pc) |
317
                                                   fetch_take_exception_branch_i);
318
 
319
 
320
   always @(posedge clk `OR_ASYNC_RST)
321
     if (rst)
322
       decode_insn_o <= {`OR1K_OPCODE_NOP,26'd0};
323
     else if (sleep | du_stall_i)
324
       decode_insn_o <= {`OR1K_OPCODE_NOP,26'd0};
325
     else if (next_instruction_to_decode_condition)
326
       decode_insn_o <= new_insn;
327
     else if (branch_occur_i & padv_i)
328
       // We've just taken a branch, put a nop on the
329
       // instruction to the rest of the pipeline
330
       decode_insn_o <= {`OR1K_OPCODE_NOP,26'd0};
331
     else if (fetch_take_exception_branch_i)
332
       // Exception was just taken, get rid of whatever
333
       // we're outputting
334
       decode_insn_o <= {`OR1K_OPCODE_NOP,26'd0};
335
     else if (took_early_calc_pc)
336
       // This covers the case where, for some reason,
337
       // we don't get the branch_occur_i
338
       decode_insn_o <= {`OR1K_OPCODE_NOP,26'd0};
339
     else if (ctrl_insn_done_i & !new_insn_ready)
340
       // If the current instruction in the decode stage is retired
341
       // then let's put a no-op back in the pipeline
342
       decode_insn_o <= {`OR1K_OPCODE_NOP,26'd0};
343
 
344
   always @(posedge clk `OR_ASYNC_RST)
345
     if (rst)
346
       fetch_req <= 1'b1;
347
     else if (fetch_req & stepping_i & new_insn_ready)
348
       // Deassert on ack
349
       fetch_req <= 1'b0;
350
     else if (!fetch_req & du_stall_i)
351
       fetch_req <= 1'b0;
352
     else if (ibus_err_i)
353
       fetch_req <= 1'b0;
354
     else if (sleep)
355
       fetch_req <= 1'b0;
356
     else if (next_insn_will_branch)
357
       fetch_req <= 1'b0;
358
     else if (execute_waiting_i)
359
       /*
360
        Put the execute wait signal through this register to break any long
361
        chains of logic from the execute stage (LSU, ALU) which could result
362
        from using it to just gate the req signal out.
363
        TODO - actually check the impact of gating fetch_req_o with
364
               execute_waiting_i
365
        */
366
       fetch_req <= 1'b0;
367
     else if (padv_deasserted)
368
       fetch_req <= 1'b0;
369
     else if (mini_cache_hit_ungated)
370
       // We'll get this ungated signal immediately after we've
371
       // terminated a burst, so we'll know if we really should
372
       // fetch the branch target or whether it's in cache.
373
       fetch_req <= 1'b0;
374
     else
375
       fetch_req <= 1'b1;
376
 
377
   always @(posedge clk `OR_ASYNC_RST)
378
     if (rst)
379
       took_early_pc_onto_cache_hit <= 0;
380
     else if (padv_i)
381
       took_early_pc_onto_cache_hit <= took_early_calc_pc & mini_cache_hit &
382
                                        !fetch_take_exception_branch_i;
383
     else if (ctrl_insn_done_i)
384
       took_early_pc_onto_cache_hit <= 0;
385
 
386
   // This register signifies when:
387
   // a) we had a branch to somewhere where we took the early calculated PC and
388
   //    that branch location was a hit in the cache
389
   // b) the subsequent instruction wasn't in the cache, so we put the
390
   //    insn out to the decode stage, but wasn't immediately retired by the
391
   //    control stage, so we must wait until the next instruction is ready
392
   //    before it will be completed by the control stage
393
   always @(posedge clk `OR_ASYNC_RST)
394
     if (rst)
395
       waited_with_early_pc_onto_cache_hit <= 0;
396
     else if (took_branch_r | padv_i)
397
       waited_with_early_pc_onto_cache_hit <= took_early_pc_onto_cache_hit &
398
                                               !fetch_ready_o;
399
     else if (ctrl_insn_done_i)
400
       waited_with_early_pc_onto_cache_hit <= 0;
401
 
402
   always @(posedge clk `OR_ASYNC_RST)
403
     if (rst)
404
       jump_insn_in_decode <= 0;
405
     else if (sleep)
406
       jump_insn_in_decode <= 0;
407
     else if (!jump_insn_in_decode & next_insn_will_branch & new_insn_ready & padv_i)
408
       jump_insn_in_decode <= 1;
409
     else
410
       jump_insn_in_decode <= 0;
411
 
412
   always @(posedge clk `OR_ASYNC_RST)
413
     if (rst)
414
       took_early_calc_pc <= 0;
415
     else if (sleep)
416
       took_early_calc_pc <= 0;
417
     else if (next_insn_will_branch & have_early_pc_next & padv_i)
418
       took_early_calc_pc <= 1;
419
     else
420
       took_early_calc_pc <= 0;
421
 
422
   always @(posedge clk `OR_ASYNC_RST)
423
     if (rst)
424
       took_early_calc_pc_r <= 0;
425
     else
426
       took_early_calc_pc_r <= {took_early_calc_pc_r[0], took_early_calc_pc};
427
 
428
   always @(posedge clk)
429
     padv_r <= padv_i;
430
 
431
   /* Whether it was early branch or not, we've branched, and this
432
    signal will be asserted the cycle after. */
433
   always @(posedge clk)
434
     begin
435
        took_branch <= (branch_occur_i | fetch_take_exception_branch_i) &
436
                       fetch_ready_o;
437
        took_branch_r <= took_branch;
438
     end
439
 
440
   always @(posedge clk `OR_ASYNC_RST)
441
     if (rst)
442
       decode_except_ibus_err_o <= 0;
443
     else if ((padv_i | fetch_take_exception_branch_i) &
444
              branch_occur_i | du_stall_i)
445
       decode_except_ibus_err_o <= 0;
446
     else if (fetch_req)
447
       decode_except_ibus_err_o <= ibus_err_i;
448
 
449
   always @(posedge clk `OR_ASYNC_RST)
450
     if (rst)
451
       sleep <= 1'b0;
452
     else if (fetch_take_exception_branch_i | du_stall_i)
453
       sleep <= 1'b0;
454
     else if (will_go_to_sleep & !stepping_i)
455
       sleep <= 1'b1;
456
 
457
   // A signal to make sure the request out line stays high
458
   // if we've already issued an instruction request and padv_i
459
   // goes low.
460
   always @(posedge clk `OR_ASYNC_RST)
461
     if (rst)
462
       complete_current_req <= 0;
463
     else if (fetch_req & padv_deasserted & !new_insn_ready)
464
      complete_current_req  <= 1;
465
     else if (new_insn_ready & complete_current_req)
466
       complete_current_req <= 0;
467
 
468
   // Mini cache logic
469
   genvar                                            i;
470
   generate
471
      /* verilator lint_off WIDTH */
472
      if (FEATURE_INSTRUCTIONCACHE != "ENABLED")
473
      /* verilator lint_on WIDTH */
474
        begin : no_mini_cache
475
           assign mini_cache_hit = 0;
476
           assign mini_cache_hit_ungated = 0;
477
           assign mini_cache_insn = {`OR1K_INSN_WIDTH{1'b0}};
478
           assign fetch_quick_branch_o = 0;
479
        end
480
      else
481
        begin : mini_cache
482
           localparam NUMBER_MINI_CACHE_WORDS =  (1<<OPTION_ICACHE_BLOCK_WIDTH);
483
           localparam MINI_CACHE_TAG_END      = OPTION_ICACHE_BLOCK_WIDTH+2;
484
 
485
           reg mini_cache_tag_valid [0:NUMBER_MINI_CACHE_WORDS-1];
486
           wire mini_cache_fill_condition;
487
           wire invalidate;
488
           reg [`OR1K_INSN_WIDTH-1:0] mini_cache [0:NUMBER_MINI_CACHE_WORDS-1];
489
           reg [OPTION_OPERAND_WIDTH-1:MINI_CACHE_TAG_END] mini_cache_tag [0:NUMBER_MINI_CACHE_WORDS-1];
490
           wire [OPTION_OPERAND_WIDTH-1:MINI_CACHE_TAG_END] pc_tag;
491
           wire [OPTION_ICACHE_BLOCK_WIDTH-1:0]      pc_word_sel;
492
           wire [`OR1K_INSN_WIDTH-1:0]               mini_cache_branch_dest_insn;
493
 
494
           // This is the address we'll write into the tag
495
           assign pc_word_sel    = pc[OPTION_ICACHE_BLOCK_WIDTH+1:2];
496
           assign pc_tag         = pc[OPTION_OPERAND_WIDTH-1:MINI_CACHE_TAG_END];
497
 
498
           assign mini_cache_hit_ungated = mini_cache_tag_valid[pc_word_sel] &
499
                                           mini_cache_tag[pc_word_sel]==pc_tag;
500
 
501
           assign mini_cache_hit      = mini_cache_hit_ungated & !took_branch &
502
                                        !fetch_take_exception_branch_i;
503
 
504
           assign mini_cache_insn     = mini_cache[pc_word_sel];
505
 
506
           assign mini_cache_fill_condition = ibus_ack_i & !ibus_err_i &
507
                                              !will_go_to_sleep;
508
 
509
           assign invalidate = spr_bus_stb_i & spr_bus_we_i &
510
                               (spr_bus_addr_i == `OR1K_SPR_ICBIR_ADDR);
511
 
512
           assign fetch_quick_branch_o = took_branch & mini_cache_hit;
513
 
514
           assign spr_bus_ack_ic_o     = 1'b1;
515
 
516
           for (i=0;i<NUMBER_MINI_CACHE_WORDS;i=i+1)
517
             begin : flop_cache_control
518
                always @(posedge clk `OR_ASYNC_RST)
519
                  if (rst)
520
                    begin
521
                       mini_cache_tag[i]        <= 'd0;
522
                       mini_cache_tag_valid[i]  <= 1'b0;
523
                    end
524
                  else if (invalidate/* | !ic_enable*/ | du_stall_i)
525
                    begin
526
                       // Invalidate all tags on:
527
                       // 1) any write to the block-invalidate register
528
                       // 2) when the cache isn't enabled
529
                       // 3) whenever we're stalled - things may change
530
                       //    under our feet and it helps make things
531
                       //    easy when coming out of stall or stepping
532
                       mini_cache_tag_valid[i]  <= 1'b0;
533
                    end
534
                  else if (mini_cache_fill_condition &
535
                           pc_word_sel==i[OPTION_ICACHE_BLOCK_WIDTH-1:0])
536
                    begin
537
                       mini_cache_tag[i]        <= pc_tag;
538
                       mini_cache_tag_valid[i]  <= 1'b1;
539
                       mini_cache[i]            <= ibus_dat_i;
540
                    end
541
             end
542
 
543
        end // block: mini_cache
544
   endgenerate
545
 
546
   assign spr_bus_ack_ic_o = 1'b1;
547
   assign spr_bus_dat_ic_o = {OPTION_OPERAND_WIDTH{1'b0}};
548
 
549
endmodule // mor1kx_fetch_prontoespresso

powered by: WebSVN 2.1.0

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