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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [examples/] [bridge/] [rtl/] [fib_lookup_fsm.v] - Blame information for rev 15

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

Line No. Rev Author Line
1 4 ghutchis
module fib_lookup_fsm
2
  (/*AUTOARG*/
3
  // Outputs
4 5 ghutchis
  lpp_drdy, ft_wdata, ft_rd_en, ft_wr_en, ft_addr, lout_data,
5
  lout_srdy, lout_dst_vld,
6 4 ghutchis
  // Inputs
7
  clk, reset, lpp_data, lpp_srdy, ft_rdata, lout_drdy
8
  );
9
 
10
  input clk, reset;
11
 
12
  input [`PAR_DATA_SZ-1:0] lpp_data;
13
  input                    lpp_srdy;
14
  output reg               lpp_drdy;
15
 
16
  input [`FIB_ENTRY_SZ-1:0]       ft_rdata;
17
  output reg [`FIB_ENTRY_SZ-1:0]  ft_wdata;
18 5 ghutchis
  output reg                      ft_rd_en, ft_wr_en;
19 4 ghutchis
  output reg [`FIB_ASZ-1:0]       ft_addr;
20
 
21
  output reg [`NUM_PORTS-1:0]     lout_data;
22
  output reg                      lout_srdy;
23
  input                           lout_drdy;
24 5 ghutchis
  output [`NUM_PORTS-1:0]         lout_dst_vld;
25 4 ghutchis
 
26
  wire [`FIB_ASZ-1:0]             hf_out;
27
  reg [47:0]                      hf_in;
28
 
29
  wire [`NUM_PORTS-1:0]           source_port_mask;
30
 
31
  reg [`FIB_ASZ-1:0]              init_ctr, nxt_init_ctr;
32
  reg [4:0]                       state, nxt_state;
33
 
34
  assign source_port_mask = 1 << lpp_data[`PAR_SRCPORT];
35
 
36
  basic_hashfunc #(48, `FIB_ENTRIES) hashfunc
37
    (
38
     // Outputs
39
     .hf_out                            (hf_out),
40
     // Inputs
41
     .hf_in                             (hf_in));
42
 
43
  localparam s_idle = 0, s_da_lookup = 1, s_sa_lookup = 2,
44
    s_init0 = 3, s_init1 = 4;
45
  localparam ns_idle = 1, ns_da_lookup = 2, ns_sa_lookup = 4,
46
    ns_init0 = 8, ns_init1 = 16;
47 5 ghutchis
 
48
  // send all results back to their originating port
49
  assign lout_dst_vld = source_port_mask;
50 9 ghutchis
 
51
  reg                             amux;
52
 
53
  always @*
54
    begin
55
      case (amux)
56
 
57
        1 : ft_addr = init_ctr;
58
      endcase // case (amux)
59
    end
60 4 ghutchis
 
61
  always @*
62
    begin
63
      hf_in = 0;
64
      nxt_state = state;
65 5 ghutchis
      ft_rd_en = 0;
66
      ft_wr_en = 0;
67 9 ghutchis
      amux = 0;
68 4 ghutchis
      lout_data = 0;
69
      lout_srdy = 0;
70
      lpp_drdy = 0;
71
      nxt_init_ctr = init_ctr;
72
 
73
      case (1'b1)
74
        state[s_idle] :
75
          begin
76
            // DA lookup
77 15 ghutchis
            if (lpp_srdy)
78 4 ghutchis
              begin
79 15 ghutchis
                if (lpp_data[`PAR_MACDA] & `MULTICAST)
80
                  begin
81
                    // flood the packet, don't bother to do DA lookup
82
                    lout_data = ~source_port_mask;
83
                    lout_srdy = 1;
84
                    if (lout_drdy)
85
                      nxt_state = ns_sa_lookup;
86
                  end
87
                else
88
                  begin
89
                    hf_in = lpp_data[`PAR_MACDA];
90
                    ft_rd_en = 1;
91
                    nxt_state = ns_da_lookup;
92
                  end // else: !if(lpp_data[`PAR_MACDA] & `MULTICAST)
93 4 ghutchis
              end
94
          end
95
 
96
        // results from DA lookup are available this
97
        // state.  Make forwarding decision at this
98
        // point.
99
        state[s_da_lookup] :
100
          begin
101
            // no match, flood packet
102
            if (ft_rdata[`FIB_AGE] == 0)
103
              begin
104
                lout_data = ~source_port_mask;
105
              end
106
            else
107
              begin
108 13 ghutchis
                lout_data = (1 << ft_rdata[`FIB_PORT]) & ~source_port_mask;
109 4 ghutchis
              end
110
 
111
            lout_srdy = 1;
112
            if (lout_drdy)
113
              nxt_state = ns_sa_lookup;
114
          end // case: state[s_da_lookup]
115
 
116
        // blind write out MACSA to FIB table
117
        // will bump out current occupant and update
118
        state[s_sa_lookup] :
119
          begin
120 5 ghutchis
            ft_wr_en = 1;
121 4 ghutchis
            hf_in = lpp_data[`PAR_MACSA];
122
            ft_wdata[`FIB_MACADDR] = lpp_data[`PAR_MACSA];
123
            ft_wdata[`FIB_AGE]  = `FIB_MAX_AGE;
124
            ft_wdata[`FIB_PORT] = lpp_data[`PAR_SRCPORT];
125
            nxt_state = ns_idle;
126
            lpp_drdy = 1;
127
          end
128
 
129
        state[s_init0] :
130
          begin
131
            nxt_init_ctr = 0;
132
            nxt_state = ns_init1;
133
          end
134
 
135
        state[s_init1] :
136
          begin
137
            nxt_init_ctr = init_ctr + 1;
138 5 ghutchis
            ft_wr_en = 1;
139 9 ghutchis
            amux = 1;
140 4 ghutchis
            ft_wdata = 0;
141 9 ghutchis
            if (init_ctr == (`FIB_ENTRIES-1))
142 4 ghutchis
              nxt_state = ns_idle;
143
          end
144
 
145
        default :
146
          nxt_state = ns_idle;
147
      endcase // case (1'b1)
148
    end // always @ *
149
 
150
  always @(posedge clk)
151
    begin
152
      if (reset)
153
        begin
154
          init_ctr <= #1 0;
155
          state    <= #1 ns_init0;
156
        end
157
      else
158
        begin
159
          init_ctr <= #1 nxt_init_ctr;
160
          state    <= #1 nxt_state;
161
        end
162
    end
163
 
164
endmodule // fib_lookup_fsm

powered by: WebSVN 2.1.0

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