Created
May 30, 2016 14:23
-
-
Save upa/0709fd6a8d479b0c3110b97c8b69c2d1 to your computer and use it in GitHub Desktop.
damepo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// fthash.v | |
// embedded sum of src ip and first half of dst ip to src MAC 8 bit | |
module one_port #( | |
// Master AXI Stream Data width | |
parameter C_M_AXIS_DATA_WIDTH=256, | |
parameter C_M_AXIS_TUSER_WIDTH=128, | |
parameter C_S_AXIS_DATA_WIDTH=256, | |
parameter C_S_AXIS_TUSER_WIDTH=128, | |
parameter SRC_PORT_POS=16, | |
parameter DST_PORT_POS=24 | |
) ( | |
// Global ports | |
input axis_aclk, | |
input axis_resetn, | |
// Master Stream Ports (Output) | |
output reg [C_M_AXIS_DATA_WIDTH - 1:0] m_axis_tdata, | |
output reg [(C_M_AXIS_DATA_WIDTH / 8) - 1:0] m_axis_tkeep, | |
output reg [C_M_AXIS_TUSER_WIDTH - 1:0] m_axis_tuser, | |
output reg m_axis_tvalid, | |
output reg m_axis_tlast, | |
input wire m_axis_tready, | |
// Slave Stream Port (Input) | |
input wire [C_S_AXIS_DATA_WIDTH - 1:0] s_axis_tdata, | |
input wire [(C_S_AXIS_DATA_WIDTH / 8) - 1:0] s_axis_tkeep, | |
input wire [C_S_AXIS_TUSER_WIDTH - 1:0] s_axis_tuser, | |
input wire s_axis_tvalid, | |
input wire s_axis_tlast, | |
output wire s_axis_tready | |
); | |
wire [C_M_AXIS_TUSER_WIDTH-1:0] tuser_fifo; | |
wire [C_M_AXIS_DATA_WIDTH-1:0] tdata_fifo; | |
wire [(C_M_AXIS_DATA_WIDTH / 8) - 1:0] tkeep_fifo; | |
wire tlast_fifo; | |
reg [C_M_AXIS_TUSER_WIDTH-1:0] tuser_buf0, tuser_buf1; | |
reg [C_M_AXIS_DATA_WIDTH-1:0] tdata_buf0, tdata_buf1; | |
reg [(C_M_AXIS_DATA_WIDTH / 8) - 1:0] tkeep_buf0, tkeep_buf1; | |
reg tlast_buf0, tlast_buf1; | |
reg [C_M_AXIS_TUSER_WIDTH-1:0] tuser_fifo_next, tuser_buf0_next, tuser_buf1_next; | |
reg [C_M_AXIS_DATA_WIDTH-1:0] tdata_fifo_next, tdata_buf0_next, tdata_buf1_next; | |
reg [(C_M_AXIS_DATA_WIDTH / 8) - 1:0] tkeep_fifo_next, tkeep_buf0_next, tkeep_buf1_next; | |
reg tlast_fifo_next, tlast_buf0_next, tlast_buf1_next; | |
wire nearly_full_recvfifo; | |
wire empty_recvfifo; | |
wire rd_en_recvfifo; | |
fallthrough_small_fifo #( | |
.WIDTH(C_S_AXIS_DATA_WIDTH + C_S_AXIS_DATA_WIDTH/8 + C_S_AXIS_TUSER_WIDTH + 1), | |
.MAX_DEPTH_BITS (4) | |
) recv_fifo ( | |
.din ({s_axis_tlast, s_axis_tuser, s_axis_tkeep, s_axis_tdata}), | |
.dout ({tlast_fifo, tuser_fifo, tkeep_fifo, tdata_fifo}), | |
.wr_en (s_axis_tvalid && ~nearly_full_recvfifo), | |
.rd_en (rd_en_recvfifo), | |
.nearly_full (nearly_full_recvfifo), | |
.prog_full (), | |
.empty (empty_recvfifo), | |
.reset (~axis_resetn), | |
.clk (axis_aclk) | |
); | |
/* | |
* FSM state machine | |
*/ | |
localparam DATA0 = 2'd0, | |
DATA1 = 2'd1, | |
DATA2 = 2'd2, | |
IN_PACKET = 2'd3; | |
reg [1:0] state; | |
reg [1:0] state_next; | |
assign s_axis_tready = !nearly_full_recvfifo; | |
assign rd_en_recvfifo = !empty_recvfifo && | |
(state == DATA0 || m_axis_tready); | |
// In DATA0 | |
localparam SRCMAC_POS = 48; | |
localparam ETHTYPE_POS = 96; | |
localparam IPPROTO_POS = 184; | |
// In DATA1 | |
localparam SRCIP_POS = 208; | |
localparam DSTIP_POS = 240; | |
localparam DSTIP_POS_SECOND = 0; | |
// In DATA2 | |
localparam SRCPORT_POS = 16; | |
localparam DSTPORT_POS = 32; | |
// Triger Parameter | |
localparam ETHTYPE_IP = 16'h0008; | |
localparam IPPROTO_UDP = 8'h11; | |
localparam IPPROTO_TCP = 8'h06; | |
assign trig_fthash = | |
(tdata_fifo_next[ETHTYPE_POS+15:ETHTYPE_POS] == ETHTYPE_IP) && | |
(tdata_fifo_next[IPPROTO_POS+7:IPPROTO_POS] == IPPROTO_UDP || | |
tdata_fifo_next[IPPROTO_POS+7:IPPROTO_POS] == IPPROTO_TCP); | |
wire [15:0] debug_eth = tdata_buf0[ETHTYPE_POS+15:ETHTYPE_POS]; | |
wire [7:0] debug_ip = tdata_buf0[IPPROTO_POS+7:IPPROTO_POS]; | |
// trig_fthash means IPv4 TCP or UDP packet | |
always @ (*) begin | |
state_next = state; | |
case (state) | |
DATA0: begin | |
m_axis_tvalid = 0; | |
if (rd_en_recvfifo) begin | |
tuser_fifo_next = tuser_fifo; | |
tdata_fifo_next = tdata_fifo; | |
tkeep_fifo_next = tkeep_fifo; | |
tlast_fifo_next = tlast_fifo; | |
tuser_buf0_next = tuser_buf0; | |
tdata_buf0_next = tdata_buf0; | |
tkeep_buf0_next = tkeep_buf0; | |
tlast_buf0_next = tlast_buf0; | |
tuser_buf1_next = tuser_buf1; | |
tdata_buf1_next = tdata_buf1; | |
tkeep_buf1_next = tkeep_buf1; | |
tlast_buf1_next = tlast_buf1; | |
state_next = DATA1; | |
end | |
end | |
DATA1: begin | |
m_axis_tvalid = 0; | |
if (rd_en_recvfifo) begin | |
tuser_fifo_next = tuser_fifo; | |
tdata_fifo_next = tdata_fifo; | |
tkeep_fifo_next = tkeep_fifo; | |
tlast_fifo_next = tlast_fifo; | |
tuser_buf0_next = tuser_buf0; | |
tdata_buf0_next = tdata_buf0; | |
tkeep_buf0_next = tkeep_buf0; | |
tlast_buf0_next = tlast_buf0; | |
tuser_buf1_next = tuser_buf1; | |
tdata_buf1_next = tdata_buf1; | |
tkeep_buf1_next = tkeep_buf1; | |
tlast_buf1_next = tlast_buf1; | |
state_next = DATA2; | |
end | |
end | |
DATA2: begin | |
m_axis_tvalid = 0; | |
if (rd_en_recvfifo) begin | |
tuser_fifo_next = tuser_fifo; | |
tdata_fifo_next = tdata_fifo; | |
tkeep_fifo_next = tkeep_fifo; | |
tlast_fifo_next = tlast_fifo; | |
tuser_buf0_next = tuser_buf0; | |
tdata_buf0_next = tdata_buf0; | |
tkeep_buf0_next = tkeep_buf0; | |
tlast_buf0_next = tlast_buf0; | |
tuser_buf1_next = tuser_buf1; | |
tdata_buf1_next = tdata_buf1; | |
tkeep_buf1_next = tkeep_buf1; | |
tlast_buf1_next = tlast_buf1; | |
//if (m_axis_tready) | |
// m_axis_tvalid = 1; | |
if (trig_fthash) begin | |
tdata_buf1_next[SRCMAC_POS+07:SRCMAC_POS+00] = 8'h52; | |
tdata_buf1_next[SRCMAC_POS+15:SRCMAC_POS+08] = 8'h54; | |
tdata_buf1_next[SRCMAC_POS+23:SRCMAC_POS+16] = 8'h5e; | |
tdata_buf1_next[SRCMAC_POS+31:SRCMAC_POS+24] = 8'hBE; | |
tdata_buf1_next[SRCMAC_POS+39:SRCMAC_POS+32] = 8'hEF; | |
tdata_buf1_next[SRCMAC_POS+47:SRCMAC_POS+40] = | |
tdata_buf0_next[SRCIP_POS+07:SRCIP_POS+00] ^ | |
tdata_buf0_next[SRCIP_POS+23:SRCIP_POS+16] ^ | |
tdata_buf0_next[SRCIP_POS+31:SRCIP_POS+24] ^ | |
tdata_buf0_next[DSTIP_POS+07:DSTIP_POS+00] ^ | |
tdata_buf0_next[DSTIP_POS+15:DSTIP_POS+08] ^ | |
tdata_fifo_next[DSTIP_POS_SECOND+07:DSTIP_POS_SECOND+00] ^ | |
tdata_fifo_next[DSTIP_POS_SECOND+15:DSTIP_POS_SECOND+08] ^ | |
tdata_fifo_next[SRCPORT_POS+07:SRCPORT_POS+00] ^ | |
tdata_fifo_next[SRCPORT_POS+15:SRCPORT_POS+08] ^ | |
tdata_fifo_next[DSTPORT_POS+07:DSTPORT_POS+00] ^ | |
tdata_fifo_next[DSTPORT_POS+15:DSTPORT_POS+08]; | |
end | |
end | |
if (m_axis_tready) begin | |
state_next = IN_PACKET; | |
end | |
end | |
IN_PACKET: begin | |
m_axis_tvalid = 0; | |
if (m_axis_tready) begin | |
m_axis_tvalid = 1; | |
tuser_fifo_next = tuser_fifo; | |
tdata_fifo_next = tdata_fifo; | |
tkeep_fifo_next = tkeep_fifo; | |
tlast_fifo_next = tlast_fifo; | |
tuser_buf0_next = tuser_buf0; | |
tdata_buf0_next = tdata_buf0; | |
tkeep_buf0_next = tkeep_buf0; | |
tlast_buf0_next = tlast_buf0; | |
tuser_buf1_next = tuser_buf1; | |
tdata_buf1_next = tdata_buf1; | |
tkeep_buf1_next = tkeep_buf1; | |
tlast_buf1_next = tlast_buf1; | |
end | |
if(m_axis_tlast & m_axis_tvalid & m_axis_tready) begin | |
state_next = DATA0; | |
end | |
end | |
endcase | |
end | |
always @(posedge axis_aclk) begin | |
if(~axis_resetn) begin | |
state <= DATA0; | |
tuser_buf0 <= 0; | |
tdata_buf0 <= 0; | |
tkeep_buf0 <= 0; | |
tlast_buf0 <= 0; | |
tuser_buf1 <= 0; | |
tdata_buf1 <= 0; | |
tkeep_buf1 <= 0; | |
tlast_buf1 <= 0; | |
m_axis_tuser <= 0; | |
m_axis_tdata <= 0; | |
m_axis_tkeep <= 0; | |
m_axis_tlast <= 0; | |
end else begin | |
state <= state_next; | |
if (rd_en_recvfifo) begin | |
tuser_buf0 <= tuser_fifo_next; | |
tdata_buf0 <= tdata_fifo_next; | |
tkeep_buf0 <= tkeep_fifo_next; | |
tlast_buf0 <= tlast_fifo_next; | |
tuser_buf1 <= tuser_buf0_next; | |
tdata_buf1 <= tdata_buf0_next; | |
tkeep_buf1 <= tkeep_buf0_next; | |
tlast_buf1 <= tlast_buf0_next; | |
m_axis_tuser <= tuser_buf1_next; | |
m_axis_tdata <= tdata_buf1_next; | |
m_axis_tkeep <= tkeep_buf1_next; | |
m_axis_tlast <= tlast_buf1_next; | |
end | |
end | |
end | |
endmodule |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment