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

Subversion Repositories srdydrdy_lib

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/srdydrdy_lib/trunk/examples/bridge/rtl/fib_lookup_fsm.v
0,0 → 1,146
module fib_lookup_fsm
(/*AUTOARG*/
// Outputs
lpp_drdy, ft_wdata, ft_rd_n, ft_wr_n, ft_addr, lout_data, lout_srdy,
// Inputs
clk, reset, lpp_data, lpp_srdy, ft_rdata, lout_drdy
);
 
input clk, reset;
input [`PAR_DATA_SZ-1:0] lpp_data;
input lpp_srdy;
output reg lpp_drdy;
 
input [`FIB_ENTRY_SZ-1:0] ft_rdata;
output reg [`FIB_ENTRY_SZ-1:0] ft_wdata;
output reg ft_rd_n, ft_wr_n;
output reg [`FIB_ASZ-1:0] ft_addr;
output reg [`NUM_PORTS-1:0] lout_data;
output reg lout_srdy;
input lout_drdy;
wire [`FIB_ASZ-1:0] hf_out;
reg [47:0] hf_in;
 
wire [`NUM_PORTS-1:0] source_port_mask;
 
reg [`FIB_ASZ-1:0] init_ctr, nxt_init_ctr;
reg [4:0] state, nxt_state;
assign source_port_mask = 1 << lpp_data[`PAR_SRCPORT];
basic_hashfunc #(48, `FIB_ENTRIES) hashfunc
(
// Outputs
.hf_out (hf_out),
// Inputs
.hf_in (hf_in));
 
