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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [rtl/] [verilog/] [buffers/] [sd_fifo_tail_b.v] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ghutchis
//----------------------------------------------------------------------
2
// Srdy/Drdy FIFO Tail "B"
3
//
4
// Building block for FIFOs.  The "B" (big) FIFO is design for larger FIFOs
5
// based around memories, with sizes that may not be a power of 2.
6
//
7
// The bound inputs allow multiple FIFO controllers to share a single
8
// memory.  The enable input is for arbitration between multiple FIFO
9
// controllers, or between the fifo head and tail controllers on a
10
// single port memory.
11
//
12
// The commit parameter enables read/commit behavior.  This creates
13
// two read pointers, one which is used for reading from memory and
14
// a commit pointer which is sent to the head block.  The abort behavior
15
// has a 3-cycle performance penalty due to pipeline flush.
16
//
17
// The FIFO tail assumes a memory with one-cycle read latency, and
18
// has output buffering to compensate for this.
19
//
20
// Naming convention: c = consumer, p = producer, i = internal interface
21
//----------------------------------------------------------------------
22
// Author: Guy Hutchison
23
//
24
// This block is uncopyrighted and released into the public domain.
25
//----------------------------------------------------------------------
26
 
27
// Clocking statement for synchronous blocks.  Default is for
28
// posedge clocking and positive async reset
29
`ifndef SDLIB_CLOCKING
30
 `define SDLIB_CLOCKING posedge clk or posedge reset
31
`endif
32
 
33
// delay unit for nonblocking assigns, default is to #1
34
`ifndef SDLIB_DELAY
35
 `define SDLIB_DELAY #1
36
`endif
37
 
38
 
39
module sd_fifo_tail_b
40
  #(parameter width=8,
41
    parameter depth=16,
42
    parameter commit=0,
43
    parameter asz=$clog2(depth))
44
    (
45
     input       clk,
46
     input       reset,
47
     input       enable,
48
 
49
     input [asz-1:0]      bound_low,
50
     input [asz-1:0]      bound_high,
51
 
52
     output reg [asz-1:0]   cur_rdptr,
53
     output reg [asz-1:0]   com_rdptr,
54
     input  [asz-1:0]       wrptr,
55
     output reg           mem_re,
56 13 ghutchis
     input                mem_we,
57 2 ghutchis
 
58
     output reg [asz:0]   usage,
59
 
60
     output               p_srdy,
61
     input                p_drdy,
62
     input                p_commit,
63
     input                p_abort,
64
     input [width-1:0]    mem_rd_data,
65
     output [width-1:0]   p_data
66
     );
67
 
68
  reg [asz-1:0]           nxt_cur_rdptr;
69
  reg [asz-1:0]           cur_rdptr_p1;
70
  reg                   empty, full;
71
 
72
  reg                   nxt_irdy;
73
 
74
  reg [width-1:0]       hold_a, hold_b;
75
  reg                   valid_a, valid_b;
76
  reg                   prev_re;
77
  reg [asz:0]           tmp_usage;
78
  reg [asz:0]           fifo_size;
79 6 ghutchis
  wire                  rbuf1_drdy;
80
  wire                  ip_srdy, ip_drdy;
81
  wire [width-1:0]       ip_data;
82 2 ghutchis
 
83
  // Stage 1 -- Read pipeline
84
  // issue a read if:
85
  //   1) we are enabled
86
  //   2) valid_a is 0, OR
87
  //   3) valid_b is 0, OR
88
  //   4) valid_a && valid_b && trdy
89
  always @*
90
    begin
91
 
92
      if (cur_rdptr[asz-1:0] == (bound_high))
93
        begin
94
          cur_rdptr_p1[asz-1:0] = bound_low;
95
        end
96
      else
97
        cur_rdptr_p1 = cur_rdptr + 1;
98
 
99
      empty = (wrptr == cur_rdptr);
100
 
101
      if (commit && p_abort)
102
        begin
103
          nxt_cur_rdptr = com_rdptr;
104
          mem_re = 0;
105
        end
106 6 ghutchis
//      else if (enable & !empty & (!valid_a | (!prev_re & !valid_b) | 
107
//                             (valid_a & valid_b & p_drdy)))
108
      else if (enable & !empty & ip_drdy)
109 2 ghutchis
        begin
110
          nxt_cur_rdptr = cur_rdptr_p1;
111
          mem_re = 1;
112
        end
113
      else
114
        begin
115
          nxt_cur_rdptr = cur_rdptr;
116
          mem_re = 0;
117
        end // else: !if(enable & !empty & (!valid_a | !valid_b |...
118
 
119
      fifo_size = (bound_high - bound_low + 1);
120
      tmp_usage = wrptr[asz-1:0] - cur_rdptr[asz-1:0];
121
      if (~tmp_usage[asz])
122
        usage = tmp_usage[asz-1:0];
123
      else
124
        usage = fifo_size - (cur_rdptr[asz-1:0] - wrptr[asz-1:0]);
125 13 ghutchis
    end // always @ *
126
 
