OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [orpsocv2/] [boards/] [xilinx/] [atlys/] [rtl/] [verilog/] [xilinx_ddr2/] [xilinx_ddr2_if.v] - Blame information for rev 677

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 627 stekern
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Xilinx Spartan-6 DDR2 controller Wishbone Interface         ////
4
////                                                              ////
5
////  Description                                                 ////
6
////  Simple interface to the Xilinx MIG generated DDR2 controller////
7
////                                                              ////
8
////  To Do:                                                      ////
9
////   Use full capacity of BRAM                                  ////
10
////   Employ LRU replacement scheme                              ////
11
////   Remove hard-coding of things relating to number of lines   ////
12
////                                                              ////
13
////  Author(s):                                                  ////
14
////      - Julius Baxter, julius.baxter@orsoc.se                 ////
15
////      - Stefan Kristiansson, stefan.kristiansson@saunalahti.fi////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2010 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
/*
44
 * This is an interface to the Xilinx MIG-sourced DDR2 controller.
45
 *
46
 * The interface is based on the ML501 Virtex-5 board implementation
47
 * with the following adaptions to suite the Atlys Spartan-6 MIG and
48
 * DDR2 memory chip:
49
 * - Control and data FIFOs are clocked with the Wishbone bus clock
50
 *   and not the DDR2 clock.
51
 *   This way alot of clock domain crossing headaches can be avoided
52
 *   (Virtex-5 MIG demands control and data FIFOs clocks to be
53
 *   synchronous with the DDR2 clock, Spartan-6 have FIFOs that
54
 *   are asynchronous to the DDR2 clock)
55
 * - The Atlys board have a DDR2 memory with a 16-bit data bus
56
 *   apposed to the ML501 64-bit databus. This in combination
57
 *   with changes in the MIG causes the addressing scheme to be a
58
 *   bit different. A user port of 128-bit is being used, so
59
 *   we are doing memory accesses on 128-bit boundaries
60
 *   (4 address bits).
61
 *
62
 * See the Xilinx user guide UG388.pdf for more information on the
63
 * Spartan-6 FPGA memory controller
64
 *
65
 *
66
 * The controller's interface is via FIFO buffers - one for address and control
67
 * the other is for data. The data FIFO interface is 128-bits wide.
68
 *
69
 * This module has a cache with different aspects on each port. As we're to
70
 * ultimately interface to a 32-bit wide Wishbone bus, one side is 32-bits
71
 * and the other is 128-bits wide to accommodate the DDR2 controller's data
72
 * path.
73
 *
74
 * At present, the cache controller doesn't employ associativity, so any
75
 * line can be used for any location. A round-robin approach to line
76
 * use is employed. TODO is LRU scheme instead of round robin.
77
 *
78
 * The cache is a macro generated by Xilinx's IP generation tool. This is
79
 * because memories with dual-aspect ratios cannot be inferred via HDL.
80
 *
81
 * The size of lines, as set by the defines, controls how long each read
82
 * and write burst to/from the SDRAM is.
83
 *
84
 * The control and data FIFOS of the DDR2 interface are asynchronous to the DDR2 bus,
85
 * so they are clocked with the same clock as the Wisbone interface (i.e. wb_clk)
86
*/
87
module xilinx_ddr2_if (
88
    input [31:0]       wb_adr_i,
89
    input              wb_stb_i,
90
    input              wb_cyc_i,
91
    input [2:0]        wb_cti_i,
92
    input [1:0]        wb_bte_i,
93
    input              wb_we_i,
94
    input [3:0]        wb_sel_i,
95
    input [31:0]       wb_dat_i,
96
    output [31:0]      wb_dat_o,
97
    output reg         wb_ack_o,
98
 
99
    output [12:0]      ddr2_a,
100
    output [2:0]       ddr2_ba,
101
    output             ddr2_ras_n,
102
    output             ddr2_cas_n,
103
    output             ddr2_we_n,
104
    output             ddr2_rzq,
105
    output             ddr2_zio,
106
    output             ddr2_odt,
107
    output             ddr2_cke,
108
    output             ddr2_dm,
109
    output             ddr2_udm,
110
 
111
    inout [15:0]       ddr2_dq,
112
    inout              ddr2_dqs,
113
    inout              ddr2_dqs_n,
114
    inout              ddr2_udqs,
115
    inout              ddr2_udqs_n,
116
    output             ddr2_ck,
117
    output             ddr2_ck_n,
118
 
119
    input              ddr2_if_clk,
120
    input              ddr2_if_rst,
121
    input              idly_clk_100,
122
    input              wb_clk,
123
    input              wb_rst);
124
 
125
`include "xilinx_ddr2_params.v"
126
 
127
   // Define to add a counter, signaling error if the controller locks up
128
   // (no ack after a certain period of time)
129
   //`define ERR_COUNTER
130
 
131
/*
132
`define DDR2_CACHE_NUM_LINES 16
133
`define DDR2_CACHE_NUM_LINES_ENC_WIDTH 4 // log2(`DDR2_CACHE_NUM_LINES)
134
 */
135
`define DDR2_CACHE_NUM_LINES 4
136
`define DDR2_CACHE_NUM_LINES_ENC_WIDTH 2 // log2(`DDR2_CACHE_NUM_LINES)
137
 
138
`define DDR2_CACHE_NUM_WORDS_PER_LINE 256
139
`define DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE 8
140
`define DDR2_CACHE_TAG_ADDR_WIDTH (32-`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE-2)
141
 