localparam s_idle = 0, s_da_lookup = 1, s_sa_lookup = 2,
s_init0 = 3, s_init1 = 4;
localparam ns_idle = 1, ns_da_lookup = 2, ns_sa_lookup = 4,
ns_init0 = 8, ns_init1 = 16;
always @*
begin
hf_in = 0;
nxt_state = state;
ft_rd_n = 1;
ft_wr_n = 1;
ft_addr = hf_out;
lout_data = 0;
lout_srdy = 0;
lpp_drdy = 0;
nxt_init_ctr = init_ctr;
case (1'b1)
state[s_idle] :
begin
// DA lookup
if (lpp_data[`PAR_MACDA] & `MULTICAST)
begin
// flood the packet, don't bother to do DA lookup
lout_data = ~source_port_mask;
lout_srdy = 1;
if (lout_drdy)
nxt_state = ns_sa_lookup;
end
else if (lpp_srdy)
begin
hf_in = lpp_data[`PAR_MACDA];
ft_rd_n = 0;
nxt_state = ns_da_lookup;
end
end
 
// results from DA lookup are available this
// state. Make forwarding decision at this
// point.
state[s_da_lookup] :
begin
// no match, flood packet
if (ft_rdata[`FIB_AGE] == 0)
begin
lout_data = ~source_port_mask;
end
else
begin
lout_data = 1 << ft_rdata[`FIB_PORT];
end
lout_srdy = 1;
if (lout_drdy)
nxt_state = ns_sa_lookup;
end // case: state[s_da_lookup]
 
// blind write out MACSA to FIB table
// will bump out current occupant and update
state[s_sa_lookup] :
begin
ft_wr_n = 0;
hf_in = lpp_data[`PAR_MACSA];
ft_wdata[`FIB_MACADDR] = lpp_data[`PAR_MACSA];
ft_wdata[`FIB_AGE] = `FIB_MAX_AGE;
ft_wdata[`FIB_PORT] = lpp_data[`PAR_SRCPORT];
nxt_state = ns_idle;
lpp_drdy = 1;
end
 
state[s_init0] :
begin
nxt_init_ctr = 0;
nxt_state = ns_init1;
end
 
state[s_init1] :
begin
nxt_init_ctr = init_ctr + 1;
ft_wr_n = 0;
ft_addr = init_ctr;
ft_wdata = 0;
if (ft_addr == (`FIB_ENTRIES-1))
nxt_state = ns_idle;
end
 
default :
nxt_state = ns_idle;
endcase // case (1'b1)
end // always @ *
always @(posedge clk)
begin
if (reset)
begin
init_ctr <= #1 0;
state <= #1 ns_init0;
end
else
begin
init_ctr <= #1 nxt_init_ctr;
state <= #1 nxt_state;
end
end
 
endmodule // fib_lookup_fsm
/srdydrdy_lib/trunk/examples/bridge/rtl/basic_hashfunc.v
0,0 → 1,60
/*
* Simple parameterized hash function
*
* Takes an input item and folds it back upon itself using xor
* as a reduction function. Works only for hash tables with
* a natural power of 2.
*/
module basic_hashfunc
#(parameter input_sz=48,
parameter table_sz=1024,
parameter fsz=clogb2(table_sz))
(
input [input_sz-1:0] hf_in,
output reg [fsz-1:0] hf_out);
 
//localparam folds = (input_sz/fsz) + ( (input_sz%fsz) == 0) ? 0 : 1;
localparam folds = num_folds(input_sz, fsz);
 
wire [folds*fsz-1:0] tmp_array;
assign tmp_array = hf_in;
integer f, b;
 
always @*
begin
for (b=0; b<fsz; b=b+1)
begin
hf_out[b] = 0;
for (f=0; f<folds; f=f+1)
hf_out[b] = hf_out[b]^tmp_array[f*fsz+b];
end
end
 
function integer num_folds;
input [31:0] in_sz;
input [31:0] func_sz;
integer tmp_in_sz;
begin
num_folds = 0;
tmp_in_sz = in_sz;
while (tmp_in_sz > 0)
begin
tmp_in_sz = tmp_in_sz - func_sz;
num_folds = num_folds + 1;
end
end
endfunction
function integer clogb2;
input [31:0] depth;
integer i;
begin
i = depth;
for (clogb2=0; i>0; clogb2=clogb2+1)
i = i >> 1;
end
endfunction // for
endmodule // hashfunc
/srdydrdy_lib/trunk/examples/bridge/rtl/bridge.vh
0,0 → 1,28
 
// Address size for number of ports. Default value 4,
// which will allow design to scale up to 16 ports
`define PORT_ASZ 4
 
// We will have only 4 ports in our sample design
`define NUM_PORTS 4
 
// Data structure from parser to FIB. Contains MAC DA,
// MAC SA, and source port
`define PAR_DATA_SZ (48+48+4)
`define PAR_MACDA 47:0
`define PAR_MACSA 95:48
`define PAR_SRCPORT 99:96
 
// number of entries in FIB table
`define FIB_ENTRIES 256
`define FIB_ASZ $clog2(`FIB_ENTRIES)
 
// FIB entry definition
`define FIB_ENTRY_SZ 60
`define FIB_MACADDR 47:0 // MAC address
`define FIB_AGE 55:48 // 8 bit age counter
`define FIB_PORT 59:56 // associated port
 
`define FIB_MAX_AGE 255 // maximum value of age timer
 
`define MULTICAST 48'h0100000000 // multicast bit
/srdydrdy_lib/trunk/examples/bridge/rtl/fib_lookup.v
0,0 → 1,118
// Inputs are PPI (port parser input)
// Outputs are FLO (FIB lookup out)
 
module fib_lookup
(/*AUTOARG*/
// Outputs
ppi_drdy, flo_data, flo_srdy,
// Inputs
ppi_srdy, clk, reset, ppi_data, flo_drdy
);
 
input clk;
input reset;
 
input [`PAR_DATA_SZ-1:0] ppi_data;
output [`NUM_PORTS-1:0] flo_data;
output [`NUM_PORTS-1:0] flo_srdy;
input [`NUM_PORTS-1:0] flo_drdy;
/*AUTOINPUT*/
// Beginning of automatic inputs (from unused autoinst inputs)
input ppi_srdy; // To port_parse_in of sd_input.v
// End of automatics
/*AUTOOUTPUT*/
// Beginning of automatic outputs (from unused autoinst outputs)
output ppi_drdy; // From port_parse_in of sd_input.v
// End of automatics
 
wire [`FIB_ENTRY_SZ-1:0] ft_rdata;
wire [`PAR_DATA_SZ-1:0] lpp_data;
/*AUTOWIRE*/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
wire [`FIB_ASZ-1:0] ft_addr; // From fsm0 of fib_lookup_fsm.v
wire ft_rd_n; // From fsm0 of fib_lookup_fsm.v
wire [`FIB_ENTRY_SZ-1:0] ft_wdata; // From fsm0 of fib_lookup_fsm.v
wire ft_wr_n; // From fsm0 of fib_lookup_fsm.v
wire [`NUM_PORTS-1:0] lout_data; // From fsm0 of fib_lookup_fsm.v
wire lout_drdy; // From fib_res_out of sd_mirror.v
wire lout_srdy; // From fsm0 of fib_lookup_fsm.v
wire lpp_drdy; // From fsm0 of fib_lookup_fsm.v
wire lpp_srdy; // From port_parse_in of sd_input.v
// End of automatics
/* sd_input AUTO_TEMPLATE
(
.c_\(.*\) (ppi_\1),
.ip_\(.*\) (lpp_\1),
);
*/
sd_input #(`PAR_DATA_SZ) port_parse_in
(/*AUTOINST*/
// Outputs
.c_drdy (ppi_drdy), // Templated
.ip_srdy (lpp_srdy), // Templated
.ip_data (lpp_data), // Templated
// Inputs
.clk (clk),
.reset (reset),
.c_srdy (ppi_srdy), // Templated
.c_data (ppi_data), // Templated
.ip_drdy (lpp_drdy)); // Templated
/* behave1p_mem AUTO_TEMPLATE
(
.d_out (ft_rdata),
.d_in (ft_wdata),
.clk (clk),
.\(.*\) (ft_\1),
);
*/
behave1p_mem #(`FIB_ENTRIES, `FIB_ENTRY_SZ) fib_mem
(/*AUTOINST*/
// Outputs
.d_out (ft_rdata), // Templated
// Inputs
.wr_n (ft_wr_n), // Templated
.rd_n (ft_rd_n), // Templated
.clk (clk), // Templated
.d_in (ft_wdata), // Templated
.addr (ft_addr)); // Templated
 
fib_lookup_fsm fsm0
(/*AUTOINST*/
// Outputs
.lpp_drdy (lpp_drdy),
.ft_wdata (ft_wdata[`FIB_ENTRY_SZ-1:0]),
.ft_rd_n (ft_rd_n),
.ft_wr_n (ft_wr_n),
.ft_addr (ft_addr[`FIB_ASZ-1:0]),
.lout_data (lout_data[`NUM_PORTS-1:0]),
.lout_srdy (lout_srdy),
// Inputs
.clk (clk),
.reset (reset),
.lpp_data (lpp_data[`PAR_DATA_SZ-1:0]),
.lpp_srdy (lpp_srdy),
.ft_rdata (ft_rdata[`FIB_ENTRY_SZ-1:0]),
.lout_drdy (lout_drdy));
 
/* sd_mirror AUTO_TEMPLATE
(
.c_\(.*\) (lout_\1),
.p_\(.*\) (flo_\1),
)
*/
sd_mirror #(`NUM_PORTS, `NUM_PORTS) fib_res_out
(/*AUTOINST*/
// Outputs
.c_drdy (lout_drdy), // Templated
.p_srdy (flo_srdy), // Templated
.p_data (flo_data), // Templated
// Inputs
.clk (clk),
.reset (reset),
.c_srdy (lout_srdy), // Templated
.c_data (lout_data), // Templated
.p_drdy (flo_drdy)); // Templated
 
endmodule // fib_lookup

powered by: WebSVN 2.1.0

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