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

Subversion Repositories hssdrc

[/] [hssdrc/] [trunk/] [rtl/] [hssdrc_access_manager.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 des00
//
2
// Project      : High-Speed SDRAM Controller with adaptive bank management and command pipeline
3
// 
4
// Project Nick : HSSDRC
5
// 
6
// Version      : 1.0-beta 
7
//  
8
// Revision     : $Revision: 1.1 $ 
9
// 
10
// Date         : $Date: 2008-03-06 13:52:43 $ 
11
// 
12
// Workfile     : hssdrc_access_manager.v
13
// 
14
// Description  : sdram bank access manager
15
// 
16
// HSSDRC is licensed under MIT License
17
// 
18
// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) 
19
// 
20
// Permission  is hereby granted, free of charge, to any person obtaining a copy of
21
// this  software  and  associated documentation files (the "Software"), to deal in
22
// the  Software  without  restriction,  including without limitation the rights to
23
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
24
// the  Software, and to permit persons to whom the Software is furnished to do so,
25
// subject to the following conditions:
26
// 
27
// The  above  copyright notice and this permission notice shall be included in all
28
// copies or substantial portions of the Software.
29
// 
30
// THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
32
// FOR  A  PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
33
// COPYRIGHT  HOLDERS  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
34
// IN  AN  ACTION  OF  CONTRACT,  TORT  OR  OTHERWISE,  ARISING  FROM, OUT OF OR IN
35
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36
//
37
 
38
 
39
// used command sequenceces 
40
// 1. {pre a -> act a -> rw a} -> {pre a -> act a -> rw a }
41
//                             -> {rw a }               
42
//                             -> {pre_all -> refr}
43
// 2. {pre a -> act a -> rw a} -> {pre b -> act b -> rw b }
44
//                             -> {act b -> rw b}
45
//                             -> {rw b }               
46
//                             -> {pre_all -> refr}
47
// 3. {pre_all -> refr} -> refr 
48
//                      -> act 
49
//
50
// just need to control : 
51
// +-------------------+-------------------------+--------------------------+
52
// | command           | sequental decoder part  | concurent/pipeline part  |
53
// +===================+=========================+==========================+
54
// | pre [0] ->        | act [0]                 |             act [1,2,3]  |
55
// | pre [0] ->        |                         |             pre [1,2,3]  |
56
// +-------------------+-------------------------+--------------------------+
57
// | pre [1] ->        | act [1]                 |             act [0,2,3]  |
58
// | pre [1] ->        |                         |             pre [0,2,3]  | 
59
// +-------------------+-------------------------+--------------------------+
60
// | pre [2] ->        | act [2]                 |             act [0,1,3]  |
61
// | pre [2] ->        |                         |             pre [0,1,3]  | 
62
// +-------------------+-------------------------+--------------------------+
63
// | pre [3] ->        | act [3]                 |             act [0,1,2]  |
64
// | pre [3] ->        |                         |             pre [0,1,2]  | 
65
// +-------------------+-------------------------+--------------------------+
66
// | act [0] ->        | write [0]               |                          |  
67
// | act [0] ->        |                         |    act [1,2,3]           |  
68
// | act [0] ->        |                         |  pre [0,1,2,3]           |  
69
// | act [0] ->        | read  [0]               |                          |    
70
// +-------------------+-------------------------+--------------------------+  
71
// | act [1] ->        | write [1]               |                          |  
72
// | act [1] ->        |                         |    act [0,2,3]           |  
73
// | act [1] ->        |                         |  pre [0,1,2,3]           |  
74
// | act [1] ->        | read  [1]               |                          |    
75
// +-------------------+-------------------------+--------------------------+  
76
// | act [2] ->        | write [2]               |                          |  
77
// | act [2] ->        |                         |    act [0,1,3]           |  
78
// | act [2] ->        |                         |  pre [0,1,2,3]           |  
79
// | act [2] ->        | read  [2]               |                          |    
80
// +-------------------+-------------------------+--------------------------+  
81
// | act [3] ->        | write [3]               |                          |  
82
// | act [3] ->        |                         |    act [0,1,2]           |  
83
// | act [3] ->        |                         |  pre [0,1,2,3]           |  
84
// | act [3] ->        | read  [3]               |                          |    
85
// +-------------------+-------------------------+--------------------------+
86
// | write/read [0] -> |                         |  pre [0,1,2,3]           |
87
// | write/read [0] -> |                         |    act [1,2,3]           |
88
// | write/read [0] -> |                         |  write[0,1,2,3]          |
89
// | write/read [0] -> |                         |  read [0,1,2,3]          |
90
// +-------------------+-------------------------+--------------------------+
91
// | write/read [1] -> |                         |  pre [0,1,2,3]           |
92
// | write/read [1] -> |                         |    act [0,2,3]           |
93
// | write/read [1] -> |                         |  write[0,1,2,3]          |
94
// | write/read [1] -> |                         |  read [0,1,2,3]          |
95
// +-------------------+-------------------------+--------------------------+
96
// | write/read [2] -> |                         |  pre [0,1,2,3]           |
97
// | write/read [2] -> |                         |    act [0,1,3]           |
98
// | write/read [2] -> |                         |  write[0,1,2,3]          |
99
// | write/read [2] -> |                         |  read [0,1,2,3]          |
100
// +-------------------+-------------------------+--------------------------+
101
// | write/read [3] -> |                         |  pre [0,1,2,3]           |
102
// | write/read [3] -> |                         |    act [0,1,2]           |
103
// | write/read [3] -> |                         |  write[0,1,2,3]          |
104
// | write/read [3] -> |                         |  read [0,1,2,3]          |
105
// +-------------------+-------------------------+--------------------------+
106
// | pre_all  ->       | refr                    |                          | 
107
// |                   |                         |                          |
108
// +-------------------+-------------------------+--------------------------+
109
// | refr     ->       |                         | refr                     |
110
// | refr     ->       |                         | act[0,1,2,3]             |
111
// +-------------------+-------------------------+--------------------------+
112
//
113
//
114
//
115
// +-----------------+---------------+-----------------+---------------------+-----------+
116
// | past command    | control tread | current command | contol time value   | note      |
117
// +=================+===============+=================+=====================+===========+
118
// | act   [0]       |   0           | pre [0]         | Tras                |           |
119
// | write [0]       |   1           |                 | Twr + Burst         |  1,2,3    |
120
// | read  [0]       |   2           |                 |       Burst         |  bank     |
121
// | pre   [1,2,3]   |               |                 | 0                   |   is      |
122
// | act   [1,2,3]   |               |                 | 0                   |  same     |
123
// | write [1,2,3]   |               |                 | 0                   |           |
124
// | read  [1,2,3]   |               |                 | 0                   |           |
125
// +-----------------+---------------+-----------------+---------------------+-----------+
126
// | pre   [0]       |   3 [1]_      | act [0]         | Trp                 |           |
127
// | refr            |   4           |                 | Trfc                |  1,2,3    |
128
// | act   [0]       |   5           |                 | Trc                 |           |  
129
// | act   [1,2,3]   |   6           |                 | Trrd                |  bank     |
130
// | pre   [1,2,3]   |               |                 | 0                   |   is      |
131
// | write [1,2,3]   |               |                 | 0                   |  same     |
132
// | read  [1,2,3]   |               |                 | 0                   |           |
133
// +-----------------+---------------+-----------------+---------------------+-----------+
134
// | act   [0]       |   7 [1]_      | write [0]       | Trcd                |  1,2,3    |
135
// | write [0,1,2,3] |   8           |                 | Burst               |  bank     |
136
// | read  [0,1,2,3] |   9           |                 | Burst + CL + 1(?bta)|   is      |
137
// |                 |               |                 |                     |  same     |
138
// +-----------------+---------------+-----------------+---------------------+-----------+
139
// | act   [0]       |   10 [1]_     | read  [0]       | Trcd                |  1,2,3    |
140
// | write [0,1,2,3] |   11          |                 | Burst + 1(?bta)     |  bank     |
141
// | read  [0,1,2,3] |   12          |                 | Burst               |   is      |
142
// |                 |               |                 |                     |  same     |
143
// +-----------------+---------------+-----------------+---------------------+-----------+
144
// | pre_all         |   13          | refr            | Trp                 |           |
145
// | refr            |   14          |                 | Trfc                |           |
146
// +-----------------+---------------+-----------------+---------------------+-----------+
147
//
148
//  ..[1] Trp (pre -> act) & Trcd (act -> read/write) contolled internal in decoder FSM 
149
//
150
 
151
`include "hssdrc_timescale.vh"
152
 
153
`include "hssdrc_define.vh"
154
`include "hssdrc_timing.vh"
155
 
156
module hssdrc_access_manager (
157
  clk               ,
158
  reset             ,
159
  sclr              ,
160
  //
161
  arb_pre_all       ,
162
  arb_refr          ,
163
  arb_pre           ,
164
  arb_act           ,
165
  arb_read          ,
166
  arb_write         ,
167
  arb_ba            ,
168
  arb_burst         ,
169
  //
170
  am_pre_all_enable ,
171
  am_refr_enable    ,
172
  am_pre_enable     ,
173
  am_act_enable     ,
174
  am_read_enable    ,
175
  am_write_enable
176
  );
177
 
178
  input wire clk;
179
  input wire reset;
180
  input wire sclr;
181
 
182
  //--------------------------------------------------------------------------------------------------
183
  // interface from output arbiter 
184
  //-------------------------------------------------------------------------------------------------- 
185
 
186
  input logic         arb_pre_all  ;
187
  input logic         arb_refr     ;
188
  input logic         arb_pre      ;
189
  input logic         arb_act      ;
190
  input logic         arb_read     ;
191
  input logic         arb_write    ;
192
  input ba_t          arb_ba       ;
193
  input sdram_burst_t arb_burst    ;
194
 
195
  //--------------------------------------------------------------------------------------------------
196
  // outputs 
197
  //-------------------------------------------------------------------------------------------------- 
198
 
199
  output logic       am_pre_all_enable  ;
200
  output logic       am_refr_enable     ;
201
  output logic [0:3] am_pre_enable      ;
202
  output logic [0:3] am_act_enable      ;
203
  output logic [0:3] am_read_enable     ;
204
  output logic [0:3] am_write_enable    ;
205
 
206
 
207
  //-------------------------------------------------------------------------------------------------- 
208
  // all timings is select using shift register techique. 
209
  // enable is 1'b1 level on output. 
210
  // all shift is shift rigth. 
211
  // shift register command load pattern is 'b{{x{1'b0}}, {y{1'b1}}} 
212
  //-------------------------------------------------------------------------------------------------- 
213
 
214
  //-------------------------------------------------------------------------------------------------- 
215
  // take into acount load shift register cycle 
216
  //-------------------------------------------------------------------------------------------------- 
217
 
218
  localparam int cTras_m1     =    cTras - 1;
219
  localparam int cTrfc_m1     =    cTrfc - 1;
220
//  localparam int  cTrc_m1     =     cTrc - 1; tras + trp contolled  
221
//  localparam int cTrcd_m1     =    cTrcd - 1; fsm contolled 
222
  localparam int  cTwr_m1     =     cTwr - 1;
223
  localparam int  cTrp_m1     =     cTrp - 1;
224
  localparam int cTrrd_m1     =    cTrrd - 1;
225
  localparam int cSdramBL_m1  = cSdramBL - 1;
226
 
227
  //-------------------------------------------------------------------------------------------------- 
228
  // tread 0/1/2 : Tras (act -> pre) & Twr + Burst (write -> pre) & Burst (read -> write) 
229
  // Twr + Burst & Burst control via one register becouse write/read has atomic access
230
  //--------------------------------------------------------------------------------------------------  
231
 
232
  localparam int cPreActEnableLength  = max(cTwr_m1 + cSdramBL_m1, cTras_m1);
233
  localparam int cPreRwEnableLength   = max(cTwr_m1 + cSdramBL_m1, cTras_m1);
234
 
235
  typedef logic [cPreActEnableLength-1:0]   pre_act_enable_srl_t;
236
  typedef logic [cPreRwEnableLength-1 :0]   pre_rw_enable_srl_t;
237
 
238
  // to pre load patterns
239
  localparam pre_act_enable_srl_t cPreActEnableInitValue  = {cPreActEnableLength{1'b1}};
240
  localparam pre_act_enable_srl_t cPreActEnableActValue   = PercentRelation(cTras_m1, cPreActEnableLength);
241
 
242
  // to pre load patterns
243
  localparam pre_rw_enable_srl_t  cPreRwEnableInitValue   = {cPreRwEnableLength{1'b1}};
244
 
245
  // Remember : burst already has -1 offset (!!!!)
246
  function automatic pre_rw_enable_srl_t PreRwEnableWriteValue (input sdram_burst_t burst);
247
    PreRwEnableWriteValue = PercentRelation (cTwr_m1 + burst, cPreRwEnableLength);
248
  endfunction
249
 
250
  function automatic pre_rw_enable_srl_t PreRwEnableReadValue (input sdram_burst_t burst);
251
    PreRwEnableReadValue = PercentRelation (burst, cPreRwEnableLength);
252
  endfunction
253
 
254
  // each bank has own control registers 
255
  pre_act_enable_srl_t pre_act_enable_srl [0:3];
256
  pre_rw_enable_srl_t  pre_rw_enable_srl  [0:3];
257
 
258
  wire [0:3] pre_enable ;
259
 
260
  genvar p;
261
 
262
  generate
263
 
264
    for (p = 0; p < 4; p++) begin : pre_enable_generate
265
 
266
      always_ff @(posedge clk or posedge reset) begin : pre_enable_shift_register
267
 
268
        if (reset)
269
          pre_act_enable_srl [p] <= cPreActEnableInitValue;
270
        else if (sclr)
271
          pre_act_enable_srl [p] <= cPreActEnableInitValue;
272
        else begin
273
          if (arb_act && (arb_ba == p))
274
            pre_act_enable_srl [p] <= cPreActEnableActValue;
275
          else
276
            pre_act_enable_srl [p] <= (pre_act_enable_srl [p] << 1) | 1'b1;
277
        end
278
 
279
 
280
        if (reset)
281
          pre_rw_enable_srl [p] <= cPreRwEnableInitValue;
282
        else if (sclr)
283
          pre_rw_enable_srl [p] <= cPreRwEnableInitValue;
284
        else begin
285
          if (arb_write && (arb_ba == p))
286
            pre_rw_enable_srl [p] <= PreRwEnableWriteValue (arb_burst) & ((pre_act_enable_srl [p] << 1) | 1'b1);
287
          else if (arb_read && (arb_ba == p))
288
            pre_rw_enable_srl [p] <= PreRwEnableReadValue (arb_burst)  & ((pre_act_enable_srl [p] << 1) | 1'b1);
289
          else
290
            pre_rw_enable_srl [p] <= (pre_rw_enable_srl [p] << 1) | 1'b1;
291
        end
292
 
293
      end
294
 
295
      assign pre_enable [p] = pre_rw_enable_srl  [p] [cPreRwEnableLength-1] ;
296
 
297
    end
298
 
299
  endgenerate
300
 
301
  //-------------------------------------------------------------------------------------------------- 
302
  // pre_all_enable has same logic as pre enable. 
303
  // pre_all_enable == &(pre_enable), but for increase performance it have own control registers 
304
  //--------------------------------------------------------------------------------------------------  
305
 
306
  pre_act_enable_srl_t pre_all_act_enable_srl ;
307
  pre_rw_enable_srl_t  pre_all_rw_enable_srl  ;
308
 
309
  wire pre_all_enable;
310
 
311
  always_ff @(posedge clk or posedge reset) begin : pre_all_enable_shift_register
312
 
313
    if (reset)
314
      pre_all_act_enable_srl <= cPreActEnableInitValue;
315
    else if (sclr)
316
      pre_all_act_enable_srl <= cPreActEnableInitValue;
317
    else begin
318
      if (arb_act)
319
        pre_all_act_enable_srl <= cPreActEnableActValue;
320
      else
321
        pre_all_act_enable_srl <= (pre_all_act_enable_srl << 1) | 1'b1;
322
    end
323
 
324
 
325
    if (reset)
326
      pre_all_rw_enable_srl <= cPreRwEnableInitValue;
327
    else if (sclr)
328
      pre_all_rw_enable_srl <= cPreRwEnableInitValue;
329
    else begin
330
      if (arb_write)
331
        pre_all_rw_enable_srl <= PreRwEnableWriteValue (arb_burst) & ((pre_all_act_enable_srl << 1) | 1'b1);
332
      else if (arb_read)
333
        pre_all_rw_enable_srl <= PreRwEnableReadValue  (arb_burst) & ((pre_all_act_enable_srl << 1) | 1'b1);
334
      else
335
        pre_all_rw_enable_srl <= (pre_all_rw_enable_srl << 1) | 1'b1;
336
    end
337
 
338
  end
339
 
340
  assign pre_all_enable = pre_all_rw_enable_srl [cPreRwEnableLength-1];
341
 
342
  //-------------------------------------------------------------------------------------------------- 
343
  // tread 4/5/6 : Trfc (refr -> act) & Trc (act -> act) & Trrd (act a -> act b)
344
  // Trc don't need to be contolled, becouse Trc = Tras + Trcd
345
  // Trfc & Trrd control via one register becouse refr -> any act has locked & sequental access.
346
  // for Trc we can use 1 register, becouse act a -> act a is imposible sequence 
347
  //--------------------------------------------------------------------------------------------------  
348
 
349
  localparam int cActEnableLength = max (cTrfc_m1, cTrrd_m1);
350
 
351
  typedef logic [cActEnableLength-1:0]  act_enable_srl_t;
352
 
353
  // to act load patterns
354
  localparam act_enable_srl_t cActEnableInitValue = {cActEnableLength{1'b1}};
355
  localparam act_enable_srl_t cActEnableRefrValue = PercentRelation(cTrfc_m1, cActEnableLength);
356
  localparam act_enable_srl_t cActEnableActValue  = PercentRelation(cTrrd_m1, cActEnableLength);
357
 
358
  act_enable_srl_t   act_enable_srl ;
359
 
360
  wire [0:3] act_enable ;
361
 
362
  always_ff @(posedge clk or posedge reset) begin : act_enable_shift_register
363
 
364
    if (reset)
365
      act_enable_srl <= cActEnableInitValue;
366
    else if (sclr)
367
      act_enable_srl <= cActEnableInitValue;
368
    else begin
369
 
370
      if (arb_refr)
371
        act_enable_srl <= cActEnableRefrValue;
372
      else if (arb_act)
373
        act_enable_srl <= cActEnableActValue;
374
      else
375
        act_enable_srl <= (act_enable_srl << 1) | 1'b1;
376
 
377
    end
378
  end
379
 
380
  assign act_enable = {4{act_enable_srl [cActEnableLength-1]}} ;
381
 
382
  //-------------------------------------------------------------------------------------------------- 
383
  // tread 8/9 : Burst (write -> write) & Burst + CL + BTA (read -> write).
384
  // control via one register becouse write/read -> write is atomic sequental access.
385
  //-------------------------------------------------------------------------------------------------- 
386
 
387
  localparam int cWriteEnableLength = max (cSdramBL_m1, cSdramBL_m1 + pCL + pBTA);
388
 
389
  typedef logic [cWriteEnableLength-1:0] write_enable_srl_t;
390
 
391
  // to write load patterns
392
  localparam write_enable_srl_t cWriteEnableInitValue = {cWriteEnableLength{1'b1}};
393
 
394
  // Remember : burst already has -1 offset (!!!!)
395
  function automatic write_enable_srl_t WriteEnableWriteValue (input sdram_burst_t burst);
396
    WriteEnableWriteValue = PercentRelation(burst, cWriteEnableLength);
397
  endfunction
398
 
399
  function automatic write_enable_srl_t WriteEnableReadValue (input sdram_burst_t burst);
400
    WriteEnableReadValue = PercentRelation(burst + pCL + pBTA, cWriteEnableLength);
401
  endfunction
402
 
403
  write_enable_srl_t  write_enable_srl;
404
 
405
  wire [0:3] write_enable ;
406
 
407
  always_ff @(posedge clk or posedge reset) begin : write_enable_shift_register
408
 
409
    if (reset)
410
      write_enable_srl <= cWriteEnableInitValue;
411
    else if (sclr)
412
      write_enable_srl <= cWriteEnableInitValue;
413
    else begin
414
      if (arb_write)
415
        write_enable_srl <= WriteEnableWriteValue (arb_burst);
416
      else if (arb_read)
417
        write_enable_srl <= WriteEnableReadValue (arb_burst);
418
      else
419
        write_enable_srl <= (write_enable_srl << 1) | 1'b1;
420
    end
421
  end
422
 
423
  assign write_enable = {4{write_enable_srl [cWriteEnableLength-1]}};
424
 
425
  //-------------------------------------------------------------------------------------------------- 
426
  // tread 11/12 : Burst + BTA (write -> read) & Burst (read -> read).
427
  // contorl via one register becouse write/read -> read is atomic sequental access
428
  // BTA from write -> read is not need !!! becouse read have read latency !!!!
429
  //-------------------------------------------------------------------------------------------------- 
430
 
431
  localparam int cReadEnableLength = max(cSdramBL_m1, cSdramBL_m1);
432
 
433
  typedef logic [cReadEnableLength-1:0] read_enable_srl_t;
434
 
435
  // to read load patterns
436
  localparam read_enable_srl_t cReadEnableInitValue   = {cReadEnableLength{1'b1}};
437
  // Remember : burst already has -1 offset (!!!!)
438
  function automatic read_enable_srl_t ReadEnableWriteValue (input sdram_burst_t burst);
439
    ReadEnableWriteValue = PercentRelation(burst, cReadEnableLength);
440
  endfunction
441
 
442
  function automatic read_enable_srl_t ReadEnableReadValue (input sdram_burst_t burst);
443
    ReadEnableReadValue = PercentRelation(burst, cReadEnableLength);
444
  endfunction
445
 
446
  read_enable_srl_t read_enable_srl;
447
 
448
  wire [0:3] read_enable ;
449
 
450
  always_ff @(posedge clk or posedge reset) begin : read_enable_shift_register
451
 
452
    if (reset)
453
      read_enable_srl <= cReadEnableInitValue;
454
    else if (sclr)
455
      read_enable_srl <= cReadEnableInitValue;
456
    else begin
457
      if (arb_write)
458
        read_enable_srl <= ReadEnableWriteValue (arb_burst);
459
      else if (arb_read)
460
        read_enable_srl <= ReadEnableReadValue (arb_burst);
461
      else
462
        read_enable_srl <= (read_enable_srl << 1) | 1'b1;
463
    end
464
 
465
  end
466
 
467
  assign read_enable = {4{read_enable_srl [cReadEnableLength-1]}};
468
 
469
  //-------------------------------------------------------------------------------------------------- 
470
  // tread 13/14 : Trp (pre_all -> refr) & Trfc (refr -> refr).
471
  // contol via one register becouse pre_all/refr has locked access & (pre_all -> refr) has sequental access
472
  //--------------------------------------------------------------------------------------------------  
473
 
474
  localparam int cRefrEnableLength = max (cTrp_m1, cTrfc_m1);
475
 
476
  typedef logic [cRefrEnableLength-1:0] refr_enable_srl_t;
477
 
478
  // to refr load patterns
479
  localparam refr_enable_srl_t cRefrEnableInitValue   = {cRefrEnableLength{1'b1}};
480
  localparam refr_enable_srl_t cRefrEnablePreAllValue = PercentRelation( cTrp_m1, cRefrEnableLength);
481
  localparam refr_enable_srl_t cRefrEnableRefrValue   = PercentRelation(cTrfc_m1, cRefrEnableLength);
482
 
483
  refr_enable_srl_t refr_enable_srl;
484
 
485
  wire refr_enable;
486
 
487
  always_ff @(posedge clk or posedge reset) begin : refr_enable_shift_register
488
 
489
    if (reset)
490
      refr_enable_srl <= cRefrEnableInitValue;
491
    else if (sclr)
492
      refr_enable_srl <= cRefrEnableInitValue;
493
    else begin
494
      if (arb_pre_all)
495
        refr_enable_srl <= cRefrEnablePreAllValue;
496
      else if (arb_refr)
497
        refr_enable_srl <= cRefrEnableRefrValue;
498
      else
499
        refr_enable_srl <= (refr_enable_srl << 1) | 1'b1;
500
    end
501
 
502
  end
503
 
504
  assign refr_enable = refr_enable_srl [cRefrEnableLength-1];
505
 
506
  //--------------------------------------------------------------------------------------------------  
507
  // output mapping 
508
  //-------------------------------------------------------------------------------------------------- 
509
 
510
  assign am_pre_all_enable = pre_all_enable;
511
  assign am_refr_enable    = refr_enable;
512
  assign am_act_enable     = act_enable;
513
  assign am_pre_enable     = pre_enable;
514
  assign am_write_enable   = write_enable;
515
  assign am_read_enable    = read_enable;
516
 
517
  //-------------------------------------------------------------------------------------------------- 
518
  // function to generate 'b{{{data}1'b0}, {{length-data}{1'b1}}} shift register load pattern 
519
  //-------------------------------------------------------------------------------------------------- 
520
 
521
  function automatic int unsigned PercentRelation (input int unsigned data, length);
522
    int unsigned value;
523
    int i;
524
    int ones_num;
525
 
526
    value = 0;
527
    ones_num = length - data; // number of ones from lsb in constant vector 
528
    for ( i = 0; i < length; i++) begin
529
      if (i < ones_num) value[i] = 1'b1;
530
      else              value[i] = 1'b0;
531
    end
532
 
533
    return value;
534
  endfunction
535
 
536
 
537
endmodule
538
 

powered by: WebSVN 2.1.0

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