142
`define DDR2_CACHE_DDR2_SIDE_NUM_WORDS_PER_LINE (`DDR2_CACHE_NUM_WORDS_PER_LINE/4)
143
`define DDR2_CACHE_DDR2_SIDE_ADDR_WIDTH_NUM_WORDS_PER_LINE (`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE - 2)
144
`define DDR2_CACHE_DDR2_SIDE_ADDR_WIDTH (`DDR2_CACHE_NUM_LINES_ENC_WIDTH + `DDR2_CACHE_DDR2_SIDE_ADDR_WIDTH_NUM_WORDS_PER_LINE)
145
 
146
`define DDR2_CACHE_TAG_BITS 31:(`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE+2)
147
 
148
   wire                ddr2_clk; // DDR2 iface domain clock.
149
   wire                ddr2_rst; // reset from the ddr2 module
150
 
151
   wire                wb_req;
152
   reg                 wb_req_r;
153
   reg                 wb_ack_o_r;
154
 
155
   wire                wb_req_new;
156
   reg                 wb_req_new_r;
157
 
158
   wire                wb_req_addr_hit;
159
 
160
   wire                cached_addr_valid;
161
 
162
 
163
   wire [31:(32 -`DDR2_CACHE_TAG_ADDR_WIDTH)] cached_addr;
164
 
165
// Spartan-6 MIG doesn't have any defines for the DDR2 burst length, 
166
// only burst length for user data.
167
// Our user port is 128-bit
168
//`define DDR2_BURSTLENGTH_1
169
//`define DDR2_BURSTLENGTH_2
170
//`define DDR2_BURSTLENGTH_4
171
//`define DDR2_BURSTLENGTH_8
172
`define DDR2_BURSTLENGTH_16
173
 
174
`ifdef DDR2_BURSTLENGTH_1
175
  `define DDR2_BURST_DW128_ADDR_WIDTH 2 // = log2(burst of 1 128-bits = 4 words)
176
  `define DDR2_ADDR_ALIGN             4
177
`elsif DDR2_BURSTLENGTH_2
178
  `define DDR2_BURST_DW128_ADDR_WIDTH 3 // = log2(burst of 2 128-bits = 8 words)
179
  `define DDR2_ADDR_ALIGN             5
180
`elsif DDR2_BURSTLENGTH_4
181
  `define DDR2_BURST_DW128_ADDR_WIDTH 4 // = log2(burst of 4 128-bits = 16 words)
182
  `define DDR2_ADDR_ALIGN             6
183
`elsif DDR2_BURSTLENGTH_8
184
  `define DDR2_BURST_DW128_ADDR_WIDTH 5 // = log2(burst of 8 128-bits = 32 words)
185
  `define DDR2_ADDR_ALIGN             7
186
`elsif DDR2_BURSTLENGTH_16
187
  `define DDR2_BURST_DW128_ADDR_WIDTH 6 // = log2(burst of 16 128-bits = 64 words)
188
  `define DDR2_ADDR_ALIGN             8
189
`endif
190
 
191
   // This counts how many addresses we should write to the fifo - the number 
192
   // of discrete FIFO transactions.
193
   reg [`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE-`DDR2_BURST_DW128_ADDR_WIDTH - 1:0] addr_counter;
194
 
195
   wire                cache_write;
196
 
197
   wire                cache_hit;
198
 
199
   wire                wb_cache_en;
200
 
201
   reg                 do_writeback, do_writeback_r;
202
   wire                do_writeback_start, do_writeback_finished;
203
   // Wire to indicate writing to data FIFO of MIG has completed
204
   reg                 do_writeback_data_finished;
205
 
206
   // Wire to indicate that address FIFO of MIG should be written to to 
207
   // initiate memory accesses.
208
   reg                 do_writeback_addresses, do_writeback_addresses_r;
209
 
210
   reg                 do_readfrom, do_readfrom_r;
211
   wire                do_readfrom_start, do_readfrom_finished;
212
   wire                doing_readfrom;
213
 
214
   reg                 do_af_write;
215
 
216
   reg                 do_writeback_ddr2_fifo_we;
217
   reg                 ddr2_write_done;
218
   reg [`DDR2_CACHE_DDR2_SIDE_ADDR_WIDTH_NUM_WORDS_PER_LINE - 1:0] ddr2_cache_line_word_addr;
219
   wire [127:0]        ddr2_cache_data_o;
220
   reg                 rd_data_valid_r;
221
   reg                 ddr2_read_done;
222
 
223
   // DDR2 MIG interface wires
224
   wire                ddr2_p0_cmd_en;
225
   wire [30:0]         ddr2_p0_cmd_byte_addr;
226
   wire [2:0]           ddr2_p0_cmd_instr;
227
   wire                ddr2_p0_cmd_full;
228
   wire                ddr2_p0_cmd_empty;
229
   wire [5:0]          ddr2_p0_cmd_bl;
230
   wire                ddr2_p0_wr_en;
231
   wire [(C3_P0_DATA_PORT_SIZE)-1:0] ddr2_p0_wr_data;
232
   wire [(C3_P0_MASK_SIZE)-1:0]      ddr2_p0_wr_mask;
233
   wire                ddr2_p0_wr_full;
234
   wire                ddr2_p0_wr_empty;
235
   wire [6:0]          ddr2_p0_wr_count;
236
   wire                ddr2_p0_wr_underrun;
237
   wire                ddr2_p0_wr_error;
238
   wire                ddr2_p0_rd_en;
239
   wire [(C3_P0_DATA_PORT_SIZE)-1:0] ddr2_p0_rd_data;
240
   wire                ddr2_p0_rd_full;
241
   wire                ddr2_p0_rd_empty;
242
   wire [6:0]          ddr2_p0_rd_count;
243
   wire                ddr2_p0_rd_overflow;
244
   wire                ddr2_p0_rd_error;
245
   wire                ddr2_calib_done;
246 677 stekern
   reg [1:0]           ddr2_calib_done_r;
247 627 stekern
 
248
   wire [30:0]         readfrom_af_addr;
249
   wire [30:0]          writeback_af_addr;
250
 
251
   wire [`DDR2_CACHE_NUM_LINES - 1 :0]   cache_line_addr_validate;
252
   wire [`DDR2_CACHE_NUM_LINES - 1 :0]   cache_line_addr_invalidate;
253
   wire [`DDR2_CACHE_NUM_LINES - 1 :0]   cache_line_addr_valid;
254
   wire [`DDR2_CACHE_NUM_LINES - 1 :0]   cache_line_hit;
255
   wire [`DDR2_CACHE_TAG_BITS]  cache_line_addr [0:`DDR2_CACHE_NUM_LINES-1] ;
256
 
257
   // Cache control signals
258
   // Wishbone side
259
   wire [`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE-1:0] wb_cache_adr;
260
   wire [3:0]                    wb_cache_sel_we;
261
   // DDR side
262
   wire                         ddr2_cache_en;
263
   wire [15:0]                   ddr2_cache_we;
264
 
265
   reg                          wb_bursting; // Indicate if burst is enabled
266
   reg [3:0]                     wb_burst_addr; // Burst counter, up to 16
267
   wire [1:0]                    wb_burst_addr_4beat;
268
   wire [2:0]                    wb_burst_addr_8beat;
269
   wire                         wb_burst_addr_incr;
270
   wire                         ack_err;
271
   reg                          ack_err_r;
272
 
273
 
274
   // Synchronisation signals
275
   reg                          sync, sync_r;
276
   wire                         sync_start;
277
   wire                         sync_done;
278
 
279
   // Decoded select line
280
   wire [`DDR2_CACHE_NUM_LINES-1:0] selected_cache_line;
281
   wire [`DDR2_CACHE_NUM_LINES_ENC_WIDTH-1:0] selected_cache_line_enc;
282
 
283
   genvar                                     i;
284
   generate
285
      for (i=0;i<`DDR2_CACHE_NUM_LINES;i=i+1) begin : cache_addr
286
         xilinx_ddr2_wb_if_cache_adr_reg cache_addr_reg_inst