127
/* -----\/----- EXCLUDED -----\/-----
128
  // alternate usage calc
129
  reg [asz-1:0] prev_wr;
130
  reg [asz:0] usage2, nxt_usage2;
131
  wire        lcl_wr_en;
132
  //assign lcl_wr_en = (prev_wr0 != wrptr[0]);
133
 
134
  always @(posedge clk)
135
    begin
136
      if (reset)
137
        begin
138
          /-*AUTORESET*-/
139
          // Beginning of autoreset for uninitialized flops
140
          usage2 <= {(1+(asz)){1'b0}};
141
          // End of automatics
142
        end
143
      else
144
        begin
145
          usage2   <= #1 nxt_usage2;
146
        end
147 2 ghutchis
    end
148 13 ghutchis
 
149
  always @*
150
    begin
151
      if (mem_re & !mem_we)
152
        nxt_usage2 = usage2 - 1;
153
      else if (!mem_re & mem_we)
154
        nxt_usage2 = usage2 + 1;
155
      else
156
        nxt_usage2 = usage2;
157
    end
158
 -----/\----- EXCLUDED -----/\----- */
159 2 ghutchis
 
160
  always @(posedge clk)
161
    begin
162
      if (reset)
163
        cur_rdptr <= `SDLIB_DELAY bound_low;
164
      else
165
        cur_rdptr <= `SDLIB_DELAY nxt_cur_rdptr;
166
    end
167
 
168 11 ghutchis
  reg [asz-1:0]  rdaddr_s0, rdaddr_a, rdaddr_b;
169
  reg [asz-1:0]  nxt_com_rdptr;
170 2 ghutchis
  generate
171
    if (commit == 1)
172
      begin : gen_s0
173
 
174
        always @(posedge clk)
175
          begin
176
            if (reset)
177
              com_rdptr <= `SDLIB_DELAY bound_low;
178
            else
179
              com_rdptr <= `SDLIB_DELAY nxt_com_rdptr;
180
 
181
            if (mem_re)
182
              rdaddr_s0 <= `SDLIB_DELAY cur_rdptr;
183
          end
184
      end
185
    else
186
      begin : gen_ns0
187
        always @*
188
          com_rdptr = cur_rdptr;
189
      end
190
  endgenerate
191
 
192
  // Stage 2 -- read buffering
193
  always @(`SDLIB_CLOCKING)
194
    begin
195
      if (reset)
196
        begin
197
          prev_re <= `SDLIB_DELAY 0;
198 6 ghutchis
        end
199 2 ghutchis
      else
200
        begin
201
          if (commit && p_abort)
202
            prev_re <= `SDLIB_DELAY 0;
203
          else
204
            prev_re <= `SDLIB_DELAY mem_re;
205 6 ghutchis
        end // else: !if(reset)
206
    end // always @ (`SDLIB_CLOCKING)
207 2 ghutchis
 
208
  generate
209
    if (commit == 1)
210 11 ghutchis
      begin : gen_s2
211 6 ghutchis
        wire [asz-1:0] ip_rdaddr, p_rdaddr;
212 2 ghutchis
 
213 6 ghutchis
        sd_input #(asz+width) rbuf1
214
          (.clk (clk), .reset (p_abort | reset),
215
           .c_srdy (prev_re),
216
           .c_drdy (rbuf1_drdy),
217
           .c_data ({rdaddr_s0,mem_rd_data}),
218
           .ip_srdy (ip_srdy), .ip_drdy (ip_drdy),
219
           .ip_data ({ip_rdaddr,ip_data}));
220
 
221
        sd_output #(asz+width) rbuf2
222
          (.clk (clk), .reset (p_abort | reset),
223
           .ic_srdy (ip_srdy),
224
           .ic_drdy (ip_drdy),
225
           .ic_data ({ip_rdaddr,ip_data}),
226
           .p_srdy (p_srdy), .p_drdy (p_drdy),
227
           .p_data ({p_rdaddr,p_data}));
228 2 ghutchis
 
229
        always @*
230
          begin
231 14 ghutchis
            if (p_commit & p_srdy & p_drdy)
232 6 ghutchis
              nxt_com_rdptr = p_rdaddr;
233 2 ghutchis
            else
234
              nxt_com_rdptr = com_rdptr;
235
          end
236 6 ghutchis
      end // if (commit == 1)
237
    else
238 11 ghutchis
      begin : gen_ns2
239 6 ghutchis
        sd_input #(width) rbuf1
240
          (.clk (clk), .reset (p_abort | reset),
241
           .c_srdy (prev_re),
242
           .c_drdy (rbuf1_drdy),
243
           .c_data (mem_rd_data),
244
           .ip_srdy (ip_srdy), .ip_drdy (ip_drdy),
245
           .ip_data (ip_data));
246
 
247
        sd_output #(width) rbuf2
248
          (.clk (clk), .reset (p_abort | reset),
249
           .ic_srdy (ip_srdy),
250
           .ic_drdy (ip_drdy),
251
           .ic_data (ip_data),
252
           .p_srdy (p_srdy), .p_drdy (p_drdy),
253
           .p_data (p_data));
254
      end // else: !if(commit == 1)
255 2 ghutchis
  endgenerate
256
 
257
endmodule // it_fifo

powered by: WebSVN 2.1.0

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