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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [examples/] [bridge/] [rtl/] [deallocator.v] - Blame information for rev 31

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 31 ghutchis
module deallocator
2
  (
3
   input          clk,
4
   input          reset,
5
 
6
   input [1:0]    port_num,
7
 
8
   // packet input from FIB
9
   input            f2d_srdy,
10
   output reg       f2d_drdy,
11
   input [`LL_PG_ASZ-1:0] f2d_data,
12
 
13
   // read link page i/f
14
   output reg         rlp_srdy,
15
   input              rlp_drdy,
16
   output [`LL_PG_ASZ-1:0]  rlp_rd_page,
17
 
18
   // read link page reply i/f
19
   input                rlpr_srdy,
20
   output reg           rlpr_drdy,
21
   input [`LL_PG_ASZ:0] rlpr_data,
22
 
23
   // page dereference interface
24
   output reg           drf_srdy,
25
   input                drf_drdy,
26
   output [`LL_PG_ASZ*2-1:0]  drf_page_list,
27
 
28
   // interface to packet buffer
29
   output  [`PBR_SZ-1:0] pbrd_data,
30
   output reg            pbrd_srdy,
31
   input                 pbrd_drdy,
32
 
33
   // return interface from packet buffer
34
   input                 pbrr_srdy,
35
   output                pbrr_drdy,
36
   input [`PFW_SZ-1:0]   pbrr_data,
37
 
38
   // i/f to distributor
39
   output               ptx_srdy,
40
   input                ptx_drdy,
41
   output [`PFW_SZ-1:0] ptx_data
42
 
43
   );
44
 
45
  reg [2:0]             state, nxt_state;
46
  reg [`LL_PG_ASZ-1:0]        start, nxt_start;
47
  reg [`LL_PG_ASZ-1:0]        cur, nxt_cur;
48
  reg [1:0]             lcount, nxt_lcount;
49
 
50
  reg                   pb_req, eop_seen, nxt_eop_seen;
51
 
52
  assign rlp_rd_page = cur;
53
  assign drf_page_list = { start, cur };
54
 
55
  assign pbrd_data[`PBR_DATA] = 0;
56
  assign pbrd_data[`PBR_ADDR] = { cur, lcount };
57
  assign pbrd_data[`PBR_WRITE] = 1'b0;
58
  assign pbrd_data[`PBR_PORT] = port_num;
59
 
60
  sd_iohalf #(.width(`PFW_SZ)) pkt_rd_buf
61
    (.clk (clk), .reset (reset),
62
 
63
     .c_srdy (pbrr_srdy),
64
     .c_drdy (pbrr_drdy),
65
     .c_data (pbrr_data),
66
 
67
     .p_srdy (ptx_srdy),
68
     .p_drdy (ptx_drdy),
69
     .p_data (ptx_data));
70
 
71
  always @(posedge clk)
72
    begin
73
      if (reset)
74
        pb_req <= 0;
75
      else
76
        begin
77
          if (ptx_srdy & ptx_drdy)
78
            pb_req <= 0;
79
          else if (pbrd_srdy & pbrd_drdy)
80
            pb_req <= 1;
81
        end
82
    end // always @ (posedge clk)
83
 
84
  localparam s_idle = 0, s_fetch = 1, s_link = 2, s_link_reply = 3,
85
    s_return = 4;
86
 
87
  always @(posedge clk)
88
    begin
89
      if (f2d_srdy & f2d_drdy)
90
        $display ("%t %m: Dealloc packet %0d", $time, f2d_data);
91
      if (drf_srdy & drf_drdy)
92
        $display ("%t %m: Returning packet (%0d,%0d)", $time, start, cur);
93
    end
94
 
95
  always @*
96
    begin
97
      f2d_drdy = 0;
98
      nxt_state = state;
99
      nxt_start = start;
100
      nxt_cur = cur;
101
      nxt_lcount = lcount;
102
      nxt_eop_seen = eop_seen;
103
      rlp_srdy = 0;
104
      rlpr_drdy = 0;
105
      drf_srdy = 0;
106
      pbrd_srdy = 0;
107
 
108
      case (state)
109
        s_idle :
110
          begin
111
            f2d_drdy = 1;
112
            if (f2d_srdy)
113
              begin
114
                nxt_start = f2d_data;
115
                nxt_cur   = f2d_data;
116
                nxt_state = s_fetch;
117
                nxt_eop_seen = 0;
118
                nxt_lcount = 0;
119
              end
120
          end
121
 
122
        // if no requests to the packet buffer are outstanding,
123
        // then dispatch another request to the packet buffer.
124
        // If this was the last request of a page then go to
125
        // link page fetch state.
126
        s_fetch :
127
          begin
128
            if (ptx_srdy & (`ANY_EOP(ptx_data[`PRW_PCC])))
129
              nxt_eop_seen = 1;
130
 
131
            if (!pb_req & !eop_seen)
132
              begin
133
                pbrd_srdy = 1;
134
                if (pbrd_drdy)
135
                  begin
136
                    nxt_lcount = lcount + 1;
137
                    if (lcount == 3)
138
                      nxt_state = s_link;
139
                  end
140
              end
141
            else if (eop_seen)
142
              nxt_state = s_link;
143
          end // case: s_fetch
144
 
145
        s_link :
146
          begin
147
            rlp_srdy = 1;
148
            if (rlp_drdy)
149
              nxt_state = s_link_reply;
150
          end
151
 
152
        s_link_reply :
153
          begin
154
            rlpr_drdy = 1;
155
            if (rlpr_srdy)
156
              begin
157
                if (rlpr_data == `LL_ENDPAGE)
158
                  nxt_state = s_return;
159
                else
160
                  begin
161
                    nxt_cur = rlpr_data;
162
                    nxt_state = s_fetch;
163
                  end
164
              end
165
          end // case: s_link_reply
166
 
167
        s_return :
168
          begin
169
            drf_srdy = 1;
170
            if (drf_drdy)
171
              nxt_state = s_idle;
172
          end
173
 
174
        default : nxt_state = s_idle;
175
      endcase // case (state)
176
    end // always @ *
177
 
178
  always @(posedge clk)
179
    begin
180
      if (reset)
181
        begin
182
          state <= s_idle;
183
          /*AUTORESET*/
184
          // Beginning of autoreset for uninitialized flops
185
          cur <= {(1+(`LL_PG_ASZ-1)){1'b0}};
186
          eop_seen <= 1'h0;
187
          lcount <= 2'h0;
188
          start <= {(1+(`LL_PG_ASZ-1)){1'b0}};
189
          // End of automatics
190
        end
191
      else
192
        begin
193
          state <= nxt_state;
194
          start <= nxt_start;
195
          cur <= nxt_cur;
196
          lcount <= nxt_lcount;
197
          eop_seen <= nxt_eop_seen;
198
        end
199
    end
200
 
201
endmodule // deallocator

powered by: WebSVN 2.1.0

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