287
           ( .adr_i(wb_adr_i[`DDR2_CACHE_TAG_BITS]),
288
             .validate(cache_line_addr_validate[i]),
289
             .invalidate(cache_line_addr_invalidate[i]),
290
             .cache_hit(cache_line_hit[i]),
291
             .adr_valid(cache_line_addr_valid[i]),
292
             .cached_adr_o(cache_line_addr[i]),
293
             .clk(wb_clk),
294
             .rst(wb_rst));
295
      end
296
   endgenerate
297
 
298
   wire start_writeback, start_fill;
299
 
300
   xilinx_ddr2_wb_if_cache_control xilinx_ddr2_wb_if_cache_control0
301
     (
302
      // Outputs
303
      .start_writeback                  (start_writeback),
304
      .start_fill                       (start_fill),
305
      .cache_line_validate              (cache_line_addr_validate),
306
      .cache_line_invalidate            (cache_line_addr_invalidate),
307
      .selected_cache_line              (selected_cache_line),
308
      .selected_cache_line_enc          (selected_cache_line_enc),
309
      .sync_done                        (sync_done),
310
      // Inputs
311
      .cache_line_addr_valid            (cache_line_addr_valid),
312
      .cache_line_addr_hit              (cache_line_hit),
313
      .wb_req                           (wb_req),
314
      .cache_write                      (cache_write),
315
      .writeback_done                   (do_writeback_finished),
316
      .fill_done                        (do_readfrom_finished),
317
      .sync_start                       (sync_start),
318
      .wb_clk                           (wb_clk),
319
      .wb_rst                           (wb_rst));
320
 
321
   defparam xilinx_ddr2_wb_if_cache_control0.num_lines = `DDR2_CACHE_NUM_LINES;
322
   defparam xilinx_ddr2_wb_if_cache_control0.num_lines_log2 = `DDR2_CACHE_NUM_LINES_ENC_WIDTH;
323
 
324
   assign cached_addr = selected_cache_line[0] ? cache_line_addr[0] :
325
                        selected_cache_line[1] ? cache_line_addr[1] :
326
                        selected_cache_line[2] ? cache_line_addr[2] :
327
                        selected_cache_line[3] ? cache_line_addr[3] : 0;
328
 
329
   assign cache_write = wb_req & wb_we_i & wb_ack_o;
330
 
331
   assign cache_hit = |(selected_cache_line & cache_line_hit);
332
 
333
   assign cached_addr_valid = |(selected_cache_line & cache_line_addr_valid);
334
 
335
   assign wb_req_addr_hit = (wb_req & cache_hit & cached_addr_valid);
336
 
337
   // Wishbone request detection
338 677 stekern
   assign wb_req = wb_stb_i & wb_cyc_i & ddr2_calib_done_r[0] & !sync;
339
 
340
   always @ (posedge wb_clk)
341
     ddr2_calib_done_r[1:0] <= {ddr2_calib_done, ddr2_calib_done_r[1]};
342 627 stekern
 
343
   always @(posedge wb_clk)
344
     wb_req_r <= wb_req;
345
 
346
   assign wb_req_new = wb_req & !wb_req_r;
347
 
348
   always @(posedge wb_clk)
349
     wb_req_new_r <= wb_req_new;
350
 
351
   always @(posedge wb_clk)
352
     if (wb_rst)
353
       wb_bursting <= 0;
354
   // Reset if acking end of transfer
355
     else if (wb_ack_o && wb_cti_i == 3'b111)
356
       wb_bursting <= 0;
357
   // Set if beginning new transaction and incrementing burst indicated
358
   // TODO - double check if this burst is going to go over a cache line
359
   // boundary - if so don't allow burst, fall back to classic cycles.
360
     else if (wb_req_new)
361
       wb_bursting <= (wb_cti_i == 3'b010);
362
 
363
   // Help constrain additions to appropriate bit-width for wrapping
364
   assign wb_burst_addr_4beat = wb_adr_i[3:2] + 1;
365
   assign wb_burst_addr_8beat = wb_adr_i[4:2] + 1;
366
 
367
   // Increment burst address whenever we get a hit when reading, or
368
   // when acking and writing.
369
   assign wb_burst_addr_incr = (wb_req_addr_hit & (!wb_we_i |
370
                                                (wb_we_i & wb_ack_o)));
371
 
372
   // Calculate burst address depending on burst type indicator
373
   always @(posedge wb_clk)
374
     if (wb_rst)
375
       wb_burst_addr <= 0;
376
     else if (wb_req_new)
377
       // When we have a bursting read to an address which is in cache then
378
       // initialise the address to the next word in the burst sequence.
379
       // If it's a miss, or it's a write, then we just take what's on the
380
       // bus.
381
       wb_burst_addr <= !(wb_req_addr_hit & !wb_we_i) ? wb_adr_i[5:2] :
382
                    wb_bte_i==2'b01 ? {wb_adr_i[5:4], wb_burst_addr_4beat }:
383
                    wb_bte_i==2'b10 ? {wb_adr_i[5], wb_burst_addr_8beat }:
384
                    wb_bte_i==2'b11 ? wb_adr_i[5:2] + 1 :
385
                    wb_adr_i[5:2];
386
     else if (wb_burst_addr_incr & wb_bte_i==2'b01)
387
       wb_burst_addr[1:0] <= wb_burst_addr[1:0] + 1;
388
     else if (wb_burst_addr_incr & wb_bte_i==2'b10)
389
       wb_burst_addr[2:0] <= wb_burst_addr[2:0] + 1;
390
     else if (wb_burst_addr_incr & wb_bte_i==2'b11)
391
       wb_burst_addr[3:0] <= wb_burst_addr[3:0] + 1;
392
 
393
`ifdef ERR_COUNTER
394
   reg [26:0] ack_err_cntr;
395
 
396
   always @(posedge wb_clk)
397
     if (wb_rst)
398
       ack_err_cntr <= 0;
399
     else if (!wb_req)
400
       ack_err_cntr <= 0;
401
     else if (|ack_err_cntr)
402
       ack_err_cntr <= ack_err_cntr + 1;
403
     else if (wb_req_new & !(|ack_err_cntr))
404
       ack_err_cntr <= 1;
405
 
406
   assign ack_err = (&ack_err_cntr);
407
 
408
   always @(posedge wb_clk)
409
     ack_err_r <= ack_err;
410
 
411
   assign wb_err_o = ack_err_r;
412
 
413
`else // !`ifdef ERR_COUNTER
414
 
415
   assign ack_err = 0;
416
   always @(posedge wb_clk)
417
     ack_err_r <= 0;
418
 
419
   assign wb_err_o = 0;
420
 
421
`endif
422
 
423
   always @(posedge wb_clk)
424
     if (wb_rst)
425
       wb_ack_o <= 0;
426
     else
427
       wb_ack_o <= wb_req_addr_hit &
428
                   (
429
                    // Simple acks on classic cycles
430
                    (!wb_bursting && !wb_ack_o && !wb_ack_o_r)
431
                    // De-assert ack when we see the final transaction
432
                    || (wb_bursting && !(wb_cti_i==3'b111))
433
                    );
434
 
435
   always @(posedge wb_clk)
436
     wb_ack_o_r <= wb_ack_o;
437
 
438
   // Logic controling synchronisation
439
   always @(posedge wb_clk)
440
     if (wb_rst)
441
       sync <= 0;
442
     else if (sync_done) // Sync. done indicator from cache controller
443
       sync <= 0;
444
 
445
   always @(posedge wb_clk)
446
     sync_r <= sync;
447
 
448
   assign sync_start = sync & !sync_r;
449
 
450
   task do_sync;
451
      begin
452
         // Wait for us to not be doing a transaction.
453
         while(wb_req)
454
           @wb_clk;
455
         // Cache not busy, initiate sync.
456
         sync = 1;
457
      end
458
   endtask // do_sync
459
 
460
   // Writeback/readfrom lower address generation
461
   always @(posedge wb_clk)
462
     if (wb_rst)
463
       addr_counter <= 0;
464
     else if (ddr2_p0_cmd_en)
465
       addr_counter <= addr_counter+1;
466
 
467
   // Determine if we're writing access requests into DDR2 interface AF
468
   always @(posedge wb_clk)
469
     if (wb_rst)
470
       do_af_write <= 0;
471
     else if (do_readfrom_start | do_writeback_data_finished)
472
       do_af_write <= 1;
473
     else if ((&addr_counter) & !ddr2_p0_cmd_full) // Stop when counter rolls over
474
       do_af_write <= 0;
475
 
476
   // Wishbone side of cache enable. Always enabled unless doing DDR2-side
477
   // things (fill or writeback).
478
   assign wb_cache_en = !(do_readfrom | do_writeback);
479
 
480
 
481
   // Writeback detect logic
482
   always @(posedge wb_clk)
483
     if (wb_rst)
484
       do_writeback <= 0;
485
     else if (start_writeback)
486
       do_writeback <= 1;
487
     else if (&ddr2_cache_line_word_addr)
488
       do_writeback <= 0;
489
 
490
   always @(posedge wb_clk)
491
     do_writeback_r <= do_writeback;
492
 
493
   // Detect falling edge of do_writeback
494
   always @(posedge wb_clk)
495
     do_writeback_data_finished <= !do_writeback & do_writeback_r;
496
 
497
   always @(posedge wb_clk)
498
     if (wb_rst)
499
       do_writeback_addresses <= 0;
500
     else if (do_writeback_data_finished)
501
       do_writeback_addresses <= 1;
502
     else if ((&addr_counter) & !ddr2_p0_cmd_full)
503
       do_writeback_addresses <= 0;
504
 
505
   always @(posedge wb_clk)
506
     do_writeback_addresses_r <= do_writeback_addresses;
507
 
508
   // Detect rising edge of do_writeback
509
   assign do_writeback_start = do_writeback & !do_writeback_r;
510
   // Detect falling edge of address writing control signal
511
   assign do_writeback_finished = !do_writeback_addresses &
512
                                  do_writeback_addresses_r;
513
 
514
   // DDR2 Read detect logic
515
   always @(posedge wb_clk)
516
     if (wb_rst)
517
       do_readfrom <= 0;
518
     else if (start_fill)
519
       do_readfrom <= 1;
520
     else if ((&ddr2_cache_line_word_addr))
521
       do_readfrom <= 0;
522
 
523
   always @(posedge wb_clk)
524
     do_readfrom_r <= do_readfrom;
525
 
526
   // Detect line fill request rising edge
527
   assign do_readfrom_start = do_readfrom & !do_readfrom_r;
528
   // Detect line fill request falling edge
529
   assign do_readfrom_finished = !do_readfrom & do_readfrom_r;
530
   assign doing_readfrom = do_readfrom | do_readfrom_r;
531
 
532
   // Address fifo signals
533
   assign ddr2_p0_cmd_en = ((do_readfrom_r & ddr2_p0_wr_empty) | (do_writeback_addresses_r & !ddr2_p0_wr_empty)) &
534
                           !ddr2_p0_cmd_full & do_af_write;
535
   assign ddr2_p0_cmd_instr[0] = doing_readfrom; // 1 - read, 0 - write
536
   assign ddr2_p0_cmd_instr[2:1] = 0;
537
 
538
   assign writeback_af_addr = {cached_addr, addr_counter, `DDR2_ADDR_ALIGN'd0};
539
 
540
   assign readfrom_af_addr = {wb_adr_i[`DDR2_CACHE_TAG_BITS], addr_counter, `DDR2_ADDR_ALIGN'd0};
541
 
542
   assign ddr2_p0_cmd_byte_addr = doing_readfrom ?  readfrom_af_addr : writeback_af_addr;
543
   assign ddr2_p0_wr_en         = do_writeback_ddr2_fifo_we;
544
   assign ddr2_p0_wr_data       = ddr2_cache_data_o;
545
   assign ddr2_p0_wr_mask       = 0;
546
 
547
   always @(posedge wb_clk)
548
     if (wb_rst)
549
       ddr2_cache_line_word_addr <= 0;
550
     else if (!ddr2_p0_rd_empty | (do_writeback & !ddr2_p0_wr_full))
551
       ddr2_cache_line_word_addr <= ddr2_cache_line_word_addr + 1;
552
     else if (ddr2_write_done | ddr2_read_done)
553
       ddr2_cache_line_word_addr <= 0;
554
 
555
   always @(posedge wb_clk)
556
     do_writeback_ddr2_fifo_we <= (do_writeback & !ddr2_p0_wr_full);
557
 
558
   always @(posedge wb_clk)
559
     if (wb_rst)
560
       ddr2_write_done <= 0;
561
     else if ((&ddr2_cache_line_word_addr) & do_writeback)
562
       ddr2_write_done <= 1;
563
     else if (!do_writeback) // sample WB domain
564
       ddr2_write_done <= 0;
565
 
566
   always @(posedge wb_clk)
567
     rd_data_valid_r <= !ddr2_p0_rd_empty;
568
 
569
   // Read done signaling to WB domain
570
   always @(posedge wb_clk)
571
     if (wb_rst)
572
       ddr2_read_done <= 0;
573
     else if (rd_data_valid_r & (&ddr2_cache_line_word_addr))
574
       ddr2_read_done <= 1;
575
     else if (!do_readfrom) // Read WB domain
576
       ddr2_read_done <= 0;
577
 
578
   // Lower word address uses potentially bursting address counter
579
   assign wb_cache_adr = wb_bursting ?
580
       {wb_adr_i[(`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE+2)-1:6],wb_burst_addr}:
581
       wb_adr_i[(`DDR2_CACHE_ADDR_WIDTH_WORDS_PER_LINE+2)-1:2];
582
 
583
   assign wb_cache_sel_we = {4{wb_we_i & wb_ack_o}} & wb_sel_i;
584
   assign ddr2_cache_en = (!ddr2_p0_rd_empty |do_writeback);
585
   assign ddr2_cache_we = {16{!ddr2_p0_rd_empty}};
586
 
587
   // Read enable always on
588
   assign ddr2_p0_rd_en = 1'b1;
589
 
590
`ifdef DDR2_BURSTLENGTH_1
591
   assign ddr2_p0_cmd_bl = 0; // burst of 1 * 128-bit
592
`elsif DDR2_BURSTLENGTH_2
593
   assign ddr2_p0_cmd_bl = 1; // burst of 2 * 128-bit
594
`elsif DDR2_BURSTLENGTH_4
595
   assign ddr2_p0_cmd_bl = 3; // burst of 4 * 128-bit
596
`elsif DDR2_BURSTLENGTH_8
597
   assign ddr2_p0_cmd_bl = 7; // burst of 8 * 128-bit
598
`elsif DDR2_BURSTLENGTH_16
599
   assign ddr2_p0_cmd_bl = 15; // burst of 16 * 128-bit
600
`endif
601
 
602
   // Xilinx Coregen true dual-port RAMB
603
   // Wishbone side : 32-bit
604
   // DDR2 side : 128-bit
605
   xilinx_ddr2_if_cache cache_mem0
606
     (
607
      // Wishbone side
608
      .clka(wb_clk),
609
      .ena(wb_cache_en),
610
      .wea(wb_cache_sel_we),
611
      .addra({2'd0, selected_cache_line_enc,wb_cache_adr}),
612
      .dina(wb_dat_i),
613
      .douta(wb_dat_o),
614
 
615
      // DDR2 controller side
616
      .clkb(wb_clk),
617
      .enb(ddr2_cache_en),
618
      .web(ddr2_cache_we),
619
      .addrb({2'd0, selected_cache_line_enc,
620
              ddr2_cache_line_word_addr}),
621
      .dinb(ddr2_p0_rd_data),
622
      .doutb(ddr2_cache_data_o));
623
 
624
 ddr2_mig  #
625
  (
626
   .C3_P0_MASK_SIZE       (C3_P0_MASK_SIZE),
627
   .C3_P0_DATA_PORT_SIZE  (C3_P0_DATA_PORT_SIZE),
628
   .DEBUG_EN              (DEBUG_EN),
629
   .C3_MEMCLK_PERIOD      (C3_MEMCLK_PERIOD),
630
   .C3_CALIB_SOFT_IP      (C3_CALIB_SOFT_IP),
631
   .C3_SIMULATION         (C3_SIMULATION),
632
   .C3_RST_ACT_LOW        (C3_RST_ACT_LOW),
633
   .C3_INPUT_CLK_TYPE     (C3_INPUT_CLK_TYPE),
634
   .C3_MEM_ADDR_ORDER     (C3_MEM_ADDR_ORDER),
635
   .C3_NUM_DQ_PINS        (C3_NUM_DQ_PINS),
636
   .C3_MEM_ADDR_WIDTH     (C3_MEM_ADDR_WIDTH),
637
   .C3_MEM_BANKADDR_WIDTH (C3_MEM_BANKADDR_WIDTH)
638
   )
639
   ddr2_mig
640
   (
641
 
642
    .mcb3_dram_dq         (ddr2_dq),
643
    .mcb3_dram_a          (ddr2_a),
644
    .mcb3_dram_ba         (ddr2_ba),
645
    .mcb3_dram_ras_n      (ddr2_ras_n),
646
    .mcb3_dram_cas_n      (ddr2_cas_n),
647
    .mcb3_dram_we_n       (ddr2_we_n),
648
    .mcb3_dram_odt        (ddr2_odt),
649
    .mcb3_dram_cke        (ddr2_cke),
650
    .mcb3_dram_dm         (ddr2_dm),
651
    .mcb3_dram_udqs       (ddr2_udqs),
652
    .mcb3_dram_udqs_n     (ddr2_udqs_n),
653
    .mcb3_rzq             (ddr2_rzq),
654
    .mcb3_zio             (ddr2_zio),
655
    .mcb3_dram_udm        (ddr2_udm),
656
    .c3_sys_clk           (ddr2_if_clk),
657
    .c3_sys_rst_n         (ddr2_if_rst),
658
    .c3_calib_done        (ddr2_calib_done),
659
    .c3_clk0              (ddr2_clk),
660
    .c3_rst0              (ddr2_rst),
661
    .mcb3_dram_dqs        (ddr2_dqs),
662
    .mcb3_dram_dqs_n      (ddr2_dqs_n),
663
    .mcb3_dram_ck         (ddr2_ck),
664
    .mcb3_dram_ck_n       (ddr2_ck_n),
665
    .c3_p0_cmd_clk        (wb_clk),
666
    .c3_p0_cmd_en         (ddr2_p0_cmd_en),
667
    .c3_p0_cmd_instr      (ddr2_p0_cmd_instr),
668
    .c3_p0_cmd_bl         (ddr2_p0_cmd_bl),
669
    .c3_p0_cmd_byte_addr  (ddr2_p0_cmd_byte_addr[29:0]),
670
    .c3_p0_cmd_empty      (ddr2_p0_cmd_empty),
671
    .c3_p0_cmd_full       (ddr2_p0_cmd_full),
672
    .c3_p0_wr_clk         (wb_clk),
673
    .c3_p0_wr_en          (ddr2_p0_wr_en),
674
    .c3_p0_wr_mask        (ddr2_p0_wr_mask),
675
    .c3_p0_wr_data        (ddr2_p0_wr_data),
676
    .c3_p0_wr_full        (ddr2_p0_wr_full),
677
    .c3_p0_wr_empty       (ddr2_p0_wr_empty),
678
    .c3_p0_wr_count       (ddr2_p0_wr_count),
679
    .c3_p0_wr_underrun    (ddr2_p0_wr_underrun),
680
    .c3_p0_wr_error       (ddr2_p0_wr_error),
681
    .c3_p0_rd_clk         (wb_clk),
682
    .c3_p0_rd_en          (ddr2_p0_rd_en),
683
    .c3_p0_rd_data        (ddr2_p0_rd_data),
684
    .c3_p0_rd_full        (ddr2_p0_rd_full),
685
    .c3_p0_rd_empty       (ddr2_p0_rd_empty),
686
    .c3_p0_rd_count       (ddr2_p0_rd_count),
687
    .c3_p0_rd_overflow    (ddr2_p0_rd_overflow),
688
    .c3_p0_rd_error       (ddr2_p0_rd_error)
689
   );
690
 
691
endmodule // xilinx_ddr2_if2
692
 
693
// Local Variables:
694
// verilog-library-directories:("." "ddr2_mig")
695
// verilog-library-extensions:(".v" ".h")
696
// End:
697
 
698
 
699
module xilinx_ddr2_wb_if_cache_adr_reg
700
  (adr_i, validate, invalidate,
701
   cached_adr_o, cache_hit, adr_valid,
702
   clk, rst);
703
 
704
   parameter full_adr_width = 32;
705
   parameter word_adr_width = 2; // 4 bytes per word   
706
   parameter line_adr_width = 8; // 256 words per "line"
707
 
708
   parameter tag_width = full_adr_width - line_adr_width - word_adr_width;
709
 
710
 
711
   input [full_adr_width-1: word_adr_width + line_adr_width] adr_i;
712
   input                 validate;
713
   input                 invalidate;
714
   output [full_adr_width-1: word_adr_width + line_adr_width] cached_adr_o;
715
   output                 cache_hit;
716
   output reg             adr_valid;
717
 
718
   input                  clk, rst;
719
 
720
   reg [tag_width-1:0]     cached_adr;
721
 
722
   assign cached_adr_o = cached_adr;
723
 
724
   always @(posedge clk)
725
     if (rst)
726
       cached_adr <= 0;
727
     else if (validate)
728
       cached_adr <= adr_i;
729
 
730
   always @(posedge clk)
731
     if (rst)
732
       adr_valid <= 0;
733
     else if (validate)
734
       adr_valid <= 1;
735
     else if (invalidate)
736
       adr_valid <= 0;
737
 
738
   assign cache_hit = (adr_i == cached_adr);
739
 
740
endmodule // xilinx_ddr2_wb_if_cache_adr_reg
741
 
742
module xilinx_ddr2_wb_if_cache_control
743
  ( cache_line_addr_valid, cache_line_addr_hit,
744
    wb_req,
745
    cache_write,
746
    writeback_done, fill_done,
747
    sync_start, sync_done,
748
    start_writeback, start_fill,
749
    cache_line_validate, cache_line_invalidate,
750
    selected_cache_line, selected_cache_line_enc,
751
    wb_clk, wb_rst);
752
 
753
   parameter num_lines = 16;
754
   parameter num_lines_log2 = 4;
755
 
756
   input [num_lines-1:0] cache_line_addr_valid;
757
   input [num_lines-1:0] cache_line_addr_hit;
758
 
759
   input                 wb_req;
760
   input                 cache_write;
761
   input                 writeback_done, fill_done;
762
 
763
   input                 sync_start;
764
   output                sync_done;
765
 
766
   output reg            start_writeback;
767
   output reg            start_fill;
768
   output reg [num_lines-1:0] cache_line_validate;
769
   output reg [num_lines-1:0] cache_line_invalidate;
770
 
771
   output [num_lines-1:0]     selected_cache_line;
772
   output reg [num_lines_log2-1:0] selected_cache_line_enc;
773
 
774
   input                           wb_clk, wb_rst;
775
 
776
   reg [num_lines-1:0]              lines_dirty;
777
 
778
   reg [num_lines-1:0]              selected_cache_line_from_miss;
779
 
780
   reg                             selected_cache_line_new;
781
 
782
   reg                             invalidate_clean_line;
783
 
784
   reg [num_lines-1:0]              selected_cache_line_r;
785
   reg [num_lines-1:0]              selected_cache_line_r2;
786
 
787
   reg                             wb_req_r;
788
 
789
   wire                            wb_req_new;
790
   reg                             wb_req_new_r;
791
 
792
   parameter sync_line_check_wait = 4;
793
   reg [num_lines-1:0]              sync_line_counter;
794
   reg                             sync_doing;
795
   reg [sync_line_check_wait-1:0]  sync_line_select_wait_counter_shr;
796
   reg                             sync_line_done;
797
   wire                            sync_writeback_line;
798
 
799
 
800
   always @(posedge wb_clk)
801
     wb_req_r <= wb_req;
802
 
803
   assign wb_req_new = wb_req & !wb_req_r;
804
 
805
   always @(posedge wb_clk)
806
     wb_req_new_r <= wb_req_new;
807
 
808
   // Select a cache line when we miss. Currently very simply is round robin
809
   always @(posedge wb_clk)
810
     if (wb_rst)
811
       selected_cache_line_from_miss <= 1;
812
     else if (wb_req_new_r & !(|selected_cache_line_r)) // miss,no line selected
813
       // Shift select bit one
814
       selected_cache_line_from_miss
815
         <= {selected_cache_line_from_miss[num_lines-2:0],
816
             selected_cache_line_from_miss[num_lines-1]};
817
 
818
 
819
   // Line selection logic, when line address is valid and hit, we select
820
   always @(posedge wb_clk)
821
     if (wb_rst)
822
       selected_cache_line_r <= 0;
823
     else if (wb_req_new)
824
       selected_cache_line_r <= cache_line_addr_valid & cache_line_addr_hit;
825
     else if (wb_req_new_r & !(|selected_cache_line_r))
826
       selected_cache_line_r <= selected_cache_line_from_miss;
827
     else if (sync_doing)
828
       selected_cache_line_r <= sync_line_counter;
829
 
830
   always @(posedge wb_clk)
831
     selected_cache_line_r2 <= selected_cache_line_r;
832
 
833
   assign selected_cache_line = selected_cache_line_r2;
834
 
835
   // A new line of cache has been selected
836
   always @(posedge wb_clk)
837
     if (wb_rst)
838
       selected_cache_line_new <= 0;
839
     else if (wb_req_new & (&(cache_line_addr_valid & cache_line_addr_hit)))
840
       // New line address selected
841
       selected_cache_line_new <= 1;
842
     else if ((!selected_cache_line_new) & wb_req_new_r)
843
       // Didn't select one last time, so we must have forced ourselves to 
844
       // select a new one
845
       selected_cache_line_new <= 1;
846
     else if (selected_cache_line_new)
847
       selected_cache_line_new <= 0;
848
 
849
   always @(posedge wb_clk)
850
     if (wb_rst)
851
       lines_dirty <= 0;
852
     else if (cache_write)
853
       lines_dirty <= lines_dirty | selected_cache_line_r;
854
     else if (writeback_done)
855
       lines_dirty <= lines_dirty & ~(selected_cache_line_r);
856
 
857
   // Validate the cache line address in the register when line filled
858
   always @(posedge wb_clk)
859
     if (wb_rst)
860
       cache_line_validate <= 0;
861
     else if (fill_done)
862
       cache_line_validate <= selected_cache_line_r;
863
     else if (|cache_line_validate)
864
       cache_line_validate <= 0;
865
 
866
   // Invalidate the cache line address in the register when line written back
867
   always @(posedge wb_clk)
868
     if (wb_rst)
869
       cache_line_invalidate <= 0;
870
     else if ((writeback_done & !sync_doing) | invalidate_clean_line)
871
       cache_line_invalidate <= selected_cache_line_r;
872
     else if (|cache_line_invalidate)
873
       cache_line_invalidate <= 0;
874
 
875
   // Initiate-writeback logic
876
   always @(posedge wb_clk)
877
     if (wb_rst)
878
       start_writeback <= 0;
879
     else if (start_writeback)
880
       start_writeback <= 0;
881
     else if (selected_cache_line_new &
882
              (|(lines_dirty & selected_cache_line_r)) &
883
              (|(selected_cache_line_r & cache_line_addr_valid)) &
884
              !(|(cache_line_addr_hit & selected_cache_line_r)))
885
       start_writeback <= 1;
886
     else if (sync_writeback_line)
887
       start_writeback <= 1;
888
 
889
   // Invalidate lines which we haven't written to so we can fill them
890
   always @(posedge wb_clk)
891
     if (wb_rst)
892
       invalidate_clean_line <= 0;
893
     else if (invalidate_clean_line)
894
       invalidate_clean_line <= 0;
895
     else if ((selected_cache_line_new) &  // New line selected
896
              !(|(lines_dirty & selected_cache_line_r)) & // It's not dirty
897
              // It's valid, but we've selected it so we're trashing it
898
              (|(selected_cache_line_r & cache_line_addr_valid)) &
899
              !(|(cache_line_addr_hit & selected_cache_line_r))) // Not a hit
900
       invalidate_clean_line <= 1;
901
 
902
   reg                    invalidate_clean_line_r;
903
   always @(posedge wb_clk)
904
     invalidate_clean_line_r <= invalidate_clean_line;
905
 
906
 
907
   // Initiate-fill logic
908
   always @(posedge wb_clk)
909
     if (wb_rst)
910
       start_fill <= 0;
911
     else if (((selected_cache_line_new) & // New line selected
912
               // not valid
913
               !(|(cache_line_addr_valid & selected_cache_line_r))) |
914
              (writeback_done & !sync_doing) | invalidate_clean_line_r
915
              )
916
       start_fill <= 1;
917
     else if (start_fill)
918
       start_fill <= 0;
919
 
920
   // Hardcoded to 4 lines currently.
921
   always @(posedge wb_clk)
922
     if (selected_cache_line_r[0])
923
       selected_cache_line_enc <= 0;
924
     else if (selected_cache_line_r[1])
925
       selected_cache_line_enc <= 1;
926
     else if (selected_cache_line_r[2])
927
       selected_cache_line_enc <= 2;
928
     else if (selected_cache_line_r[3])
929
       selected_cache_line_enc <= 3;
930
 
931
 
932
   // Synchronisation control
933
 
934
   always @(posedge wb_clk)
935
     if (wb_rst)
936
       sync_doing <= 0;
937
     else if (sync_start)
938
       sync_doing <= 1;
939
     else if (sync_done)
940
       sync_doing <= 0;
941
 
942
   always @(posedge wb_clk)
943
     if (wb_rst)
944
       sync_line_counter <= 0;
945
     else if (sync_start)
946
       // Set first line to check
947
       sync_line_counter[0] <= 1'b1;
948
     else if (sync_line_done)
949
       // Shift along, check next line
950
       sync_line_counter <=  {sync_line_counter[num_lines-2:0], 1'b0};
951
 
952
   // Pulse this on finishing of checking lines
953
   assign sync_done = sync_line_counter[num_lines-1] & sync_line_done;
954
 
955
   // Pulses when a dirty line is detected and should be written back.
956
   assign sync_writeback_line = sync_doing &
957
                                sync_line_select_wait_counter_shr[0] &
958
                                cache_line_addr_valid &
959
                                |(sync_line_counter & lines_dirty);
960
 
961
   always @(posedge wb_clk)
962
     if (wb_rst)
963
       sync_line_select_wait_counter_shr <= 0;
964
     else if (|sync_line_select_wait_counter_shr)
965
       sync_line_select_wait_counter_shr
966
         <= {1'b0,sync_line_select_wait_counter_shr[sync_line_check_wait-1:1]};
967
     else if (sync_start | (sync_line_done & !sync_done))
968
       sync_line_select_wait_counter_shr[sync_line_check_wait-1] <= 1'b1;
969
 
970
   always @(posedge wb_clk)
971
     if (wb_rst)
972
       sync_line_done <= 1'b0;
973
     else if (sync_line_done)
974
       sync_line_done <= 1'b0;
975
   // Either line doesn't need writeback
976
     else if (sync_line_select_wait_counter_shr[0] & !sync_writeback_line)
977
       sync_line_done <= 1'b1;
978
   // Or writeback finished
979
     else if  (writeback_done & sync_doing)
980
       sync_line_done <= 1'b1;
981
 
982
 
983
endmodule // xilinx_ddr2_wb_if_cache_control

powered by: WebSVN 2.1.0

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