Add up dest parser
This commit is contained in:
@@ -62,8 +62,8 @@ async def test_simple(dut):
|
|||||||
dut_ip = "172.0.0.2"
|
dut_ip = "172.0.0.2"
|
||||||
tb_ip = "172.0.0.1"
|
tb_ip = "172.0.0.1"
|
||||||
|
|
||||||
dut_port = 1234
|
dut_port = 0x1234
|
||||||
tb_port = 5678
|
tb_port = 0x5678
|
||||||
|
|
||||||
tb_mac = "02:00:00:11:22:33"
|
tb_mac = "02:00:00:11:22:33"
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ async def test_simple(dut):
|
|||||||
|
|
||||||
|
|
||||||
dut_seq = tcp_packet.seq
|
dut_seq = tcp_packet.seq
|
||||||
tb_seq = 0x12345678
|
tb_seq = 0x11111111
|
||||||
|
|
||||||
tcp_synack = Ether(dst=dut_mac, src=tb_mac)
|
tcp_synack = Ether(dst=dut_mac, src=tb_mac)
|
||||||
tcp_synack /= IP(src=tb_ip, dst=dut_ip)
|
tcp_synack /= IP(src=tb_ip, dst=dut_ip)
|
||||||
|
|||||||
@@ -15,4 +15,6 @@ src/tcp_stream.sv
|
|||||||
src/tcp.sv
|
src/tcp.sv
|
||||||
src/eth_wrapper.sv
|
src/eth_wrapper.sv
|
||||||
src/ip_arb_mux_wrapper.sv
|
src/ip_arb_mux_wrapper.sv
|
||||||
src/ip_demux_wrapper.sv
|
src/ip_demux_wrapper.sv
|
||||||
|
src/tcp_dest_decap.sv
|
||||||
|
src/tcp_parser.sv
|
||||||
@@ -31,9 +31,9 @@ module network_processor #(
|
|||||||
`define PROTO_TCP 8'h6
|
`define PROTO_TCP 8'h6
|
||||||
`define PROTO_UDP 8'h11
|
`define PROTO_UDP 8'h11
|
||||||
|
|
||||||
localparam ICMP_IDX = 0;
|
localparam ICMP_IDX = 2;
|
||||||
localparam UDP_IDX = 1;
|
localparam UDP_IDX = 1;
|
||||||
localparam TCP_IDX = 2;
|
localparam TCP_IDX = 0;
|
||||||
|
|
||||||
localparam MAC_DATA_WIDTH = 8;
|
localparam MAC_DATA_WIDTH = 8;
|
||||||
localparam AXIS_DATA_WIDTH = 8;
|
localparam AXIS_DATA_WIDTH = 8;
|
||||||
|
|||||||
@@ -65,11 +65,9 @@ localparam DEST_WIDTH = 8;
|
|||||||
localparam ID_WIDTH = 8;
|
localparam ID_WIDTH = 8;
|
||||||
|
|
||||||
ip_intf #(.DATA_WIDTH(8)) tcp_stream_tx_ip [NUM_TCP]();
|
ip_intf #(.DATA_WIDTH(8)) tcp_stream_tx_ip [NUM_TCP]();
|
||||||
ip_intf #(.DATA_WIDTH(8)) tcp_rx_ip [NUM_TCP]();
|
ip_intf #(.DATA_WIDTH(8)) tcp_delayed_rx_ip();
|
||||||
ip_intf #(.DATA_WIDTH(8)) tcp_stream_rx_ip [NUM_TCP]();
|
ip_intf #(.DATA_WIDTH(8)) tcp_stream_rx_ip [NUM_TCP]();
|
||||||
|
|
||||||
axis_intf #(.DATA_WIDTH(8)) tcp_stream_rx_axis [NUM_TCP]();
|
|
||||||
|
|
||||||
axil_intf m2s_stream_axil[NUM_TCP]();
|
axil_intf m2s_stream_axil[NUM_TCP]();
|
||||||
axil_intf s2m_stream_axil[NUM_TCP]();
|
axil_intf s2m_stream_axil[NUM_TCP]();
|
||||||
|
|
||||||
@@ -186,9 +184,48 @@ ip_arb_mux_wrapper #(
|
|||||||
.m_ip (m_ip)
|
.m_ip (m_ip)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// dest decap
|
||||||
|
logic [15:0] tcp_dest;
|
||||||
|
logic tcp_dest_valid;
|
||||||
|
|
||||||
|
tcp_dest_decap u_tcp_dest_decap(
|
||||||
|
.i_clk (i_clk),
|
||||||
|
.i_rst (i_rst),
|
||||||
|
|
||||||
|
.s_ip (s_ip),
|
||||||
|
.m_ip (tcp_delayed_rx_ip),
|
||||||
|
|
||||||
|
.o_tcp_dest (tcp_dest),
|
||||||
|
.o_tcp_dest_valid(tcp_dest_valid)
|
||||||
|
);
|
||||||
|
|
||||||
// rx_stream demux (ip)
|
// rx_stream demux (ip)
|
||||||
|
|
||||||
|
logic [$clog2(NUM_TCP)-1:0] tcp_demux_sel;
|
||||||
|
logic [15:0] tcp_dests [NUM_TCP];
|
||||||
|
|
||||||
|
always_comb begin : TCP_DEST_SEL
|
||||||
|
for (int i = 0; i < NUM_TCP; i++) begin
|
||||||
|
if (tcp_dest == tcp_dests[i]) begin
|
||||||
|
tcp_demux_sel = i;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ip_demux_wrapper #(
|
||||||
|
.M_COUNT(NUM_TCP)
|
||||||
|
) u_ip_demux (
|
||||||
|
.clk (i_clk),
|
||||||
|
.rst (i_rst),
|
||||||
|
|
||||||
|
.s_ip (tcp_delayed_rx_ip),
|
||||||
|
.m_ip (tcp_stream_rx_ip),
|
||||||
|
|
||||||
|
.enable (tcp_dest_valid),
|
||||||
|
.drop ('0),
|
||||||
|
.select (tcp_demux_sel)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
generate
|
generate
|
||||||
|
|
||||||
@@ -223,6 +260,8 @@ generate
|
|||||||
.s_cpuif_wr_ack (tcp_hwif_in.tcp_streams[i].wr_ack),
|
.s_cpuif_wr_ack (tcp_hwif_in.tcp_streams[i].wr_ack),
|
||||||
.s_cpuif_wr_err (),
|
.s_cpuif_wr_err (),
|
||||||
|
|
||||||
|
.o_tcp_port (tcp_dests[i]),
|
||||||
|
|
||||||
.s_ip_rx (tcp_stream_rx_ip[i]),
|
.s_ip_rx (tcp_stream_rx_ip[i]),
|
||||||
.m_ip_tx (tcp_stream_tx_ip[i]),
|
.m_ip_tx (tcp_stream_tx_ip[i]),
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,132 @@
|
|||||||
|
module tcp_dest_decap (
|
||||||
|
input i_clk,
|
||||||
|
input i_rst,
|
||||||
|
|
||||||
|
ip_intf.SLAVE s_ip,
|
||||||
|
ip_intf.MASTER m_ip,
|
||||||
|
|
||||||
|
output wire [15:0] o_tcp_dest,
|
||||||
|
output wire o_tcp_dest_valid
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
logic [15:0] tcp_dest, tcp_dest_next;
|
||||||
|
logic [31:0] pipe, pipe_next;
|
||||||
|
logic [3:0] pipe_valid, pipe_valid_next;
|
||||||
|
logic [3:0] pipe_last, pipe_last_next;
|
||||||
|
|
||||||
|
|
||||||
|
enum logic [1:0] {PORTS, PASSTHROUGH} state, state_next;
|
||||||
|
logic [1:0] counter, counter_next;
|
||||||
|
|
||||||
|
|
||||||
|
// We don't need the mac addresses or the ethertype.
|
||||||
|
assign m_ip.eth_src_mac = '0;
|
||||||
|
assign m_ip.eth_dest_mac = '0;
|
||||||
|
assign m_ip.eth_type = '0;
|
||||||
|
|
||||||
|
assign o_tcp_dest = tcp_dest;
|
||||||
|
|
||||||
|
skidbuffer #(
|
||||||
|
.DW(160)
|
||||||
|
) u_tcp_ip_hdr_skidbuffer (
|
||||||
|
.i_clk (i_clk),
|
||||||
|
.i_reset (i_rst),
|
||||||
|
|
||||||
|
.i_valid (s_ip.ip_hdr_valid),
|
||||||
|
.o_ready (s_ip.ip_hdr_ready),
|
||||||
|
.i_data ({
|
||||||
|
s_ip.ip_version,
|
||||||
|
s_ip.ip_ihl,
|
||||||
|
s_ip.ip_dscp,
|
||||||
|
s_ip.ip_ecn,
|
||||||
|
s_ip.ip_length,
|
||||||
|
s_ip.ip_identification,
|
||||||
|
s_ip.ip_flags,
|
||||||
|
s_ip.ip_fragment_offset,
|
||||||
|
s_ip.ip_ttl,
|
||||||
|
s_ip.ip_protocol,
|
||||||
|
s_ip.ip_header_checksum,
|
||||||
|
s_ip.ip_source_ip,
|
||||||
|
s_ip.ip_dest_ip
|
||||||
|
}),
|
||||||
|
.o_valid (m_ip.ip_hdr_valid),
|
||||||
|
.i_ready (m_ip.ip_hdr_ready),
|
||||||
|
.o_data ({
|
||||||
|
m_ip.ip_version,
|
||||||
|
m_ip.ip_ihl,
|
||||||
|
m_ip.ip_dscp,
|
||||||
|
m_ip.ip_ecn,
|
||||||
|
m_ip.ip_length,
|
||||||
|
m_ip.ip_identification,
|
||||||
|
m_ip.ip_flags,
|
||||||
|
m_ip.ip_fragment_offset,
|
||||||
|
m_ip.ip_ttl,
|
||||||
|
m_ip.ip_protocol,
|
||||||
|
m_ip.ip_header_checksum,
|
||||||
|
m_ip.ip_source_ip,
|
||||||
|
m_ip.ip_dest_ip
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
always_ff @(posedge i_clk) begin
|
||||||
|
if (i_rst) begin
|
||||||
|
tcp_dest <= '0;
|
||||||
|
pipe <= '0;
|
||||||
|
pipe_valid <= '0;
|
||||||
|
pipe_last <= '0;
|
||||||
|
state <= PORTS;
|
||||||
|
counter <= '0;
|
||||||
|
end else begin
|
||||||
|
tcp_dest <= tcp_dest_next;
|
||||||
|
pipe <= pipe_next;
|
||||||
|
pipe_valid <= pipe_valid_next;
|
||||||
|
pipe_last <= pipe_last_next;
|
||||||
|
state <= state_next;
|
||||||
|
counter <= counter_next;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always_comb begin
|
||||||
|
tcp_dest_next = tcp_dest;
|
||||||
|
state_next = state;
|
||||||
|
pipe_next = pipe;
|
||||||
|
pipe_valid_next = pipe_valid;
|
||||||
|
pipe_last_next = pipe_last;
|
||||||
|
counter_next = pipe;
|
||||||
|
|
||||||
|
s_ip.ip_payload_axis_tready = '0;
|
||||||
|
|
||||||
|
case (state)
|
||||||
|
PORTS: begin
|
||||||
|
s_ip.ip_payload_axis_tready = 1;
|
||||||
|
o_tcp_dest_valid = '0;
|
||||||
|
|
||||||
|
if (s_ip.ip_payload_axis_tvalid) begin
|
||||||
|
counter_next = counter + 1;
|
||||||
|
pipe_valid_next = {pipe_valid[2:0], 1'b1};
|
||||||
|
pipe_next = {pipe_next[23:0], s_ip.ip_payload_axis_tdata};
|
||||||
|
if (counter == 2'h3) begin
|
||||||
|
state_next = PASSTHROUGH;
|
||||||
|
tcp_dest_next = pipe_next[15:0];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
PASSTHROUGH: begin
|
||||||
|
// match ready except if we have seen last, then just finish it out.
|
||||||
|
pipe_valid_next = {pipe_valid[2:0], s_ip.ip_payload_axis_tvalid};
|
||||||
|
pipe_last_next = {pipe_last[2:0], s_ip.ip_payload_axis_tlast};
|
||||||
|
pipe_next = {pipe_next[23:0], s_ip.ip_payload_axis_tdata};
|
||||||
|
|
||||||
|
s_ip.ip_payload_axis_tready = m_ip.ip_payload_axis_tready;
|
||||||
|
m_ip.ip_payload_axis_tvalid = pipe_valid[3];
|
||||||
|
m_ip.ip_payload_axis_tlast = pipe_last[3];
|
||||||
|
m_ip.ip_payload_axis_tdata = pipe[31:24];
|
||||||
|
|
||||||
|
o_tcp_dest_valid = '1;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
module tcp_parser(
|
||||||
|
input wire i_clk,
|
||||||
|
input wire i_rst,
|
||||||
|
|
||||||
|
ip_intf.SLAVE s_ip
|
||||||
|
);
|
||||||
|
|
||||||
|
assign s_ip.ip_hdr_ready = '1;
|
||||||
|
assign s_ip.ip_payload_axis_tready = '1;
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -20,6 +20,8 @@ module tcp_stream #(
|
|||||||
output wire s_cpuif_wr_ack,
|
output wire s_cpuif_wr_ack,
|
||||||
output wire s_cpuif_wr_err,
|
output wire s_cpuif_wr_err,
|
||||||
|
|
||||||
|
output logic [15:0] o_tcp_port,
|
||||||
|
|
||||||
ip_intf.SLAVE s_ip_rx,
|
ip_intf.SLAVE s_ip_rx,
|
||||||
ip_intf.MASTER m_ip_tx,
|
ip_intf.MASTER m_ip_tx,
|
||||||
|
|
||||||
@@ -49,6 +51,7 @@ logic w_tx_packet_done;
|
|||||||
|
|
||||||
tcp_pkg::rx_msg_t rx_msg;
|
tcp_pkg::rx_msg_t rx_msg;
|
||||||
|
|
||||||
|
assign o_tcp_port = hwif_out.source_port.d.value;
|
||||||
|
|
||||||
|
|
||||||
tcp_stream_regs u_tcp_stream_regs (
|
tcp_stream_regs u_tcp_stream_regs (
|
||||||
@@ -192,6 +195,12 @@ tcp_packet_generator u_tcp_packet_generator (
|
|||||||
);
|
);
|
||||||
|
|
||||||
// parser
|
// parser
|
||||||
|
tcp_parser u_tcp_parser (
|
||||||
|
.i_clk (clk),
|
||||||
|
.i_rst (rst),
|
||||||
|
|
||||||
|
.s_ip (s_ip_rx)
|
||||||
|
);
|
||||||
|
|
||||||
// rx control
|
// rx control
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user